Symantec Security Response Weblog |
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