Symantec Security Response Weblog
Inside Trojan.Clampi: The Logger Module」より
October 12,2009 Posted by Nicolas Falliere

 前回のブログ記事で説明した通り,「Trojan.Clampi」はほとんどの機能を,それぞれに異なるモジュールを使って実現している。各モジュールは,クライアントの求めに応じて外部のゲートウエイ・サーバーから送られてくる。Clampiシリーズのブログ,今回はログイン情報を主に銀行系Webサイトから盗むモジュールの一つを取り上げよう。

 当記事で説明するモジュールは,Clampi内で「LOGGER」と呼ばれている。解読したモジュールの先頭部分にあったデータを,そのまま以下に掲載する(圧縮が施されていた)。

 Clampiは動作時に毎回LOGGERモジュールをダウンロードしないで済むよう,モジュールを暗号化して「Mxx」という値のレジストリに格納する。この「xx」には,0から数えた使用中モジュールの番号が入る(例えば「M02」といった値になる)。

 なおClampiのモジュールは標準的なDLLであり,Clampi本体と同じく実行コード仮想化に対応した商用ソフト保護ツールで身を守っている。

 LOGGERモジュールは,「Internet Explorer」(IE)のインスタンスに小さなコードを挿入し,「urlmon.dll」というWindowsの標準DLLによってインポートされるAPIに関連付けを持たせる(フックする)。urlmon.dllはIEがWebページを開く際に使うDLLである。フック対象のAPIは以下の通り。これらのAPI(フック)を利用すると,プログラム処理は,Clampiが感染したコードに誘導される。
・InternetConnectA
・InternetOpenA
・InternetSetStatusCallbackA
・InternetReadFileExA
・InternetOpenUrlA
・InternetCrackUrlA
・InternetReadFile
・InternetWriteFile
・HttpOpenRequestA
・InternetSendRequestA
・HttpSendRequestExA
・InternetQueryOptionA
・InternetQueryDataAvailable
・InternetCloseHandle

 以下のスクリーンショットは,IEに挿入されたコードである。

 感染パソコンでWebページにアクセスする都度,IEに挿入されたコードは該当WebページのURLの一部に巡回冗長検査(CRC)演算を施し,ゲートウエイ・サーバーから受け取ったデータ・ファイル内のリストとCRC値を比較する。一致する項目が見つかると,IEから(たいていの場合)金融関連のWebサイトに送信されるデータが,Clampiのゲートウエイ・サーバーにも送られるようになる。この処理によって,Clampiは様々なWebサイトあてのログイン情報やその他機密データを大量に盗み取る。

 以下は,キプロス共和国にある銀行のWebサイトにアクセスした際にClampiが送信したデータの例である。いい加減なID「abcdef」と暗証番号「123456」でログオンしたところ,それと同じ情報がモニター結果に現れた。

 URL比較にプレーン・テキストでなくCRC値を使う手口が優れている理由はいくつかある。
・URLをプレーン・テキスト以外の形式で保存すると,すぐには疑われにくい
・大量のURLにパターン・マッチングするには,CRC値を使った方が高速に処理できる
・URL全体をプレーン・テキストで保存するより,CRC値の方が短くて済む
・CRC演算は一方向関数であるため,CRCから元のURLを求めることは難しい。つまり,特定のWebサイトがマルウエアの監視対象かどうかは簡単に確認できても,監視されているWebサイトを網羅することはできない

 我々はLOGGERモジュールのコードとデータ・ファイルを付き合わせて,ファイル構造と各フィールドの用途を解明した。具体的な例として,このデータ・ファイルのCRCエントリについて説明しよう。下図の強調表示した部分を見てほしい。

 強調したフィールドは以下で説明した。

Index:0x359(「このファイルで857番目のエントリ」という意味)
Flags:0x4B
CRCカウント:1
 ―CRCタイプ:2(このファイル内のCRC値は99%がタイプ「2」だった)
 ―URLの長さ:0xA(10進数に直すと「10」)
 ―URLのCRC値:0x45DCA3D3