新たなWindowsプロセスインジェクション手法、WriteProcessMemoryなしでEDRの監視をかいくぐる

新たに公開されたWindowsのプロセスインジェクション手法を使うと、厳重に監視されている WriteProcessMemory や VirtualAllocEx といったAPIを呼び出さずに、コンソールアプリケーション内にペイロードを配置して実行できます。

「コンソール名前付きパイプインジェクション」と名付けられたこの手法は、リダイレクトされた標準入力を悪用します。攻撃者が用意したバイト列を子プロセスのメモリに書き込み、そのうえでメモリページの保護属性を変更し、実行フローを乗っ取ります。

従来のリモートプロセスインジェクションは、非常に特徴的な手順をたどるのが一般的です。攻撃者はまず標的プロセスを開き、VirtualAllocEx でリモートにメモリを確保します。次に WriteProcessMemory でペイロードをコピーし、スレッドを開始または誘導して、注入したコードを実行させます。

この「確保・書き込み・実行」というパターンは広く悪用されています。そのため、EDR製品はプロセス間でこれらのAPIが使われると、信頼度の高いテレメトリを生成するのが一般的です。MITRE ATT&CKは、この広範な活動を「プロセスインジェクション(T1055)」として分類しています。

研究者のTwo Seven One Three氏が公開した新手法は、リモートメモリへの直接書き込みをWindowsのプロセス間通信に置き換えたものです。

インジェクターは既存のプロセスを狙うのではなく、nslookup.exe や netsh.exe などの対話型コンソールアプリケーションを子プロセスとして起動します。このとき、標準入力は名前付きパイプ経由でリダイレクトします。

親プロセスはパイプの書き込み側を保持し、WriteFile を使って子プロセスの標準入力ハンドルへペイロードのバイト列を送り込みます。

送り込まれたバイト列は、コンソールアプリケーションが入力を処理する過程で、そのアプリケーション自身のアドレス空間内のどこかに格納されます。

続いてインジェクターは、ペイロードの先頭に付けておいた特徴的なマーカーを目印に、子プロセスのメモリをスキャンします。これでペイロードの位置を特定し、マーカー直後にある実行開始アドレスを算出します。

この手法では、新たなメモリ領域を確保しません。Windowsがコンソール入力の仕組みを通じてすでに使用しているメモリを、そのまま転用します。

概念実証(PoC)の流れでは、特定したメモリ領域の保護属性を VirtualProtectEx で変更するとされています。その後、スレッドを一時停止して命令ポインタを書き換え、再開させることで、注入したペイロードから実行が始まります。

このため、検知の着眼点は従来の WriteProcessMemory の一連の呼び出しから外れます。今後は、パイプの動作、リモートでのメモリ保護属性の変更、メモリスキャン、スレッドコンテキストの操作といった振る舞いの相関分析が重要になります。

一方で、この手法には技術的な制約があります。ペイロードには、キャリッジリターン(0x0D)、ラインフィード(0x0A)、SUBSTITUTE文字(0x1A)を含められません。コンソールの解析処理が、これらをコマンドの区切りやファイル終端の入力と解釈する可能性があるためです。

これらの文字が含まれていると、標的のコンソールアプリケーションはデータをコマンドとして処理することがあります。その場合、バイト列全体がメモリ上に保持されません。

今回の研究は、SensePostの研究者Max Hirschberger氏とOgulcan Ugur氏による関連研究に続くものです。両氏の「Process Parameter Poisoning」も、プロセス作成時のパラメータ経由でコードを受け渡すことで、WriteProcessMemory と VirtualAllocEx を使わない手法でした。

Zerosalariumは、自社の別の手法を4種類のEDR製品に対して検証したと説明しています。ただし、この結果がコンソール名前付きパイプによる実装そのものを独立に裏付けるものではありません。防御側は、VirtualAllocEx や WriteProcessMemory のアラートだけに頼らないようにする必要があります。

検知エンジニアリングでは、次のような事象を相関させて検知すべきです。対話型コンソールバイナリが絡む不審な親子関係、リダイレクトされた標準ハンドル、標準入力に書き込まれたバイナリ状のデータ、メモリを実行可能にするリモートの VirtualProtectEx 呼び出し、そしてスレッドの一時停止や SetThreadContext の実行に続く再開です。

名前付きパイプのテレメトリも、有用な手がかりになります。SysmonのイベントID 17と18は、名前付きパイプの作成と接続の動作を記録します。ただし、リダイレクトされた標準入力に使われる匿名パイプについては、ハンドル、API、メモリ操作をより詳しく可視化できるエンドポイントテレメトリが必要になる場合があります。

1万6,000以上のSOCチームがANY.RUNを活用し、脅威調査の効率化と手作業の削減を実現しています。チームでの導入を検討する

翻訳元: https://cyberpress.org/new-windows-process-injection-technique-evades-edr-monitoring/

本記事は cyberpress.org の記事を翻訳・要約したものです。