次の方法で共有


迂回や同様の手法により、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% になり、データベースの復旧時間が長くなります。

リンク サーバー、拡張プロシージャ、または SQL Server プロセス内の COM オブジェクトなど、Microsoft 以外のソフトウェアを使用している場合にも、これらの同じ問題が発生する可能性があります。 迂回は 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 が機能 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 での迂回の使用方法の詳細については、迂回または同様の手法のプロバイダーにお問い合わせください。 迂回と同様の手法の詳細については、「回 り道」を参照してください。