共用方式為


繞道或類似的技術可能會導致 SQL Server 發生非預期的行為

本文說明當您搭配 SQL Server 使用第三方繞道,以及使用 SQL Server 時可能發生的問題時,Microsoft支持原則。

原始產品版本:SQL Server
原始 KB 編號: 920925

摘要

Microsoft支援遇到許多第三方產品,這些產品會使用彎道為 SQL Server 提供額外的功能。 這些通常是稽核功能。 Microsoft應用程式的第三方繞道沒有認證程式。 因此,一般來說,Microsoft強烈勸阻使用繞道。

使用繞道或類似技術來變更 SQL Server 行為的功能可能會導致下列問題:

  • 效能問題。
  • 不正確的結果。
  • 磁碟和記憶體損毀。
  • SQL Server 回應遺失。
  • 未預期的處理序終止。
  • 無法使用標準診斷,例如fn_get_sql函式和 DBCC INPUTBUFFER 命令。
  • 當您在 SQL Server 中使用記憶體內部 OLTP 數據表時,100% 的 CPU 使用率和長時間的資料庫復原時間。

當您在 SQL Server 程式中使用非Microsoft軟體,例如鏈接的伺服器、擴充程式或 COM 物件時,可能會遇到這些相同的問題。 從 DBA 檢視隱藏繞道。 若要發現繞道,您必須使用後續詳細資訊一節中所述的技術。 鏈接的伺服器、COM 對象和擴充程式具有明確的註冊和定義介面。

注意

由於繞道和缺乏已發佈介面的隱藏性質,Microsoft不提供使用繞道或類似技術之第三方功能的支持服務。 第三方負責支援自己的程式代碼,就像負責自己的連結伺服器或其他獲批准的部署一樣。

在一般疑難解答過程中,常見的作法是Microsoft支援服務要求您停用非經常性工作,以及停用或移除第三方元件和其他類似技術。 Microsoft在識別問題時,一律會嘗試減少問題的使用量。 將問題識別為與作業或第三方產品無關之後,這些作業或第三方產品可能會重新引入生產環境。

我們無意發現繞道,然後考慮不支援 SQL Server 的實例。 Microsoft承認某些實作是必要的。 不過,Microsoft要求您驗證繞道的支援性。 一家有信譽和信任的公司的繞道與病毒使用的意外繞道絕對不同。 Microsoft不保證或認證這些第三方產品,或第三方產品如何與Microsoft產品和服務互動。 相反地,第三方廠商會負責識別及信任其產品和服務。 如果您有任何關於第三方產品和服務的問題,請連絡適用的第三方。 Microsoft不負責因您使用第三方產品和服務與 SQL Server 而造成的任何問題。

其他相關資訊

繞道提供增強的功能和風險/獎勵取捨。 一般而言,在 SQL Server 中實作繞道時,會將第三方程式代碼插入進程空間中。 此活動可能會變更 SQL Server 的行為。

以下是一些範例情況和可能的副作用:

  • 傳入的網路流量 (TDS) 封包會掃描並變更。 繞道會在net_readdata網路進程線程的關鍵位置新增。 即使是此位置的 100 個 CPU 週期,也可能大幅降低批次速率輸送量。

    實際 TDS 數據中的變更可能會導致記憶體塗鴉。 此問題已觸發各種 SQL Server 穩定性問題和數據損毀。 問題可能會導致 TDS 封包部分變更,並將垃圾重新執行至 SQL Server。 此層級的記錄設施可能會公開 SQL Server 追蹤設計來隱藏及協助保護的密碼和其他敏感數據。

  • SQL Server 剖析例程會變成變更行為。 以下是可能的副作用:

    • 執行計劃不符合實際的查詢文字。
    • 命令只會從用戶端提交一次。 不過,命令會執行多次。
    • 追蹤輸出會顯示原始命令,而不是改變的查詢。
    • 此命令 DBCC INPUTBUFFER 會顯示原始命令,而不是改變的查詢。
    • fn_get_sql 式會顯示不正確的數據。 此外,函 fn_get_sql 式容易受到例外狀況和不正確的結果的影響。 此 fn_get_sql 函式是由許多監視解決方案所使用,而且可能會在監視解決方案上造成問題。
    • 整體使用者模式排程器 (UMS) 和 SQL Server 作業系統 (SQLOS) 排程可能會中斷。 這會導致 SQL Server 回應中斷、效能變更和中斷。
  • 提供增強式安全性功能的 Win32 API 會偏離。 視實作而定,此層級的記錄設施可能會公開密碼和其他敏感數據。 整體UMS和SQLOS排程中斷。 這會導致 SQL Server 回應和中斷中斷。

  • SQL Server 進程不支援修改函式數據表和重新導向核心 SQL Server 函式或 Windows API。 這可能會導致 SQL Server 功能中的不穩定和非預期的行為。

下列範例顯示 kernel32!GetQueuedCompletionStatus 函式已被繞道。

MyDLL!MyGetQueuedCompletionStatus
ssnetlib!ConnectionReadAsyncWait

在函式的元件中 GetQueuedCompletionStatus ,第一個指令已取代為 jump 指令。

0:038> u kernel32!GetQueuedCompletionStatus
kernel32!GetQueuedCompletionStatus
77e660f1 e90a9f00aa jmp 21e70000 ß This points to an address that does not appear in the loaded module list (lm). It is injected code.
77e660f6 83ec10 sub esp,10h

插入程式代碼的元件會顯示已繞行的活動和 MyDLL 檔案的呼叫。

0:038> u 21e70000
21e70000 55 push ebp
21e70001 8bec mov ebp,esp
21e70003 51 push ecx
21e70004 8b4518 mov eax,dword ptr [ebp+18h]
21e70007 50 push eax
21e70008 8b4d14 mov ecx,dword ptr [ebp+14h]
21e7000b 51 push ecx
21e7000c 8b5510 mov edx,dword ptr [ebp+10h]
21e7000f 52 push edx
21e70010 8b450c mov eax,dword ptr [ebp+0Ch]
21e70013 50 push eax
21e70014 8b4d08 mov ecx,dword ptr [ebp+8]
21e70017 51 push ecx
21e70018 e8234d19ee call MyDLL+0x4d40 (10004d40) <- Call to the MyDLL file.
21e7001d 8945fc mov dword ptr [ebp-4],eax
21e70020 8b55fc mov edx,dword ptr [ebp-4]

您可以使用適用於 Windows 的偵錯工具來判斷是否使用繞道。 若要這麼做,請執行下列步驟。

注意

在生產環境中試用此方法之前,請務必先測試此方法。 當您使用適用於 Windows 的偵錯工具時,當您執行命令時,進程可能會凍結。 此行為可能會對實際執行伺服器造成負面影響。

  1. 將適用於 Windows 的偵錯工具附加至 SQL Server,或載入完整的使用者傾印檔案。

  2. 發出下列調試程式命令。 此命令會根據磁碟上的映像檢查每個映像,以判斷是否已插入繞道。

    !for_each_module "!chkimg -v @#Base -d"
    
  3. 中斷調試程序連結。

如果記憶體內部映像已改變,輸出可能會類似下列內容:

Comparison image path: c:\program files\microsoft sql server\mssql\binn\ssnetlib.dll\ssnetlib.dll
Scanning section: .text
Size: 56488  
Range to scan: 0c261000-0c26eca8  
0c263710-0c26371a 11 bytes - ssnetlib!ConnectionClose  
[ 8b ff 55 8b ec 83 ec 10:68 00 00 00 00 e9 27 8a ]  
0c2641e0-0c2641ea 11 bytes - ssnetlib!ConnectionReadAsync (+0xad0)  
[ 8b ff 55 8b ec 83 ec 38:68 00 00 00 00 e9 00 7e ]  
0c265160-0c26516a 11 bytes - ssnetlib!ConnectionWriteAsync (+0xf80)  
[ 8b ff 55 8b ec 83 ec 28:68 00 00 00 00 e9 ba 70 ]  
Total bytes compared: 56488(100%)  
Number of errors: 33  
33 errors : 0c260000 (0c263710-0c26516a)

您可以檢閱元件以更仔細地查看問題,如下所示:

0:038> u ssnetlib!ConnectionClose
ssnetlib!ConnectionClose]:
0c263710 6800000000 push 0
0c263715 e9278ada03 jmp MyDLL!MyGetQueuedCompletionStatus <- A detour has been installed.

追蹤 SQL 插入式攻擊的防病毒軟體程式可能會繞道 SQL Server 程式代碼。 在此案例中 !for_each_module "!chkimg -v @#Base -d" ,延伸模組的輸出可能會顯示 SQL Server 函 yyparse 式和 ex_raise2 已修改:

Comparison image path: <symbol file path>\sqlservr.exeRange to scan: c81000-3de7d48 ed71a8-ed71ad 6 bytes - sqlservr!yyparse [ ff f5 41 54 41 55:e9 c7 95 5c 76 90 ]1202820-1202824 5 bytes - sqlservr!ex_raise2 (+0x32b678) [ ff f3 57 41 54:e9 20 e0 29 76 ] Total bytes compared: 51801416(17%)Number of errors: 11

建議您連絡繞道或類似技術的提供者,以取得其如何在 SQL Server 中使用繞道的詳細資訊。 如需繞道和類似技術的詳細資訊,請參閱 繞道