ファイル改竄検査をすり抜けるマルウェア

2011/03/09

マルウェア感染を拡大させる際に最初に必要になる条件は、ユーザーの欲求を利用することです。ユーザーが自ら求めない限り、マルウェアに感染したファイルは、まずダウンロードされません。では、2番目の条件は何でしょうか。答えは、大抵のウイルス対策ソフトから検出されないようにすることです。この二つの条件を満たした、非常に危険な感染手段について、今回は紹介します。

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

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

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

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

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

このウイルスの仕組みを調べることで、インストーラに感染してインテグリティチェック機構をクリアできる理由を解明しました。W32/Winemmemはソフトウェアパッケージやインストーラ、自己展開型アーカイブ(「オーバレイ」と呼ばれる追加データの入ったファイル)といったアプリケーションに感染します。そして、アプリケーションのコードセクションを書き換え、ランダムなサイズのコードブロックをコードセクションの先頭とオリジナルエントリポイント(OEP)からファイルの終端に配置し直し、追加データのサイズを増やします。新たにセクションを作成したり、ポータブルエクゼキュータブル(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の亜種は、感染したファイルをオリジナル状態へ戻すのに必要な全情報を、暗号化していない定数オフセット値を使用して保存します。簡単なコードを書いて、OEPから0x159離れたところにあるテーブルを調べてみると、勝手に移動されたデータのサイズなどが書き込まれているのが分かります。

※本ページの内容はMcAfee Blogの抄訳です。
原文:W32/Winemmem – Know Your Enemy