新たに文書化されたWindowsのプロセスインジェクション手法「Process Parameter Poisoning(P3P^3P3)」は、攻撃者がシェルコードやDLLロードコードをプロセスの通常の起動パラメータ内に仕込む方法を示しています。
この手法は、エンドポイント検知・対応(EDR)製品がリモートプロセスインジェクションと関連付けて監視する複数のAPI呼び出しを回避するよう設計されています。
この手法は、P3P^3P3-Shellcode Loaderの概念実証(PoC)として実装されています。プロセス生成時にコピーされるデータをステージング領域として利用し、新しく生成されたプロセスのメインスレッドを、仕込まれたコードへとリダイレクトする仕組みです。
セキュリティ研究者のmodexp氏は、以前からWindowsのCreateProcess APIを通じて渡される引数を悪用するという、より広範なアイデアについて研究してきました。
従来のプロセスインジェクションは通常、識別しやすい一連の手順をたどります。攻撃者はまず対象プロセスを開くか新規作成し、リモートメモリを確保して、そのメモリに悪意あるバイト列を書き込み、実行可能な権限に変更したうえで、リモートスレッドを起動します。
この一連の流れでよく監視されるAPIには、VirtualAllocEx、WriteProcessMemory、VirtualProtectEx、CreateRemoteThreadのほか、NtAllocateVirtualMemory、NtWriteVirtualMemory、NtCreateThreadExといった、より低レベルなネイティブ呼び出しも含まれます。
P3P^3P3はこれとは異なるアプローチを取ります。既存のプロセスに対して明示的にメモリを確保し、シェルコードを書き込む代わりに、新規プロセスを生成し、Windowsが対象のプロセス環境ブロック(PEB)にコピーするフィールドに、攻撃者が制御するデータを仕込むのです。
プロセスが起動を開始すると、悪意あるローダーはProcessParametersポインタを介して対象のPEBを照会し、仕込んだデータの場所を特定できます。これは、インジェクション行動として一般的に監視されるリモートメモリの確保・書き込みAPIではなく、メモリ読み取り操作を利用する手法です。
仕込まれたデータは当初、実行不可能な状態にあるため、ローダーはページ保護属性を変更し、実行フローをリダイレクトする必要があります。このPoCではメモリを読み取り・実行可能な状態に変更したうえで、メインスレッドの実行コンテキストを書き換えます。これにより、命令ポインタが注入されたコードへと到達する仕組みです。
この方法では新規のリモートスレッドを生成する必要がありません。また、プロセスをサスペンド状態で生成したり、スレッドサスペンド系APIを繰り返し呼び出したりする必要もない場合があり、これらはいずれもプロセスホローイングや関連活動の検知トリガーとなり得るものです。
この手法には実用上の制限があります。起動パラメータはヌル終端文字列として扱われるため、ヌルバイトを含む任意のバイナリペイロードをそのまま直接使用することができません。
このローダーは、実行時にセカンドステージのペイロードを再構築またはロードする、ヌルフリーのブートストラップシェルコードによってこの問題に対処しています。
Githubの説明によると、本プロジェクトが実演しているペイロードの選択肢には、テスト用のメッセージボックス、任意のシェルコード、LoadLibraryAによるDLLロード、そしてHTTPまたはHTTPS経由で取得したシェルコードなどが含まれるということです。
今回の研究は、より広範な防御上の課題を浮き彫りにしています。WriteProcessMemoryやVirtualAllocExのみに焦点を絞った検知ロジックでは、正規のWindowsプロセス生成の挙動を悪用する実行手法を見逃す可能性があるという点です。
EDRおよび脅威ハンティングチームは、単一のインジェクションシグネチャに頼るのではなく、プロセス生成、メモリ保護属性の変更、PEBへのアクセス、スレッドコンテキストの操作を相関的に分析すべきです。
翻訳元: https://cyberpress.org/process-poisoning-enables-injection/