DLLハイジャッキングとは、サイバー攻撃者が悪意のあるコードをアプリケーションに挿入して、ダイナミックリンクライブラリ(DLL)のロード方法を感染させることです。複数の米国政府部門に侵入し、ロシアと関連性がある可能性が高い、米国連邦機関を標的にした過去最大規模のハイジャッキングの1つにも、DLLハイジャッキングが使用されていました。DLLハイジャッキングは、1つの感染ファイルからシステム全体を侵害する可能性のある、Windowsプラットフォームを悪用します。セキュアコーディングのプラクティスは、DLLハイジャッキングの防止に役立ちます。DLLハイジャッキングを特定してテストする方法を理解することも、脅威によるハイジャッキングの防止に役立ちます。強力なセキュリティネットワークと従業員に対する十分な教育は、サイバーハッカーによるシステムへの侵入を防止する上で役立ちます。
DLLハイジャッキングとは?
攻撃者が感染ファイルをマシンに送り込み、DLLハイジャッキングに対して脆弱なアプリケーションが実行されると、このファイルが実行されます。DLLハイジャッキングは、感染ファイルをアプリケーションの検索パラメータに挿入するサイバー攻撃の方法です。ユーザーが次に、そのディレクトリからファイルをロードしようとすると、感染したDLLファイルが代わりにロードされます。この感染ファイルが、アプリケーションのロード時にいくつかの手順を実行します。DLLファイルは多くの場合に、コンピュータにあらかじめロードされています。DLLファイルを含む多くのアプリケーションが起動時に自動的にロードされることで、コンピュータ全体が侵害され、悪意のあるコードを含むファイルがロードされることでハッカーがアクセスを手に入れます。
DLLファイルとは?
DLLファイルはMicrosoftオペレーティングシステムだけに存在する、アプリケーションの正常な実行に必要なリソースを保持するファイルです。Windowsオペレーティングシステムの機能の多くはダイナミックリンクライブラリにより提供されると、Microsoftは説明しています。DLLファイルは通常、アプリケーションのロード時に開かれます。DLLファイルは、プログラムの実行やハードドライブ領域の効率的な使用に役立ちます。DLLファイルが複数のプログラムを実行することも多いため、DLLハイジャッキングを使用する1つのサイバー攻撃で1つのファイルを感染させるだけで、複数のプログラムを妨害し、侵害する可能性があります。
DLLハイジャッキングの仕組み
Windowsアプリケーションは、DLL検索プロトコルを使用して正常に実行されます。標的にするアプリケーションのディレクトリにペイロードDLLを入れることで、正規のファイルではなく、感染ファイルをロードするようにアプリケーションを誘導できます。MicrosoftアプリケーションのDLL検索順序は公開されているため、その既知である検索順序が悪用される可能性があります。アプリケーションは起動時に見つかったファイルを最初に実行するため、攻撃者は、標的のアプリケーションが正規のDLLファイルの前に感染ファイルを検索するようにする必要があります。以下の方法でこれが可能になります。
- 攻撃者が、正規のライブラリの前に検索されるディレクトリにトロイの木馬のDLLファイルを埋め込む。
- DLLをプリロードすると、検索条件があいまいに指定されたDLLと同じ名前の悪意のある感染DLLが最初に検索される。
- DLLリダイレクトでDLL検索順序を直接変更することで、正規のDLLではなく悪意のあるDLLをプログラムが実行するようにする。
- 感染DLLファイルが、サプライチェーン攻撃、フィッシング、ソーシャルエンジニアリングを通じて送られる可能性がある。ファイルが置かれた場所の権限レベルが高いほど、攻撃者はシステムに対してより高いアクセス権を手に入れることになります。
関連付けられたDLLファイルの完全パスが指定されていない場合、Windowsアプリケーションは特定のDLL検索プロトコルをデフォルトで使用し、アプリケーションがロードされるディレクトリが最初に検索されます。DLLハイジャッキングは、感染DLLファイルをこの場所に置くことで、システムディレクトリの前に検索され、使用されるようにします。これが、DLL検索順序ハイジャッキングと呼ばれるものです。悪意のあるDLLファイルは多くの場合、標的とするアプリケーションに見せかけたデジタル署名を使用し、正規のファイルであるようにすることで、検知を回避し、感染DLLファイルの転送が許可され、サプライチェーンを通じて送られるようにします。
DLLハイジャッキング攻撃を特定する方法
Process Explorerと呼ばれるWindowsプログラムは、DLLハイジャッキングの試行を特定できます。これは、ロードされるすべてのファイルシステムをリアルタイムで表示することで機能します。フィルターを正しく使用することで、ユーザーは属さないDLLファイルを識別できます。次の手順を使用します。
- Process Explorerをインストールしてロードします。
- DLLハイジャッキングが疑われる攻撃が標的にしているアプリケーションを検索します。
- Ctrl+Lを押し、[Add]、[Apply]の順にクリックして、パスが.dllで終わるアクティブファイルだけが表示されるようにフィルターを適用します。
- Ctrl+Lを押し、ディレクトリ「NAME NOT FOUND」に絞り込みます。条件を「Result: NAME NOT FOUND」に設定し、次に[Add]、[Apply]の順にクリックして、システムディレクトリの外部でロードされるファイルを表示します。
- Ctrl+Lキーを押し、追加フィルターを適用します。条件を「Path is [パスのアドレス]」に設定し、次に[Add]、[Apply]の順にクリックして、アプリケーションのディレクトリ内のDDLファイルだけを表示します。
DLLハイジャッキングを防止する方法
DLLハイジャッキングを防止する最良の方法としては、まず、すべてのDLLファイルの正確な場所を指定できるソフトウェア開発者が、デフォルトDLL検索パスプロトコルをWindowsが使用しないように設定します。また、アンチウイルスソフトウェアを常に最新の状態にすることも重要です。もちろん、DLLインジェクションの試行が検知されないことは多いものの、優れたアンチウイルスソフトウェアは、少なくとも一部のDLLハイジャッキングの試行をブロックできる重要な防衛線です。自社のサイバーセキュリティに常に気を配り、ネットワークとエコシステムの脆弱性のチェックとスキャンを定期的に実行します。Windows DLLハイジャッキングは、感染ファイルがエコシステムに持ち込まれることで初めて可能になり、多くの場合、従業員がマルウェアを開いてしまうことで、意図しない形で拡散します。従業員教育でフィッシング攻撃やソーシャルエンジニアリングの警戒サインを周知することで、DLL攻撃による侵害を防止できます。セキュリティのベストプラクティスを以下に紹介します。
- 情報セキュリティポリシーを確立し、維持する。
- 不審なメールを開いたり使用したりする前にセキュリティ担当者に問い合わせる。
- ログインで多要素認証を有効にする。
- ベンダーのリスク管理ソリューションを実装する。
手順の例
攻撃者は、DLLハイジャッキングを実装する目的でDLLの脆弱性を探しますが、アプリケーションにDLLが指定されていないことが脆弱性となっているケースが少なくありません。一般的には、DLLの検索は以下の順序で行われます。
- アプリケーションがロードされる元のディレクトリを検索する。
- 現在のディレクトリを検索する。
- システムディレクトリを検索する。
- windowsディレクトリを検索する。
- PATH環境にあるディレクトリを検索する。
DLLハイジャッキングは次に、正規のDLLファイルの前に、これらのディレクトリのいずれかに悪意のあるファイルを入れます。あるいは、AppInit DLLを使用してカスタムDLLを作成する方法もあります。このDLLは、以下の方法で事実上どこにでもロードできます。
- 悪意のあるDLLを生成する。
- LoadAppInit_DLLs設定をTRUEに設定する。
- AppInitで悪意のあるDLLを指定する。
- DLLを挿入するプロセスを実行する。
DDL転送を使用し、トロイの木馬のDLLを送り込むこともできます。この場合、感染DLLがこのプロセスの中間者の役割を果たします。この方法は次のようになります。
- DLLとその機能を分析する。
- 傍受し、変更する機能を特定する。
- これらの機能を感染DLLに実装する。
- 残りの機能を元のDLLに転送する。
- 元のDLLの名前を変更する。
- インポートを名前を変更したDLLに転送する。
- 元のDLLを感染DLLに置き換える。
- 感染DLLの名前を元のDLLに変更する。
既知のDLLハイジャッキング脅威の例
DLLハイジャッキングは長年行われており、Windowsオペレーティングシステムに対するサイバーセキュリティ脅威であり続けています。この脅威の例として、次のようなものがあります。
- APT41:検索順序ハイジャッキングを使用
- FinFisher:複数の亜種がDLL検索順序ハイジャッキングを使用
- Chaes:検索順序ハイジャッキングで悪意のあるDLLペイロードをロード
- Astaroth:検索順序ハイジャッキングを使用して自らを起動
- BOOSTWRITE:正規の.dllファイルのロードを悪用
- BackdoorDipolomacy:検索順序ハイジャッキングを使用
- HinKit:検索順序ハイジャッキングを永続化メカニズムとして使用
- Crutch:検索順序ハイジャッキングを検索エンジンを使用して永続化
- Downdelph:.exeファイルの検索順序ハイジャッキングにより権限を昇格
- InvisiMole:検索順序ハイジャッキングで起動時に感染DLLを起動
- HTTPBrowser:DLLロード順序を妨害
- Ramsey:古いWindowsアプリケーションをハイジャッキング
- menuPass:DLL検索順序ハイジャッキングを使用
- ThreatGroup-3390:DLL検索順序ハイジャッキングを使用してペイロードを配布
- Whitefly:検索順序ハイジャッキングによる悪意のあるDLLの感染
- RTM:検索順序ハイジャッキングでTeamViewerを妨害
- Tonto team:正規のMicrosoftの実行ファイルを妨害して悪意のあるDLLをロード
- Melcoz:DLLハイジャッキングを使用してセキュリティ制御を回避
緩和策
DLLハイジャッキングの緩和には、以下の方法を使用できます。
- 監査:PowerUpなどの監査ツールは、DLL検索順序ハイジャッキングの試行を検知して修正できます。
- Restrict library loading: Do not allow remote DLLs to load and enable DLL safe search mode, which forces the system to use more restrictions when searching for DLL files.
- 実行の防止:アプリケーション制御ソリューションを使用して、DLL検索順序ハイジャッキングで実行される可能性がある悪意のあるソフトウェアを特定し、ブロックします。
テストによりDLLハイジャッキングを検知する方法
テストによりDLLハイジャッキングを検知するには、Windows Process Explorerなどのプログラムの検知方法と同様の方法を使用します。テストによりハイジャッキングされたDLLファイルを見つけるには、.exeファイルと.dllファイルでフィルタリングして、「NAME NOT FOUND」と表示されるファイルを確認します。これは通常、DLLハイジャッキングの試行を示しています。さらに、DLLSpyと呼ばれる製品は、静的、動的、再帰の3つの異なる方法を使用してDLLハイジャッキングを検知します。静的テストは、アプリケーションの実行のプロセスですべての.dllファイルまたは.dllパスファイルを検索します。動的テストは、すべてのモジュールをスキャンして、DLLの場所に書き込みアクセス許可があるかどうかを判断し、上書きされていないかをチェックします。再帰エンジンは、以前に検査したすべてのDLLプロセスをスキャンすることで、それ以外にロードされた可能性があるDLLを検索し、その脆弱性をチェックします。
参考文献
Russian Hackers Broke Into Federal Agencies, U.S. Officials Suspect(2021年5月、The New York Times)
What Is a DLL?(2021年9月、Microsoft)
Process Explorer v16.43(2021年8月、Microsoft)
AppInit DLLs and Secure Boot(2021年1月、Microsoft)
PowerUp: A Usage Guide(2014年6月、Harmj0y)
Cyberark/DLLSpy(2021年、GitHub, Inc.)