次の方法で共有


迂回または同様の手法により、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 プロセス内の COM オブジェクトなど、Microsoft 以外のソフトウェアを使用している場合も、これらの同じ問題が発生する可能性があります。 迂回は DBA ビューでは非表示になります。 回り道を明らかにするには、「 詳細情報 」セクションに記載されている手法を使用する必要があります。 リンク サーバー、COM オブジェクト、および拡張プロシージャには、明示的な登録と定義されたインターフェイスがあります。

Note

迂回の隠れた性質と公開されたインターフェイスがないため、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 解析ルーチンは、動作を変更するために迂回されます。 考えられる副作用を次に示します。

    • 実行プランが実際のクエリ テキストと一致しません。
    • コマンドは、クライアントから 1 回だけ送信されます。 ただし、コマンドは複数回実行されます。
    • トレース出力には、変更されたクエリではなく、元のコマンドが表示されます。
    • 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 のコア関数または Windows API のリダイレクトは、SQL Server プロセス内ではサポートされていません。 これにより、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 用デバッグ ツールを使用して、迂回が使用されているかどうかを判断できます。 これを行うには、以下の手順を実行します。

Note

運用環境で試す前に、必ずこのメソッドをテストしてください。 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」を参照してください。