迂回や同様の手法は、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 テーブルを使用すると、CPU 使用率が 100% になり、データベースの復旧時間が長くなります。

リンク サーバー、拡張プロシージャ、COM オブジェクトなど、Microsoft 以外のソフトウェアをSQL Server プロセス内で使用している場合にも、これらの同じ問題が発生する可能性があります。 迂回は 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解析ルーチンは、動作を変更するために迂回されます。 次のような副作用が考えられます。

    • 実行プランが実際のクエリ テキストと一致しません。
    • コマンドは、クライアントから 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 用デバッグ ツールを使用して、迂回が使用されているかどうかを判断できます。 それには、以下の手順を実行します。

注:

運用環境で試す前に、常にこのメソッドをテストしてください。 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の回り道の使用方法の詳細については、迂回または同様の手法のプロバイダーにお問い合わせください。 迂回と同様の手法の詳細については、「回 り道」を参照してください。