FalconEyeは、Windowsエンドポイント向けのリアルタイムプロセスインジェクション検出ソフトウェアです。これはカーネルモードドライバであり、プロセスインジェクションをリアルタイムで捕捉することを目的としています。FalconEyeはカーネルモードで動作するため、ユーザーモードのフックを回避しようとするプロセスインジェクション技術に対して、より強力で信頼性の高い防御を提供します。
プレゼンテーションは2021 Blackhat ASIA Arsenalとスライドでご確認いただけます。
以下の表は、さまざまなプロセスインジェクション技術に対する実装状況と検出ロジックを示しています。WPMはWriteProcessMemoryの略です。検出をテストするには、参考文献セクションを参照してください。
| 手法 | ステータス | 検出方法 | 使用したPOC |
|---|---|---|---|
| Atombombing | ✓ | QueueUserAPCをフックし、GlobalGetAtom系関数を監視する | Pinjectra |
| Instrumentation callback injection | ✓ | 浮動コードから新しいスレッドが作成された場合に検出 | https://github.com/antonioCoco/Mapping-Injection |
| Reflective DLL Injection | ✓ | 浮動コードから新しいスレッドが作成されたか、PEヘッダが被害プロセスに書き込まれているかを検出 | MInjector |
| PROPagate | ✓ | SetPropをフックして書き込まれているプロパティのアドレスを取得し、以前のWPM呼び出しと関連付けて浮動コードのアドレスを検出 | Pinjectra |
| Process Hollowing | ✓ | ターゲットプロセスメモリに書き込まれたPEヘッダを使用して検出 | MInjector |
| CreateRemoteThread with LoadLibrary | ✓ | 開始アドレスがLoadLibraryを指す新しいスレッド。MInjector版ではWPMを使用してDLLパスも書き込まれ、これも検出 | MInjector, Pinjectra |
| CreateRemoteThread with MapViewOfFile | ✓ | 浮動コードから新しいスレッドが作成された場合に検出 | Pinjectra |
| Suspend-Inject-Resume | ✓ | 浮動コードから新しいスレッドが作成されたか(MInjector)、WPM経由でDLLパスが書き込まれているか(MInjector)、以前に中断されたスレッドにコンテキストが設定された場合に検出(Pinjectra) | MInjector, Pinjectra |
| QueueUserAPC | ✓ | WPM経由でDLLパスが書き込まれている | MInjector |
| QueueUserAPC with memset (Stackbombing) | ✓ | QueueUserAPCをフックし、memsetを監視 | Pinjectra |
| SetWindowLong (Extra window memory injection) | ✓ | SetWindowLongをフックして書き込まれる関数ポインタのアドレスを取得し、以前のWPM呼び出しと関連付けて浮動コードのアドレスを検出 | Pinjectra |
| Unmap + Overwrite | ✓ | 攻撃者プロセスが被害プロセスからntdllをアンマップした場合に警告 | Pinjectra |
| Kernel Ctrl Table | ✓ | WPMが被害プロセスのPEB内のKernelCallbackTableフィールドを上書きしているか検出 | https://github.com/odzhan/injection/blob/master/kct |
| USERDATA | ✓ | WPMターゲットアドレスがconhost.exeの範囲内か確認。該当する場合、conhostからの関連する関数ポインタが以前に保存されたWPMアドレスと一致するか確認 | https://github.com/odzhan/injection/blob/master/conhost |
| Ctrl-inject | ✓ | 攻撃者が被害プロセスのKernelBase.dll範囲でWPMを実行した場合に検出 | Pinjectra |
| ALPC Callback | ✓ |

注:私たちの焦点は検出であり、パフォーマンスの高い検出エンジンの作成ではありません。BlackHat発表後もこれらの取り組みを継続します。
.
├── src
│ ├── FalconEye ---------------------------# FalconEye user and kernel space
│ └── libinfinityhook ---------------------# Kernel hook implementation
├── 2021BHASIA_FalconEye.pdf
└── README.md
BCDEDIT /set nointegritychecks ONAtombombing: Brand new code injection for windows, 2016
Propagate - a new code injection trick, 2017
Windows process injection: Extra window bytes, 2018
Pavel Asinovsky. Diving into zberp's unconventional process injection technique, 2016
Rotem Kerner. Ctrl-inject, 2018
Windows process injection: Consolewindowclass, 2018
Windows process injection: Windows notication facility, 2018
A paradox: Writing to another process without openning it nor actually writing to it, 2007
Windows process injection: Service control handler, 2018
FalconEyeはApache 2.0オープンソースライセンスの下で提供されています。
| ALPCポートへのNtConnectPort呼び出しから被害プロセスPIDを抽出。攻撃者-被害PIDの組に対して以前のWPM呼び出しを確認し、浮動コード検出を適用 |
| Pinjectra |
| WNF Callback | ✓ | WPMの後にUpdateWNFStateData呼び出しが続く | https://github.com/odzhan/injection/tree/master/wnf |
| SetWindowsHook | ✓ | NtUserSetWindowsHookExフックに登録されたモジュールパスを保存。後でこのパスに一致するモジュールが別のプロセスにロードされた場合にアラートを生成 | MInjector |
| GhostWriting | ✓ | 以前に中断されたスレッドにコンテキストが設定された(NtSetContextThreadが呼び出された)場合に検出 | Pinjectra |
| Service Control | ✓ | WPMがプロセス(サービス)のService IDEを上書き | https://github.com/odzhan/injection/tree/master/svcctrl |
| Shellcode injection | ✓ | 浮動コードから開始された新しいスレッド。WPMによって書き込まれるDLLパス | MInjector |
| Image Mapping | ✓ | 浮動コードから開始されたスレッド。WPMによって書き込まれるPEヘッダ。WPMによって書き込まれるDLLパス | MInjector |
| Thread Reuse | ✓ | 浮動コードから開始されたスレッド。WPMによって書き込まれるDLLパス | MInjector |