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

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

原始產品版本: SQL S
原始 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 檢視會隱藏繞道。 To uncover a detour, you must use the techniques that are described in the More Information section that follows. 鏈接的伺服器、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 ,第一個指令已取代為跳躍指令。

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 函式yyparseex_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 中使用繞道的詳細資訊。 如需繞道和類似技術的詳細資訊,請參閱 Detours>