(注意: このブログ記事は、9 月 2 日に執筆したものです。サーバーをシャットダウンし、ドメイン名を遮断するための共同の努力が続いていたため、投稿を延期していました。調査したのは最新の亜種ではありませんが、この脅威の機能は正確に反映されています。)
Trojan.Bamital は 2010 年の夏に登場しましたが、この脅威が真の流行を見せたのは B 亜種が見つかった直後の、2011 年初頭のことでした。Bamital は、各種のブラウザに侵入し、検索結果を改ざんしてユーザーを広告リンクにリダイレクトしようとします。今回の記事では、Bamital の最近の亜種を詳しく調べ、クリック詐欺の手法がどのように実装されているか、その実態をさぐることにします。
インストール
Bamital はUPX 圧縮された実行可能ファイルの形をとっています。実行されると、%CommonFiles% フォルダに 2 つのコンポーネントを投下します。
- %CommonProgramFiles%\nt.dll。Bamital のメインコンポーネントをロードする際に使われる小さい DLL ファイル。
- %CommonProgramFiles%\dll。Bamital のメインコンポーネント。名前からは DLL ファイルかと思われますが実際にはそうではなく、ただのバイナリファイルです。このファイルが既存のプロセスにインジェクトされます。
トロイの木馬 Bamital はユーザーが管理者権限で実行中かどうかを調べます。Windows Vista または Windows 7 を検出した場合には、続行するためにプロセスの昇格も要求します。次に Bamital は、新しいプリントプロセッサを登録することによって、nt.dll ローダーの起動をトリガします。その上でさらに、セキュリティソフトウェアをくぐり抜けるために ntdll!ZwConnectPort をフックし、プリントプロセッサの追加中には別のスプーラデバイス文字列を返すようにします。
プロセスに権限が付与または昇格されない場合、Bamital はタスクスケジューラの脆弱性を利用して権限の昇格を図ります。この脆弱性はもともと、Stuxnet によって広まったものです。Windows Vista または Windows 7 で特権プロセスとして実行できない場合、Bamital は終了します。Windows XP の場合、Bamital は実行されますが、explorer.exe の感染(後述)は発生しません。
プリントプロセッサと ZwConnectPort のフックを組み合わせ、最後の手段としてタスクスケジューラの脆弱性も使う手法は、明らかに最新バージョンのTidserv(TDL4)の模倣です。
システムへの感染
予定どおりに進んだ場合、ローダーが最初に実行されるのは spoolsv.exe プロセス内です。ローダー独自の役割は、メインコンポーネント(dll)の内容をマップして実行することにあります。
どちらのコンポーネントも、コピーが %System% フォルダに投下されます。
感染するのは、explorer.exe システムファイル(Windows におけるデフォルトのウィンドウマネージャ)です。感染は、ローダーコンポーネントの実行を目的とした単純なエントリポイントの上書きです。Windows XP が感染する場合には、winlogon.exe ファイルが感染するほか、%System%\dllcache にある explorer.exe と winlogon.exe 両方のキャッシュコピーも感染します。Windows Vista や Windows 7 の場合には、wininit.exe が感染しますが、キャッシュコピーは影響を受けません。また、Windows のシステム復元機能も改変されます。
このように重要なシステムプロセスのファイルが感染するので、システムの起動時には自動的に Bamital が実行されることになります。
プロセスインジェクション
Bamital は Web ブラウザのプロセスを監視し、そのプロセスに対してインジェクションをしかけます。現時点では、4 つのブラウザが攻撃対象になっており、2 種類のインジェクション手法が使われています。
第 1 の手法では、以下のようにプロセスの作成時にインジェクションが実行されます。
- explorer.exe プロセスの内部で、プロセスの作成を監視するために、非公開の ntdll!CreateProcessInternalW API がフックされます。
- 標的となるブラウザが検出された場合には、一時停止モードでプロセスが作成されます。
- メインコンポーネントのコピーを含むメモリセクションが、ターゲットプロセスに作成されます。
- このメモリセクションを実行するために、APC がキューに入れられます。
- プライマリスレッドが再開され、メインコンポーネントの実行がトリガされます。
第 2 の手法では、標準のプロセス列挙を伴います。標的のブラウザが検出された場合に、Bamital は以下のように処理を実行します。
- ターゲットプロセスを一時停止します。
- メモリマップを作成し、メインコンポーネントをそこにコピーします。
- kernel32.dll のメモリコピーを作成し、WaitForSingleObject API に感染します。これで、この API が実行されたときにもメインコンポーネントの実行がトリガされるようになります。
- 正常な kernel32 イメージの代わりに、感染した kernel32 イメージをマップします。
- ターゲットプロセスを再開します。
kernel32!WaitForSingleObject API は頻繁に使われるので、メインコンポーネントが実行されるまでに時間はかかりません。ブラウザ内でメインコンポーネントが実行されると、クリック詐欺のサブコンポーネントが実行されます。クリック詐欺の動作は、以下のとおりです。
クリック詐欺の実装
クリック詐欺の背後には、広告リンクをクリックさせて収益を上げようという動機があり、方法としては自動、手動、または分散型の 3 つがあります。Bamital のクリック詐欺手法は、Xpaj.B で実装されている手口に酷似しています。この脅威について詳しく知りたい場合には、Xpaj.B に関するホワイトペーパーをぜひお読みください。
コマンド & コントロールサーバーとの通信
まず、Bamital はそのコマンド & コントロール(C&C)サーバーにアクセスします。サーバーの場所は、時間ベースのドメイン生成アルゴリズムを使って毎日変更されます。時刻は、検索エンジンに対して GET クエリーを発行して取得されます。MD5(<C><time-of-day>).co.cc という形のドメイン名を使って、最大 26 のドメインが試行されます。
- <C> は A から Z までの 1 文字です。
- <time-of-day> は、HTTP サーバーから返されるタイムスタンプ文字列です。たとえば、9 月 2 日に使われた候補のひとつは MD5(A02 Sep 2011).co.cc で、これは 5fe6c34bbc48b7832393da580e19de23.co.cc に変換されます。
Bamital は、C&C サーバーに対して次のクエリーを発行します。
http://<cnc>/message.php?subid=<subid>&br=<brtype>&os=<osver>&flg=<flag>&id=<machineid>&ad=&ver=_if<version>
各フィールドの意味は以下のとおりです。
- subid: 重複のない脅威の ID。元の Bamital 実行可能ファイルの上位のワードに埋め込まれています。この ID がアフィリエイト ID である可能性もあり、その場合には標準の PPI 方式を介して第三者に Bamital が拡散するおそれがあります。
- brtype: インジェクションを受けるブラウザのタイプ。たとえば「IE_x」は Internet Explorer を意味します。
- osver: OS のバージョン情報。xy という形式で、その意味は次のとおりです。
o x はメジャーバージョンタイプ(1 = Windows XP、2 = Windows Vista、3 = Windows 7、4 = その他)
o y はメジャー Service Pack 番号
- machineid: 長さ 32 文字の 16 進文字列。コンピュータのさまざまな特性から成る MD5 ハッシュで、危殆化したコンピュータを一意に識別します。
- version: Bamital のバージョン情報。現時点で、最新バージョンは 21 のようです。
C&C サーバーは、マークアップ言語としてフォーマットされたデータのエンコード済み BLOB を返します。その情報は主に以下のとおりです。
- 広告へリダイレクトされるリンクを表示するためのサーバーの場所。
- (省略可能)Bamital の更新バージョンへのリンク。
- (省略可能)C&C サーバー用の更新後のドメイン。このドメインが DGA ベースのドメインより優先されます(応答なしと判明しない限り)。
- 可能性として、重要性の低いデータ。
最も重要なデータは、広告サーバーの URL です。現在、この URL は次の形式です。
http://click[削除済み].info/x.php?subid=<subid>&key=<querystring>
subid フィールドは、Bamital 独自の値に置き換えられます。この事実からも、この値がアフィリエイト ID である可能性が裏付けられます。
ユーザーによる検索の監視
Microsoft 社の Bing などの代表的な検索エンジンに対する検索クエリーが監視されます。この目標を達成するために、Bamital はブラウザ内で以下のソケット API をフックします。
- recv と send
- WSARecv と WSASend
- closesocket
- getaddrinfo
- DnsQuery_W と WSAAsyncSelect
- gethostbyname
- getaddrinfo と WSAGetOverlappedResult
ユーザーがいずれかの検索エンジンに対して検索クエリーを発行すると、検索結果の一覧が横取りされます。検索結果でリンクがクリックされると、Bamital が制御を取得し、以下のように処理を実行します。
- まず、Bamital の広告サーバー(現在は click[削除済み].info で、米国の 173.244.[削除済み] に解決されます)に対してクエリーを発行します。
o 検索クエリー文字列が「buy xx(xx 購入)」だった場合、クエリーされる URL は次のようになります。
http://click[削除済み].info/x.php?subid=<subid>&key=buy+xx
- 広告サーバーが、<i>AdUrl</i><r>Referrer</r> という形式で小さい応答を返します。たとえば、<i>http://xx.230.138.178/c.php?s=[...]</i><r>http://pheromone-oil.com/search/?q=buy+xx</r> などです。
o AdUrl は、オンライン広告サービス企業にリンクしています。広告 Web サイトの一部は Bamital によって使われ、その一部は正規のサイトです。
o Referrer リンクは、広告プロバイダを欺くために「Referer」HTTP フィールドとして設定されます。
- Bamital は次に、偽の 302 レスポンスを生成して、Referrer リンクにユーザーをリダイレクトします(Referrer リンクのホスト名は、Bamital によって強制的に検索エンジンサイトに解決されます。技術的には珍しい手法ですが、WinInet によって後続の HTTP クエリーで HTTP の Referer フィールドを適切な値に設定するには簡単な方法です)。
- Bamital は小さい JavaScript スタブを応答にインジェクトし、それがユーザーを AdUrl にリダイレクトします。
- AdUrl がユーザーを広告ページにリダイレクトします。
Bamital の作成者は、こうして広告プロバイダから金銭を受け取ります。広告プロバイダ自身は、宣伝対象である Web サイトから金銭を受け取るので、クリック詐欺攻撃の直接の被害者はこの Web サイトということになります。
広告プロバイダが実装している送信元チェックを欺くために、リファラを利用する手口が使われています。リファラは、偽の検索エンジンをポイントするか、または単純に検索クエリーのように見える偽の URL(この例では http://.../search/?q=buy+xx)をポイントします。
クリック詐欺攻撃の概要を次の図にまとめました。
まとめ
Bamital は実に厄介です。残念ながら、Xpaj.B とは違って、利益額やクリック件数、表示された広告数など、感染の統計を示すことのできるデータは揃っていません。お客様は、ウイルス定義を最新の状態に保つようにしてください。
* 日本語版セキュリティレスポンスブログの RSS フィードを購読するには、http://www.symantec.com/connect/ja/item-feeds/blog/2261/feed/all/ja にアクセスしてください。