メインコンテンツへスキップ
Tanium ブログ

ハイジャックに遭わないようにしましょう! Tanium を使用した DLL 読み込み順序攻撃の検出

DLLハイジャックの解説

DLLハイジャッキングは、一般に「ロード順ハイジャッキング」または「検索順ハイジャッキング」とも呼ばれ、その手法については多くの文献で詳述されていますが、依然として検出を逃れ続けており、調査担当者にとって大きな課題となっています。 このテクニックに不慣れな方も、ご安心ください! この記事では、ロードオーダーハイジャックの概要について解説し、大規模な検出を可能にするTaniumの新しい機能をご紹介します。

Windows では、実行時に読み込まれるダイナミックリンクライブラリ(DLL)について、アプリケーションが完全なパスを指定する必要はありません。 完全なパスが指定されていない場合、Windows はあらかじめ決められた場所を予測可能な順序で検索し、DLL を探そうとします。 したがって、攻撃者は、正規のライブラリよりも前の場所に、正規版と同じ名前の悪意のあるDLLを追加することで、この順序をすり替えることが可能です。その結果、オペレーティングシステムが意図せずその悪意のあるDLLを読み込んでしまうことになります。 アプリケーションが名前だけで DLL(例:ntshrui.dll)を読み込む場合、Windows は公開されている順序に従って、「ntshrui.dll」という名前のライブラリを特定し、最初に検出されたものを読み込みます。

「安全な DLL 検索モード」が有効になっている場合(デフォルトでは有効になっています)、オペレーティングシステムはまず、同じ名前の DLL がすでにメモリに読み込まれているかどうか、あるいはその DLL がレジストリキー「KnownDLLs」(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs)に定義されているかどうかを確認します。 これらの条件のいずれも満たされない場合、Windows は以下の順序でライブラリを読み込みます:

  1. アプリケーションが起動されたディレクトリ
  2. システムディレクトリ(C:\Windows\System32)
  3. 16ビットシステムのディレクトリ(C:\Windows\System)
  4. Windows ディレクトリ
  5. 現在のディレクトリ
  6. PATH変数で定義されているディレクトリ

ロード順序については、マイクロソフトがこちらのページでさらに詳しく説明しています:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx (新しいタブで開きます)

既知のDLLライブラリ

どのWindowsシステムにおいても、乗っ取られる可能性のある箇所の数によって表される攻撃対象領域は、想像以上にはるかに広範囲に及んでいます。 原則として、「C:\Windows\System32” 」以外で実行され、完全なパスを指定せずにライブラリを読み込むアプリケーションは、攻撃の対象となる可能性があります。 注:対象のライブラリは、メモリ上にすでに存在していないこと、またレジストリの「KnownDLLs」値に登録されていないことも必要です。 コアシステムのバイナリ、特に explorer.exe についても、脆弱性が確認されています(https://capec.mitre.org/data/definitions/471.html (新しいタブで開きます))。

適切に設計された悪意のあるライブラリは、正規のライブラリの「通過点」として機能し、それを読み込む脆弱性のあるアプリケーションの安定性を維持することができます。 実行中のアプリケーションを単に列挙したり、一般的な保存場所を挙げたりするだけでは、この攻撃を検知する効果的な手段とはなりません。 全体として、悪用される可能性のあるアプリケーションや読み込まれるDLLの範囲が広範であるため、この手法の検知を試みる多くの調査担当者を悩ませてきました。

Taniumのインシデント対応モジュール(バージョン 2.3.1)

Taniumのインシデント対応モジュールの最新リリース(バージョン 2.3.1)には、「DLLロード順序の乗っ取り検出」という新しいセンサーが含まれています。 この機能は、組織がDLLのロード順序の乗っ取りを大規模に検知できるよう支援することを目的として設計されました。 このセンサーは、実行中のプロセスによって読み込まれたDLLを検査し、いくつかのヒューリスティック手法やフィルタリング手順を適用することで、ハイジャックが発生した可能性のある状況を特定します。 ハイジャックの疑いがあるプロセスが特定されると、センサーはそのプロセスおよびDLLに関する情報を返し、アナリストが検出結果の正当性を判断するのを支援します。 具体的には、センサーは以下の情報を返します:

  • プロセス名とパス
  • DLLのパス
  • DLL MD5 ハッシュ
  • DLLにデジタル署名がある場合
  • DLLが悪意のあるものであると疑われる理由

Taniumは、環境の規模にかかわらず、検索から結果の生成に至るまでの全プロセスを、わずか数秒で完了させます。

以下のスクリーンショットは、小規模なラボ環境での展開における「DLLロード順序ハイジャック」センサーの出力例を示しています。 私たちは、単一の「感染した」システムにおいて、「Explorer.exe」が「C:\WINDOWS\system32” 」ではなく「C:\WINDOWS」ディレクトリから「ntshrui.dll」を読み込むという、段階的な検出手法を構築しました。

大規模な企業環境では、このセンサーにより、ある程度の数の誤検知が発生する可能性があります。 アプリケーションは、異なるインストール環境やWindowsのバージョン間でも一貫して動作するようにするため、多くの場合、想定されるDLLの検索順序に従って、同じディレクトリ内にある正規のライブラリのコピーを読み込みます。 Taniumは、各結果について発生頻度のデータをリアルタイムで自動的に提供するため、アナリストは、センサーから提供されるハッシュ値やデジタル署名データと照らし合わせながら、一般的な結果を簡単に除外することができます。 以下のスクリーンショットは、デジタル署名や頻度カウントのデータでフィルタリングを行えば除外できたはずの誤検知の例を示しています。

誤検知をさらに減らすため、このセンサーでは、正常であることが確認済みのライブラリのホワイトリストをユーザーが定義することも可能です。 実際、Taniumのセンサーを追加することで、既知のクリーンなシステムのグループ全体において、読み込まれているDLLやディスク上のDLL、およびそれらのハッシュ値を簡単に照会することができ、ユーザーが自身の環境に合わせてカスタマイズされたホワイトリストを作成・維持するのに役立ちます。

「DLLロード順序ハイジャック」センサーは、当社のエンドポイント検出・対応(EDR)チームが、インシデント調査を簡素化し、組織が環境内の「未知の脅威」を積極的に検知できるよう支援するための取り組みの一例です。

今後数ヶ月の間に、新たな機能や導入事例について、定期的にブログでお伝えしていく予定です。

どうぞお楽しみに!

Taniumの実際の動作をご覧になりませんか? の個別デモをご予約いただくか、毎週開催されているウェビナーにご参加ください。 「 」の今後のイベント()にて、当社のTaniumエキスパートにご相談ください。