McAfee Avert Labs Blog
W32/Winemmem - Know Your Enemy」より
April 9,2009 Posted by Vitaly Zaytsev

 マルウエア感染を拡大させる際に最初に必要になる条件は何か,覚えているだろうか。答えはユーザーの欲求を利用することだ。ユーザーが自ら求めない限り,マルウエアに感染したファイルはまずダウンロードされない。では,2番目の条件は何か。大抵のウイルス対策ソフトから検出されないようにすることだ。我々は2008年4月第1週,こうした条件を備える新たな感染手段を発見した。

 最近のマルウエア作者は,メールを大量に送り付ける感染拡大策をとらず,多くのユーザーが使っているソフトウエアの開発元を狙うようになってきた。こうした状況で,我々は複数のソフトウエア・ベンダーから「マルウエアに感染した疑いがある」という相談を受けた。大量のユーザーに提供したインストーラとソフトウエア・パッケージのハッシュ値が,本来の値と食い違っていることに気付いたという。

 まず,インストール用パッケージを作るツールの機能を簡単に説明しておこう。インストーラ作成ソフトは,インストール用ウィザードとして機能するWindowsアプリケーションを生成する。その際,インストール対象ソフトの機能やデータ・ファイルはオリジナルのまま保ち,手を加えない。より高機能なインストーラ作成ソフトは,メーカー名/バージョン/セットアップ名/デスクトップ用アイコン/著作権説明文/スタートメニュー用アイコン/インストール用フォルダのパス/ライセンス文を加えた自己展開型ファイルを生成する。セットアップ処理プログラムはインストール/アンインストール機能を備え,複数のアプリケーション用ファイルを一つの実行可能ファイル(拡張子は「.exe」)にまとめる。

 複数の実行可能ファイルで構成されたパッケージは,強力なインテグリティ・チェック機能で保護されており,デジタル署名を施したファイルもある。自己展開型の実行可能ファイルを作る際,プロのセットアップ・ツール開発者なら製品を守り,損傷や改変がないことを確認するために,データ展開前にインストーラのインテグリティを調べるなど常識だ。チェックサム値の計算といった保護機能は,ユーザーが多い自己展開型アーカイブの作成ツール(「WinRar」「WinZip」)やインストーラ(「NSIS」「Astrum」「InstallShield」),ソフトウエア保護システム(「ASProtect」「Themida」「Armadillo」)などには例外なく実装されている。インストーラに異常があれば(例えば,どこか1バイトでも改変されたなど),エンドユーザーはエラー・メッセージで気付くことになる。ただし当ブログ記事で紹介する事例では,パッケージやインストーラを実行してもユーザーは異常に気付かず,ウイルス対策ソフトも全く警告を発しなかった。

 我々は5種類ほどのインストーラをサンプルとして受け取った。いずれの実行可能ファイルも商用またはオープンソースのセットアップ・ツール作成ソフトで生成/パッケージ化されており,ファイルの最後に追加データ(オーバレイ)が入っていた。通常は,追加データ部分には圧縮/暗号化したデータを格納する。サンプルを実行したが特に目立った予想外の動作はせず,展開されたファイルも汚染されていなかった(展開ファイルの多くは実行可能ファイルで,施されていたデジタル署名に異常はない)。インストーラ内のファイルが改変されていないことを考えると,インストーラそのものがマルウエア配布用に細工されたはずだ。そこで,米マカフィーAvert Labsの調査チームに詳しく調べるよう依頼した。

 すると30分ほどで「W32/Winemmem」識別用の汎用シグネチャがマルウエア対策用データベースに追加され,サンプルに感染したウイルスを検出/除去できるようになった。これでサンプルは安全に実行できる。

 このウイルスの仕組みを調べることで,インストーラに感染してインテグリティ・チェック機構をクリアできる理由を解明しよう。W32/Winemmemはソフトウエア・パッケージやインストーラ,自己展開型アーカイブ(「オーバレイ」と呼ばれる追加データの入ったファイル)といったアプリケーションに感染する。そして,アプリケーションのコード・セクション(以下の図の1番)を書き換え,ランダムなサイズのコード・ブロックをコード・セクションの先頭とオリジナル・エントリ・ポイント(OEP:同2番)からファイルの終端(同3番と同4番)に配置し直し,追加データのサイズを増やす。新たにセクションを作ったり,ポータブル・エクゼキュータブル(PE)ヘッダーを改変したりはしない。W32/Winemmemは,この感染ファイルの実行時にOEPにあるコードを書き換えて制御権を奪う。

 感染済みファイルが実行されると,W32/WinemmemはAPI「CreateFileA()」にフックを設定する。制御権を得たW32/Winemmemは,Windowsの「Program Files」フォルダ内でPE形式の実行可能ファイルを探す。そしてインポート・テーブルを解析し,この実行可能ファイル(EXE)の使うダイナミック・リンク・ライブラリ(DLL)を検索する。さらに,こうして見付けたDLLをEXEの入っているフォルダにコピーし,DLLのエントリ・ポイント(EP)を書き換え,ウイルス本体を最終セクションに添付することでDLLに感染する。こうして,感染済みEXEの実行時に攻撃用コードも必ず実行できるようになる。Program Filesフォルダ内の感染済みファイルが実行されることで,ウイルス本体はAPI「WS2_32.dll Send()」をフックし,感染ファイルからの呼び出しで悪質な活動を始める。パソコンに接続された全ドライブから悪用できる実行可能ファイルを探すので,リムーバル・ドライブのファイルにも感染できる。遠隔ホストからファイルをダウンロードして実行する機能も備えている。

 インストーラは改変され,コード・セクションとファイル・サイズが変更されているのに,なぜインテグリティ・チェックが実行されず,ユーザーに問題を警告しないのか。感染済みファイルの実行後,ウイルスはコード・セクション先頭とOEPからデータをファイルに書き戻し,ハード・ディスク上のインストーラを本来の状態に戻す。ただし,Windowsは以前よく起きた「仲裁更新」問題の発生を回避する目的で,ファイルをロックして書き込めなくしている。ウイルスはこの防御システムを回避するためにカーネル・モード・ルートキット(MD5署名は「CE769EAE2F1A7A4ED622C15E715D851E」)を仕込み,「ntoskrnl.exe」内のカーネル・モードAPI(具体的な関数名はセキュリティ上の理由から記載しない)にフックを設ける。我々が調べたところ,このAPIは,何らかのファイルが削除やオープン,書き込みアクセスされる際にWindowsのファイル・システムから呼び出される。ルートキットのすべき処理は,このAPIをフックして入力パラメータを確認することだけだ。具体的には,二つのアセンブリ命令でAPIの先頭部分を書き換えることで,呼び出し時に毎回1を返すよう先頭8バイトを操作している。

 この8バイト部分はWindowsのユーザーと同様,ハード・ディスク上にある好きなファイルを削除できる。実行中のファイルだろうが,ロード済みDLLだろうが,何らかのプロセスにロックされたファイルだろうが,ファイルならどれでも削除可能だ。実際に試したところ,「Windows」フォルダをエラーや警告など出さずに削除できた。

 ところで,API「ExitProcess()」と「ExitWindowsEx()」のフックにはどういった目的があるのだろうか。ハード・ディスク上の本来のファイルにウイルス本体は入っていないので(前述した通り,ウイルスはメモリー上に存在し,ハード・ディスク上のファイルは正真性の確認機構をクリアするために修復済みである),W32/Winemmemはファイルに再度感染しなければならない。そこで,ユーザーが(ExitProcessで)インストーラを終了する際や(ExitWindowsExで)Windowsを再起動するときをフックで捉えるのだ。

 次に,W32/Winemmemは当記事の冒頭で挙げた2番目の条件――ウイルス対策ソフトの監視から逃れること――をどうやって満たしているのだろうか。ポリモーフィック機能(関連記事:ITPro Dictionary「ポリモーフィック」)を備えていないマルウエアであるにもかかわらず,少数の例外(以下の表に掲載されていない,ルートキット検出が可能なセキュリティ・ベンダーの製品)を除くと,今のところ多くのセキュリティ製品がW32/Winemmemを見逃してしまう(4月8日におけるオンライン・セキュリティ検査サービス「VirusTotal」の結果は以下の通り)。

 ところでこのW32/Winemmemの亜種は,感染したファイルをオリジナル状態へ戻すのに必要な全情報を,暗号化していない定数オフセット値を使って保存する。簡単なコードを書いて,OEPから0x159離れたところにあるテーブルを調べてみよう。勝手に移動されたデータのサイズなどが書き込まれている。


Copyrights (C) 2009 McAfee, Inc. All rights reserved.
本記事の内容は執筆時点のものであり,含まれている情報やリンクの正確性,完全性,妥当性について保証するものではありません。
◆この記事は,マカフィーの許可を得て,米国のセキュリティ・ラボであるMcAfee Avert Labsの研究員が執筆するブログMcAfee Avert Labs Blogの記事を抜粋して日本語化したものです。オリジナルの記事は,「W32/Winemmem - Know Your Enemy」でお読みいただけます。