共用方式為


繞道或類似的技術可能會導致 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>