2005年11月09日 - md5ハッシュ値と、改竄・改変ファイルの検出

MD5(Message Digest 5)とハッシュ


 hashe(ハッシュ)・message digest(メッセージダイジェスト)・フィンガープリント (fingerprint) ・チェックサム (checksum) とは、とあるファイルよりハッシュ関数にて算出される値である。
 このハッシュは一方向関数とも呼ばれる。これはデータよりハッシュ値を求めるのは容易だが、そのハッシュ値より元のデータと同じものを作成するのは極めて困難である点で「一方向」と呼ばれているのだ。
 このハッシュ値を比較すれば、ファイルの同一性・または改竄の有無を確認できるだろう。つまりその中身が改竄されていればハッシュ値が異なってしまい、なおかつ同じハッシュ値のファイルを偽造するのは困難であるため、「ハッシュ値が異なるファイルであれば、オリジナルのファイルとは異なるもの」であると判別できるだろう。

 これを利用したかった一番の目的は、マルウェア感染後のファイルの改変の検出である。マルウェアの感染実験を行う場合に、既存のファイルがマルウェアにより改変されたとする。その際にマルウェアによる偽装工作により作成日時・変更日時・ファイルサイズが変わらない場合、通常の検索では判別するのは困難である。
 しかしハッシュ値を作成し、保存しておいたハッシュ値と比較できるようなソフトウェアを利用すれば、マルウェアによるファイルの改変を容易に検出でき、よってマルウェアの傷跡を簡単に探し出せるだろう。
 (もちろんRootkitにより隠蔽されているファイルは、マルウェアに感染しているOSよりはそうそう簡単には確認できないだろう。そのような場合は、ハードディスクを引っこ抜き調査するか、ブータブルCDよりハッシュ値を作成するソフトを用いるしかない)

 MD5(Message Digest 5)では極めて稀にはこのハッシュ値が他のファイルと同じものとなり衝突(collision:コリジョン)する可能性(synonym:シノニム)はあるそうなんですが。MD5やSHA-1が実際にどれがどれだけ安全なのかは自分にはわからずで。
 詳しい話を知りたい方はIPAのRFC1321の和訳、MD5 メッセージダイジェストアルゴリズム(The MD5 Message-Digest Algorithm)(http://www.ipa.go.jp/security/rfc/RFC1321JA.html)でも読んで下さいな。

VirtualPC利用時での、md5deepによる改変ファイルの検出


 md5deepはJesse Kornblum氏により作成されたツールである。これはフォルダ・ドライブを指定し、それに含まれるファイルのMD5ハッシュを取得できる便利なものである。
 「md5deep-1.7.zip」に含まれる4つの実行ファイル、md5deep.exe、sha1deep.exe、sha256deep.exe、whirlpooldeep.exeはそれぞれ、MD5・SHA-1・SHA-256・Whirlpoolによるハッシュ値を取得するためのツールである。
 この場では作業手順の、具体的な流れを紹介する。

検証用機の準備


 感染テスト機(バーチャルマシン、ゲストPC)からの操作では、感染中ではその結果が正しいとは限らない。これはマルウェアに感染中のマシンでは、ファイルが隠蔽されている可能性があるからだ。
 そのため検証作業用のバーチャルマシンを用意し、これに感染テスト機のバーチャルハードディスクをDドライブとして接続し、作業を進める。
 これは実機での例に置き換えるとしたらば、感染作業用の実機のハードディスクを外し、検証作業用の実機にスレーブ接続するのと同じようなものだ。

1)md5deep-1.7.zipを検証用機のCドライブへ設置し、解凍。「md5deep-1.7」の名称のフォルダが作成される。
(解凍し作成された実行ファイルをダブルクリックしても、何も起きないので注意。)
2)Windows XP SP2のCD-ROMより、Q:\SUPPORT\TOOLS\SUPTOOLS.MSIを開き、Windows Support ToolsをSetupする。
C:\Program Files\Support Tools\Windiff.exeを動作テストしておく。


感染前の状態(Before)にてmd5シグネチャリストファイルを作成



1)感染テスト機(ゲストPC)を設定し、各種設定後に感染前の状態で保存しシャットダウン。
2)感染テスト機のバーチャルハードディスク(Before)を、検証用機のバーチャルマシンのDドライブとしてマウント。
3)コマンドプロンプトより起動。
4)「cd /d C:\md5deep-1.7」
(md5deep.exeを含む「md5deep-1.7」フォルダへ、カレントディレクトリを移動)
5)「md5deep -r D:\ > before.md5」
(Dドライブとして認識されている未感染のボリュームを丸ごと処理。
6)作成されたMD5シグネチャのリストbefore.md5ファイルを、共有ドライブに保存
7)検証用機をシャットダウンし、復元ディスクへの変更を破棄。


感染後の状態(After)にてmd5シグネチャリストファイルを作成



1)感染テスト機(Before)よりOSを起動。各種テストを行いマルウェアに感染させ、ファイルを新規作成・改変させる(以後Afterと呼称する)。シャットダウンし、変更を適用。
2)感染テスト機のCドライブ(After)を、検証用バーチャルマシンのDドライブとしてマウントする。
3)検証用バーチャルマシンのOSを起動。
4)コマンドプロンプトを起動。
5)「cd /d C:\md5deep-1.7」
(md5deep.exeを含む「md5deep-1.7」フォルダへ、カレントディレクトリを移動)
6)md5deep -r D:\ -x before.md5 > change.md5
(negative matching。クリーンな状態でのbefore.md5と比較し、変更点をchange.md5として保存)
7)「md5deep -r D:\ > after.md5」
(Dドライブとして認識されている感染中のボリュームより、md5シグネチャリストファイルを作成)
8)Windiff.exeを起動。「file」→「Compare files」より、「before.md5」と「after.md5」をコンペア。
(この後画面の表示がおかしくなるが、気にしない)
9)WinDiffより「Edit」→「Edit Composite File」を選択し、表示された結果をテキストファイルとして保存。


md5deepによるmd5シグネチャリストを検証する


 まずは感染テスト機の感染前(Before)のmd5シグネチャリストファイルと、感染後(After)のmd5シグネチャを比較し、変更点を検証する。
 参考とするために、特に変な操作をせずに再起動した場合のnegative matchingの結果であるchange.md5を、テキストファイルにして公開する。

 実際にファイルの操作をどのようにして探すのか、とりあえずは試してみよう。
 感染前の感染テスト機(Before)にて、以下のテキストファイルを作成しておいた。

  1. C:\md5\md5-1.txt
  2. C:\md5\md5-2.txt
  3. C:\md5\md5-3.txt

 感染テスト機(After)にて、以下の操作を行った。

  1. C:\md5\md5-1.txt →このファイルを削除
  2. C:\md5\md5-2.txt →ファイルを開き、何も編集せず上書き保存。変更日時のみが変わる。
  3. C:\md5\md5-3.txt →含まれる文章を変更し、保存。
  4. C:\md5\md5-4.txtの名称のカラファイルを作成

 change.md5ファイルをメモ帳で開いてみよう。
 この場合、change.md5にてはmd5-3.txtのみ、つまり中身を改変したファイルしかログに表示されなかった。言い換えるとmd5deepによるnegative matchingでは、ファイルの作成・削除は反映されないのだ。
 またファイルの変更日時は、MD5ハッシュには関わりが無かった。

 このnegative matchingでの欠点をやりくりする目的で、サポートツールのWindiff.exeを利用する。Windiffにより相違点を洗い出せば、新規に作成されたファイル・削除されたファイル・改変されたファイルのそれぞれのリストが得られるだろう。このリストから前述のchange.md5での結果を差し引けば、作成・削除されたファイルがいずれなのか判別できるはずである。
 Windiffなどを含むサポートツールは、WindowsXPのCDより「Q:\SUPPORT\TOOLS\SUPTOOLS.MSI」をダブルクリックしインストールする。
 Windiffにて2つのファイルを選択する際に、before.md5、after.md5の順番で選択した場合、上記のテキストファイル作成・削除・改変の結果はこのように表示された。

!> d41d8cd98f00b204e9800998ecf8427e D:\md5\md5-1.txt
<! ee9e579d242979bf3e1bdfd2e3a3ca7e D:\md5\md5-3.txt
!> 1bc29b36f623ba82aaf6724fd3b16718 D:\md5\md5-3.txt
<! d41d8cd98f00b204e9800998ecf8427e D:\md5\md5-4.txt


 なおボリュームに含まれるファイルを全てゴッソリと比較するようなソフトウェアもありますが。作成・削除されたファイルのリストをこれにより作成できる場合は、Windiffでの作業は必須ではない。その際には感染前(Before)のボリュームと、Beforeをコピーして作成しテスト作業に供試した感染後(After)のボリュームそれぞれを、検証作業用マシンにて参照して作業する事となる。
 しかしそのような作業を行うに当っては、くれぐれもWindowsOSを利用する上でのライセンスに抵触しないよう、注意を払ってもらいたい。

Acknowledge


 この記事を作成するにあたり、ツールを紹介していただいたmashさんと、必要以上に捻った自身でもわからない文章を校閲していただいたSakaiさんに感謝いたします。

関連記事


 マルウェア・ウイルスの感染実験