バンキング型トロイの木馬の技術: 金銭的動機で動くマルウェアはいかにしてインフラとなったか

Banking Trojan techniques conceptual image

This post is also available in: English (英語)

概要

ニュースではAPT攻撃(持続的標的型攻撃)が大きく取り上げられることが多いですが、多くの脅威アクターの頭にあるのは諜報よりも金銭です。バンキング型トロイの木馬を見れば、こうした金銭的動機のあるグループが使う技術について多くを学べます。

攻撃者は検知を回避しつつ悪質な行為を行うために、常に新たな技術を生み出しています。このため、動機が金銭にあるマルウェアを研究すれば、脅威アクターの戦術理解と組織の効率的保護に役立ちます。本稿で紹介するバンキング型トロイの木馬の中には、歴史的に金融マルウェアとして知られているものもありますが、これらは現在、ほかのマルウェアを配信するインフラとして主に使われています。つまり、バンキング型トロイの木馬の技術を防げば、ほかの種類の脅威も防げます。

本稿では、検出回避や機微データの窃取、データの操作などを目的とし、悪名高いバンキング型トロイの木馬ファミリが使っている技術について調査します。またそれらの技術をどのようにブロックするかについても解説します。本稿で取り上げるマルウェアファミリは、Zeus、Kronos、Trickbot、IcedID、Emotet、Dridexなどです。

パロアルトネットワークスのお客様は、Cortex XDRWildFireによりこれらの攻撃から保護されています。

本稿で取り上げたバンキング型トロイの木馬ファミリ ZeusKronosTrickbotIcedIDEmotetDridx

目次

Webインジェクション(Webinjects)とは
Webインジェクションの検出方法
プロセス生成時のWebブラウザ感染
プロセス生成時のWebブラウザ感染試行を防止する方法
インジェクトされたプロセス間の名前付きパイプによる通信
インジェクトされたプロセス間の名前付きパイプの通信を防止する方法
Heaven’s Gateを使うインジェクション技術
Heaven's Gateを防止する方法
エントリポイントパッチによる回避型プロセスハロウイング
エントリポイントパッチによる回避型プロセスハロウイングを防止する方法
PEインジェクション
PEインジェクションを防止する方法
フックによるプロセスインジェクション
フックによるプロセスインジェクションを防止する方法
AtomBombingを使うインジェクション技術
AtomBombingとその亜型を防止する方法
結論
IoC

Webインジェクション(Webinjects)とは

Webインジェクション(Webinjects)は、Webページの描画前にHTMLやJavaScriptをインジェクト(注入)できるモジュールのことで、ユーザーを騙すのによく使われています。バンキング型トロイの木馬、認証情報の窃取、Webページのフォームデータの操作などにおいて、この技術の悪用が知られています。ほとんどのバンキング型トロイの木馬ファミリには少なくとも1つWebインジェクションモジュールが存在します。

通常、バンキング型トロイの木馬の初期ステージャーは、バンキング型トロイの木馬の主体となるボットをWindowsプロセスにインジェクトします。そしてこのWindowsプロセスが、対象マシン上で利用可能なWebブラウザのプロセスに対し、Webインジェクションモジュールをインジェクトします(図1参照)。

Chrome、Internet Explorer、Firefox、Microsoft EdgeなどのWebブラウザのプロセスを経由してTrickbotがWebインジェクションモジュールでインジェクトする様子を示すコードスニペット。
図1. 反射型インジェクションと呼ばれるステルス技術を使い、TrickbotがWebインジェクションモジュールのインジェクト対象となるブラウザを1プロセスずつ探しているところ

Webインジェクションモジュールは、Webサーバーに送信されるデータの送受信や暗号化を担当するAPI呼び出しをフックします。暗号化前のデータを傍受することで、このマルウェアはHTTP POSTのヘッダを読み取って、その場で臨機応変に操作を行っています。

TrickbotがWebインジェクションモジュールでInternet Explorer、Microsoft Edge、Chrome、FirefoxなどのWebブラウザのプロセスを探す様子を示したコードスニペット。
図2. TrickbotのWebインジェクションモジュールがブラウザにもとづいてフックを配置しているところ
HttpSendRequestA、HttpSendRequestW、HttpSendRequestExA、HttpSendRequestExW、InternetCloseHandleなどの Wininet.dll関数にTrickbotがフックを配置する様子を示したコードスニペット。
図3. Trickbotがwininet.dll関数にフックを配置しているところ

Webページの描画直前にHTTPヘッダを完全に制御下に置くことにより、このマルウェアはフォームをすっかり変更してユーザーを欺すことができます。たとえば、HTMLやJavaScriptのコードをインジェクトし、ユーザーがうっかりPINコードやクレジットカード番号などの機微情報を入力するように仕向けてから、それらの情報を収集することもできます。また、ユーザーの意図していたWebページサーバーには偽造ヘッダを送信せず、抽出した情報をコマンド&コントロール(C2)サーバーに送信することもできます。

Chrome (chrome.dll) Firefox (nspr3.dll / nspr4.dll) Internet Explorer / Edge (Wininet.dll)
ssl_read PR_Read HttpSendRequest
ssl_write PR_Connect InternetCloseHandle
PR_Close InternetReadFile
PR_Write InternetQueryDataAvailable
HttpQueryInfo
InternetWriteFile
HttpEndRequest
InternetQueryOption
InternetSetOption
HttpOpenRequest
InternetConnect

表1 フックの対象にされやすいAPI関数

Webインジェクションの検出方法

この技術はWebブラウザプロセスへのインジェクションを検知すれば防げます。インジェクトされたスレッドはNtProtectVirtualMemory関数を呼び出します。このさい引数NewAccessProtectionにはPAGE_EXECUTE_READWRITEが、BaseAddressにはバンキング型トロイの木馬が標的とするライブラリ関数へのアドレスが指定されます。

たとえば、TrickbotのさまざまなバージョンがVirtualProtectVirtualProtectExを両方使っています。NtProtectVirtualMemoryの呼び出しを検査すれば両方カバーできます。

バンキング型トロイの木馬の中には、コードインジェクションをあえて使わず、リモートプロセスのスレッドをサスペンドしてリモートからフックを配置するものもあります。リモートからのNtProtectVirtualMemory呼び出しを検査すれば、この亜型の技術も検出できます。

NtProtectVirtualMemoryのプロトタイプを示すコードスニペット。
図4. NtProtectVirtualMemoryのプロトタイプ

プロセス生成時のWebブラウザへの感染

一部のバンキング型トロイの木馬は、標的プロセスを生成するであろう親プロセスにコードをインジェクトしておくことで、標的プロセスが生成されると同時に感染することを狙います。親プロセスのコンテキストで実行されたトロイの木馬は、プロセス生成ライブラリ関数をフックして本来の標的プロセスが作成されるまで待機します。

フック内部ではバンキング型トロイの木馬がプロセスの生成フローを操作し、たとえばリモートプロセス内のWebインジェクションモジュールを初期化する処理などを行っています。explorer.exeruntimebroker.exeは、標的プロセスの親プロセスになることが多いので、この目的で頻繁に悪用されています。

たとえば、Kariusというバンキング型トロイの木馬は、explorer.exeにコードをインジェクトし、CreateProcessInternalWをフックするかたちでこの技術を悪用していました。トロイの木馬のフックハンドラは、生成されたWebブラウザのプロセスを探し、悪意のあるWebインジェクションモジュールをその中にインジェクトします。

プロセス生成時のWebブラウザ感染試行を防止する方法

この技術はexplorer.exeruntimebroker.exeへのインジェクションを探すことで防げます。そのさいはインジェクトされたスレッドによるNtCreateUserProcessNtCreateProcessExCreateProcessInternalWCreateProcessACreateProcessWなどのプロセス生成関数へのフックを探します。

インジェクトされたプロセス間の名前付きパイプによる通信

多くのバンキング型トロイの木馬は、脅威アクターの制御下にあるプロセス同士の通信に名前付きパイプ(named pipe)を使います。そのさいは、まず主体となるボットをWindowsのプロセスの1つにインジェクトしてから、モジュールの目的に応じて別プロセスに別モジュールをインジェクトします。その後、名前付きパイプで異なるプロセス間の通信を確立します。

たとえば、Trickbotはsvchost.exeに主体となるボットをインジェクトします。これが名前付きパイプサーバーを作成し、WebインジェクションモジュールをWebブラウザに反射型インジェクションによりインジェクトします。インジェクトされたモジュールは、パイプクライアントとして同じ名前のパイプに接続し、主体となるボットと通信し、取得した認証情報をC2サーバーに送信します。

Trickbotが名前付きパイプサーバーを作成する様子を示したコードスニペット。
図5. Trickbotの名前付きパイプサーバー

インジェクトされたプロセス間の名前付きパイプの通信を防止する方法

この技術は名前付きパイプのイベントを検査すれば防げます。インジェクトされたスレッドはWindowsプロセス内に名前付きパイプを作成します。またWebブラウザ内に存在する別のインジェクトされたスレッドは同じ名前付きパイプに接続しようとします。

Heaven’s Gateを使うインジェクション技術

マルウェアが使う技術のひとつにHeaven's Gateがあります。この技術は、セグメントセレクタ0x33を使ってfar jump/callを実行することで、32ビット(WoW64)プロセスが64ビットコードを実行できるようにします。最近のマルウェアは、Heaven's Gateを使うことで、x64システム上の単一32ビットプロセスから64ビットと32ビット両方のプロセスにインジェクションを行います。Heaven's GateはWoW64のAPIフックを回避し、一部のデバッガの解析を妨害し、一部のサンドボックスのエミュレーションを失敗させます。

古い技術ですが今でも有効でよく使われています。

TrickbotとEmotetのローダーは、WoW64プロセスから64ビットsvchost.exeへのプロセスハロウイングにHeaven's Gateを使います(プロセスハロウイングの詳細については、エントリポイントパッチによる回避型プロセスハロウイングのセクションを参照してください)。この2つのトロイの木馬のアーキテクチャは、主体となるボットがsvchost.exe内に常駐し、Webコンテンツ操作モジュールと認証情報窃取モジュールがブラウザプロセス内に常駐するようになっています。

EmotetがMicrosoft Outlook Messaging APIモジュールでHeaven's Gate技術を使うようす
図6. EmotetがMicrosoft Outlook Messaging API (MAPI)モジュールでHeaven's Gate技術を使うようす

Heaven's Gateを防止する方法

WoW64プロセスは通常、x64 CPUモードへの移行をwow64cpu.dll経由で行います。Heaven's Gateはこの移行を手動で行います。

そこで、WoW64プロセスのシステムコールがwow64cpu.dllを経由しなかったかどうかを検査すれば、Heaven's Gateを発見できます。そのためには、重要なAPIにフックを配置し、スタックトレースを生成し、生成したスタックトレースをwow64cpu.dllを対象に検査すればよいことになります。

通常のWoW64のシステムコールフロー。
図7 通常のWoW64のシステムコールフロー

エントリポイントパッチによる回避型プロセスハロウイング

プロセスハロウイングは、正当なプロセスをサスペンドモードで新たに作成し、そのメインイメージをアンマップして悪意のあるコードに置き換えるプロセスインジェクション技術です。新たに作成されたプロセス内には悪意のあるコードが書き込まれ、サスペンドされたスレッドのコンテキスト命令ポインタが、NtGetContextThread/NtSetContextThreadによって変更されます。

セキュリティ製品ベンダは、NtGetContextThread/NtSetContextThreadの使用と組み合わされたメインイメージのアンマップをチェックし、プロセスのハロウイング(空洞化)を検出しています。

既知の検出回避技術として、NtGetContextThread/NtSetContextThread関数を使わず、またはメインイメージをアンマップせずに、プロセスのエントリポイントに小さなjumpでパッチを当ててペイロードへ実行をリダイレクトする技術があります。たとえばTrickbotやKronosがこの技術を使っています。

Kronosはサスペンドされたsvchost.exeを独自のプロセスにマッピングし、自身のメモリアドレス空間内でパッチを適用しています。ほかのバンキング型トロイの木馬と同様に、Kronosのメインモジュールはsvchost.exe内で動作し、リモートのsvchost.exeプロセスから全体のオペレーションを指揮していました。

Trickbotは、まずプロセスのエントリポイントでVirtualProtectExを使い、次にWriteProcessMemoryを使ってフックのスタブを書き込むことで、プロセスハロウイングを実現しています。

Kronosがsvchost.exeをマッピングしてそのエントリポイントにパッチを当てる様子を示すコードスニペット。
図8. Kronosがsvchost.exeをマッピングしてそのエントリポイントにパッチを当てるようす
図9 Kronosのフックスタブ用テンプレート – pushとretにx86のオペコードを使っている
図9 Kronosのフックスタブ用テンプレート – pushとretにx86のオペコードを使っている

エントリポイントパッチによる回避型プロセスハロウイングを防止する方法

この技術は、NtWriteVirtualMemoryないしNtProtectVirtualMemoryの呼び出しで与えられるアドレス引数がリモートプロセスのエントリポイントかどうかを検査したり、svchost.exeのメモリの読み取りや疑わしいリモートマッピングを検出すれば防げます。

PEインジェクション

バンキング型トロイの木馬がよく使うインジェクション技術のひとつに、WriteProcessMemoryを使ってリモートプロセスにマップされたPEを書き込む方法があげられます。マルウェアの中には、PEヘッダを消去するなど、バッファからアーティファクト(痕跡)を消すことで呼び出しを隠そうとするものがあります。

たとえば、Zeusの亜種はこの技術を使ってほかのプロセスに自身をインジェクトし、隠れたままでいられます。また、Webインジェクションを実行して金融データを盗むこともあります。

Zeusのインジェクションコードのコードスニペット(流出したソースコードからの抜粋)。
図10 流出したソースコードから抜粋したZeusのインジェクションコード

PEインジェクションを防止する方法

この技術は、NtWriteVirtualMemoryに送られたバッファに実行可能なアーティファクトがないか検査することで防げます。

フックによるプロセスインジェクション

フックの配置もインジェクション技術として使われることがあります。バンキング型トロイの木馬のメインペイロードを正規のプロセスにインジェクトすると、ステルス性を維持しつつエンドポイント保護による検知を回避しやすくなります。

この技術はフックを使ってコードを実行させます。そのさいは、頻繁に呼び出されるAPI関数にペイロード/シェルコードへのジャンプをフックさせています。これにより、CreateRemoteThreadNtSetContextThreadなどのコードインジェクション技術によく使われる疑わしいAPIの呼び出しを回避できます。

たとえば、IcedIDはAPIフックを使って、ハロウイング(空洞化)したsvchost.exeのインスタンスに、主体となるボットをインジェクトしています。この技術はZwClose技術としても知られています(ZwCloseはZberpというマルウェアがフックしたAPIで、このとき初めてこのインジェクション技術が実地で使われた)。

IcedIDのインジェクションのフローはZberpのそれとは若干異なります。IcedIDの場合、まずNtCreateUserProcessをフックし、次にCreateProcessAを呼び出してsvchost.exeを作成します。このとき、特別なパラメータや引数は指定しません。通常のフローであれば、新しく作成されたsvchost.exeはすぐに終了するはずです。

IcedIDがsvchost.exeのフックを開始した様子を示すコードスニペット
図11 IcedIDがsvchost.exeのフックを開始しているところ
NtCreateUserProcessをフックするIcedIDのコードスニペット。
図12 IcedIDがNtCreateUserProcessをフックしているところ

ところがIcedIDの場合、NtCreateUserProcessをフックしたためにCreateProcessAの呼び出し直後にフックハンドラが呼び出されます。このハンドラ内では以下が行われます。

  • NtCreateUserProcessをアンフックする
  • NtCreateUserProcessを呼び出す(これによりsvchost.exeが作成される)
  • RtlDecompressBufferを使い、インジェクトするペイロードを含むローカルバッファを解凍する
  • リモートのsvchost.exeプロセスにペイロード用のメモリを確保する
  • NtAllocateVirtualMemoryZwWriteVirtualMemoryを使ってリモートのsvchost.exeにペイロードを書き込む

IcedIDは、新しく作成したsvchost.exeRtlExitUserProcessをペイロードへのjumpスタブでフックすることでこれを実行しています。前述した通り、svchost.exeはパラメータなしで作成されていて、終了しようとしますが、IcedIDのフックがあるのでペイロードにジャンプしてしまいます。

RtlExitUserProcessをフックしているIcedIDのコードスニペット。
図13. IcedIDがRtlExitUserProcessをフックしているところ

フックによるプロセスインジェクションを防止する方法

この技術は、NtProtectVirtualMemoryNtWriteVirtualMemoryの呼び出しを検査すれば防げます。NtProtectVirtualMemoryに与えられるアドレス引数はいずれかのWindowsライブラリからエクスポートされた関数で、NtWriteVirtualMemoryの書き込みバッファはフック用スタブです。いずれの場合もリモートプロセスは既知のインジェクション対象となります。

AtomBombingを使うインジェクション技術

AtomBombingは、セキュリティベンダが監視している疑わしいAPI呼び出しを避けてマルウェアにコードをインジェクトさせる技術です。Dridexは若干の修正を加えたAtomBombingテクニックを使い、Windowsプロセス(通常explorer.exe)にステージの1つをインジェクトし、さまざまな手順をふんで、金融データを盗もうとします。

AtomBombing技術を使うマルウェアはまず、どのプロセスからでもアクセスできるグローバルなアトム(Atom)テーブルにペイロードを書き込みます。つぎに、NtQueueApcThreadを使って標的となるプロセススレッドのAPCキューに非同期プロシージャコール(APC)をディスパッチし、当該プロセスに強制的にGlobalGetAtomAを呼び出させます。

次に標的スレッドは、グローバルアトムテーブルからペイロードを取得し、標的プロセスのメモリ空間内のRead/Write(RW)領域(kernelbase.dllデータセクション内のコードケーブ)に挿入します。ペイロードはNULL終端文字列で分割されていること、各文字列に対してアトムが生成されていることが必要です。

実行にあたっては、インジェクタプロセスがNtQueueApcThreadを使って別のAPCをディスパッチし、リモートプロセスにNtSetContextThreadを強制的に実行させます。その後、インジェクトされたプロセスはNtSetContextThreadを呼び出し、これによりExecute/Read/Write(RWX)メモリを割り当てるROP(return-oriented programming)チェーンを呼び出します。次にこのROPチェーンがRW領域から新たに割り当てられたRWX領域にペイロードをコピーし、最終的にこれを実行します。

AtomBombingの背景にあるユニークな発想がwriteプリミティブで、これのおかげでアトムテーブルとAPCを使うリモートプロセスへの書き込みが可能になっています。

Dridexはmemsetを呼び出すAPCをキューイングするAtomBombingの一種を使い、ntdll.dllのRW領域をクリーンアップしています。その後、ntdll.dllのRW領域への書き込みと同じ技術を使って、ペイロードとそのインポートテーブルを標的プロセスにコピーしています。

実行にあたってDridexはNtProtectVirtualMemoryを使ってコピーしたペイロードのメモリを実行可能なメモリに変更します。その後、NtProtectVirtualMemoryを呼び出して同じwriteプリミティブを使うことでGlobalGetAtomAをフックしています。最終的には、パッチを当てたGlobalGetAtomAにAPCをキューイングしてペイロードを実行させます。

AtomBombingの概念実証のコードスニペット
図14 AtomBombingの概念実証コード

AtomBombingとその亜型を防止する方法

この技術はNtQueueApcThread/NtSetContextThreadの呼び出しに与えられた引数が、疑わしいAPIに向けられているかどうかを検査すれば防げます。たとえばNtQueueApcThreadであればAPCルーチンの引数、NtSetContextThreadであればコンテキスト引数内に新たな命令ポインタが与えられているかどうかを検査します。どちらのAPI呼び出しもリモートプロセスから呼び出す必要があります。

結論

金銭目的の脅威アクターは、インジェクションや金融詐欺のため、さまざまなマルウェア技術を使い、常に新たな回避技術の開発を模索しています。本稿では、興味深いバンキング型トロイの木馬の技術と、それらの技術が被害者の機微データ窃取にどう利用されているかを見てきました。さらにこれらの技術を利用して悪意のある行動を検出・防止する方法についても見てきました。

Cortex XDRをお使いのパロアルトネットワークスのお客様は、こうした攻撃から以下の多段階の防御レイヤーで保護されています。

  • ローカル分析機械学習モジュール
  • 振る舞い防御(BTP)
  • 振る舞いにもとづくIoC(BIOC)、Analytics BIOCsルール

これらの多段階の保護レイヤーが、バンキング型トロイの木馬さまざまな実行段階で使う戦術や技術を識別します。

またパロアルトネットワークスのお客様はCortex XDRまたは次世代ファイアウォール用のWildFireクラウド配信セキュリティサブスクリプションによっても本稿で取り上げた攻撃から保護されています。

IoC

  • Trickbot
    • testnewinj32Dll.dll: 4becc0d518a97cc31427cd08348958cda4e00487c7ec0ac38fdcd53bbe36b5cc
    • Webインジェクション(Webinjects): ef6603a7ef46177ecba194148f72d396d0ddae47e3d6e86cf43085e34b3a64d4
  • Emotet: dd20506b3c65472d58ccc0a018cb67c65fab6718023fd4b16e148e64e69e5740
  • Kronos: aad98f57ce0d2d2bb1494d82157d07e1f80fb6ee02dd5f95cd6a1a2dc40141bc
  • Zeus: 0f409bc42d5cd8d28abf6d950066e991bf9f4c7bd0e234d6af9754af7ad52aa6
  • IcedID: 358af26358a436a38d75ac5de22ae07c4d59a8d50241f4fff02c489aa69e462f
  • Dridex: ffbd79ba40502a1373b8991909739a60a95e745829d2e15c4d312176bbfb5b3e