※ 本ブログは、2019年8月23日にBromium BlogポストされたAgent Tesla: Evading EDR by Removing API Hooksの日本語訳です。
Toby GrayとRatnesh Pandeyが執筆しました。
エンドポイント検知および応答(EDR)ツールは、マルウェアが実行されたときに生成される悪意のある活動を検知するのに、オペレーティングシステムのイベントに依存しています。これらのイベントは、後に関連付けされて分析され、異常な挙動や不審な挙動を検知します。このようなイベントのソースの1つは、EDRソリューションが興味深いAPIコールを追跡するのに役立つアプリケーション・プログラム・インターフェース(API)フックです。最近、パスワードを盗むトロイの木馬、Agent Teslaを配信するフィッシングキャンペーンに遭遇しました。Bromium Secure Platformでキャプチャしたフォレンジックデータを分析していたところ、Windows Native APIをエクスポートするダイナミックリンクライブラリ(DLL)であるntdll.dllのアドレス空間でメモリ改ざんイベントが発生していることに気付きました。ペイロードはBromium Secure Platformによって隔離され、マルウェアを捕捉しました。
Agent Teslaのダウンローダーは、プライマリペイロードをドロップして実行する.xlsファイルとしてやって来ます。このブログ記事では、EDRのようなフッキングに依存するツールによる検出を回避するために、ドロッパーによるAPIのアンフックについて説明します。その後のブログ記事では、キャンペーンの詳細な分析を提供します。
システムコールはオペレーティングシステムのカーネル内の関数で、ユーザーからの要求にサービスを提供し、基礎となる特権リソースにユーザーが直接アクセスできないようにバリアを提供します。Windows システムでは、ntdll.dll ライブラリにユーザーモードのシステムコールが含まれています。これらのシステムコールに関する情報は、関数ポインタの配列とシステムサービス記述子テーブル (SSDT) に格納されます。
“Base”は関数ポインタの配列を指し、システムコール番号はこの配列へのインデックスです。これらの関数は、NtAllocateVirtualMemoryの場合の仮想メモリの割り当てのように、何らかのアクションを実行するようカーネルに要求するために使用されます。この議論の残りの部分では、メモリのパーミッションを変更するために使用される、文書化されていないシステムコールである NtProtectVirtualMemory に焦点を当てます。
32 ビットプログラムが 64 ビット Windows マシン上で実行されると、Windows on Windows 64 (略して WoW64) として知られているシステムの下で実行されます。カーネルは 64 ビットモードで実行されているため、32 ビットプログラムからのシステムコールはすべて、メモリ内の既知の場所にあるラッパー関数 Wow64SystemServiceCall を経由して行われます。これは、多くのシステムコール関数を含む ntdll.dll が非常に反復的な構造を持っていることを意味します。
次のシステムコール関数 ZwQuerySection は、この関数の直後にあり、同じ構造に従っていますが、唯一の違いは、0x50 ではなく 0x51 をシステムコール番号として読み込むことです。
セキュリティ製品は、ソフトウェアからのシステムAPIコールを傍受して記録するためにAPIフックを使用しています。これを実現する1つの方法は、フッキングするAPIのインメモリコードを変更することです。
フッキングされると、最初の命令は、フッキングソフトウェアによって生成されたトランポリンコードにジャンプする命令に置き換えられます。
図3では、NtProtectVirtualMemoryの最初の命令はもはや0x50をeaxにロードしません。その代わりに、コードの実行をアドレス 0x004F0012 にリダイレクト(またはジャンプ)します。フッキングコードはそのアドレスに生成されたコードを持ちます。
元の関数はその後も通常通りに実行を続けるので、API を呼び出しているコードもシステムカーネルも、関数呼び出しが横取りされたことを認識していません。
メールヘッダ
ダウンローダー
ドロッパー
最近のマルウェアは通常、アンチウイルスなどのシグネチャベースの検出技術による静的検出を回避するために、ポリモーフィズムや難読化技術に依存しています。EDR ツールは、システムアクティビティを監視し、通常のアプリケーションの動作から逸脱している場合や、既知の悪意のあるパターンと一致する場合に、疑わしいイベントにフラグを立てることで、その機能を実現しています。これらのイベントのほとんどは、APIをフックすることによって生成されます。一部のセキュリティソリューションでは、疑わしいイベントがトリガーされた場合に悪意のあるプロセスをブロックするためにAPIフックを使用するものもあります。
今回この悪意のあるサンプルを分析したところ、ペイロードであるAgent Tesla (bin.exe)を起動する前に、メモリマップされたntdll.dllを変更しているユニークなコードがあることに気付きました。このマルウェアはシェルコードにより、次のアクションを実行します。
悪意のあるコードは、ntdll.dll のメモリを 1 byteずつスキャンする前に、Wow64SystemServiceCall のアドレスを edx レジスタにロードします。上記のコードで0x004A0A50 の命令は、スキャンするntdll.dll の次の部分の位置持つ ebx レジスタをインクリメントしています。
0x004A0A51での最初のチェックは、前述のフックのアンフックとは関係のないチェックを行っているので、その比較はスキップして0x004A0A6Bにジャンプしてください。0x004A0A6BのチェックはWow64Transitionの値を調べており、それが見つかれば0x004A0A6Fから始まる命令が実行されます。手順は以下の通りです。
5 byte(eax 4 byte、0xB8 1byte)を書き込んだ結果、フック命令(前の例では jmp 0x004F0012 など)を元の命令(前の例では mov eax, 50)に置き換えました。
最終的には、悪意のあるコードがシステム API を呼び出すことができるようになり、その要求がフックによって監視されたりブロックされたりすることはありません。
悪意のある活動はすべて、保護のためにハードウェアによる隔離が利用されているマイクロ仮想マシン(uVM)内で行われるため、このフック解除はBromium Secure Platformにとっては問題ではありません。
Author : Ratnesh Pandey
監訳:日本HP