既知のマルウエアをメモリイメージから簡易に検知できるツールを開発 ~impfuzzy for Volatility~(2016-11-01)
今回は、既知のマルウエアをメモリイメージの中から抽出するためにJPCERT/CCで作成し、分析業務に利用しているツール「impfuzzy for Volatility」について紹介します。
メモリフォレンジックにおけるマルウエアの検知
ファイル形式のマルウエア検体が既知のものかどうか判定するには、ファイル全体のハッシュ値(MD5やSHA256など)を用いてマルウエアハッシュ値のデータベースと照合し、一致するかどうかを確認するのが最も簡単で高速な方法です。しかし、この手法はメモリフォレンジックには利用できません。その理由は、メモリ上にロードされた実行ファイルが、OSやマルウエア自身によって一部の情報が書き換えられる(例えば、実行ファイルがメモリ上にロードされた際に、IAT(import address table)はそのメモリ上にロードされているAPIのアドレスに書き換えられます。)ため、メモリ上にロードされる前のファイルとロード後のファイル全体をハッシュ値で比較しても一致しないからです。
そのため、メモリフォレンジックでは、既知のマルウエアを発見するためにYara scanによるシグネチャマッチングの手法がしばしば利用されます。しかし、この手法を使用するためには、あらかじめマルウエアの構造を分析し、シグネチャを作成しておく必要があります。
Impfuzzy for Volatilityの概要と主な機能
こうした問題点を解消して、メモリイメージの中から既知のマルウエアを抽出するツールが「impfuzzy for Volatility」です。このツールは、メモリフォレンジックツールであるThe Volatility Framework(以下Volatilityと略す)のPluginとして実現しています。実現にあたり、マルウエアの実行ファイルがメモリにロードされた時に一部の情報が書き換わっていても検出できるように、impfuzzyというImport APIから作成したハッシュ値をもとにWindows実行ファイルの類似性を比較する手法を用いています。Impfuzzyについては、2016年5月9日の分析センターだより「 Import APIとFuzzy Hashingでマルウエアを分類する ~impfuzzy~ 」で紹介しました。
impfuzzy for Volatilityは、次の機能を持っており、impfuzzyだけでなくimphash[1]を用いた調査にも対応しています。
- impfuzzy - impfuzzyを用いてメモリイメージ内にある実行ファイルのハッシュ値を比較、表示する
- imphashlist - メモリイメージ内にある実行ファイルのimphash値を表示する
- imphashsearch - imphashを用いてメモリイメージ内にある実行ファイルのハッシュ値を比較する
次のコマンドラインを実行すると、メモリ上にロードされている実行ファイルとロードされているDLLファイルのimpfuzzyハッシュ値を図1のように一覧できます。(-p で対象のプロセスを限定することも可能です。)
$ python vol.py -f [memory.image] --profile=[profile] impfuzzy -a (-p [PID])
特定の実行ファイルに類似したファイルをメモリイメージ上から検索する場合は、次のコマンドラインを実行します。
$ python vol.py -f [memory.image] --profile=[profile] impfuzzy -e [PE File or Folder] (-p [PID])
比較対象の実行ファイルまたは実行ファイルが存在するフォルダを -e の引数で指定します。
上記コマンドラインを実行すると、類似した実行ファイルを図2のように検出できます。(Compare 欄の値が百分率による類似度を表します)
図2は、Citadelと呼ばれるバンキングマルウエアを検知した例です。Citadelは通常パックされており、アンパックしたコードをエクスプローラなどにインジェクトして動作します。impfuzzy for Volatilityは、メモリ上にロードされた実行ファイルを比較するため、アンパックされた状態の検体のハッシュ値を計算できます。そのため、パックされたマルウエアでも気にすることなく類似度を判定できます。
impfuzzy for Volatilityは、さらに、実行ファイルやロードされたDLLファイルだけではなく、プロセスにインジェクトされたコードも検出対象にしています。図2のような「Module Name」欄の「INJECTED CODE」の記載は、プロセス内にインジェクトされたコードが存在することを示しています。
次に、impfuzzy for Volatilityで使用できるその他のオプションの例を示します。
[例1] ファイルにリストしたimpfuzzyハッシュ値とメモリ上の実行ファイルを比較し、結果を表示する。
$ python vol.py -f [memory.image] --profile=[profile] impfuzzy -i [Hash List File] (-p [PID])
[例2] メモリ上にロードされている実行ファイルのimphash値を一覧する。
$ python vol.py -f [memory.image] --profile=[profile] imphashlist (-p [PID])
[例3] ファイルにリストしたimphash値とメモリ上の実行ファイルを比較し、一致するものを表示する。
$ python vol.py -f [memory.image] --profile=[profile] imphashsearch -i [Hash List] (-p [PID])
メモリフォレンジックにimpfuzzyを使用するメリット
前述のとおり、メモリ上にロードされた実行ファイルは、一部が変更されていますが、そのImport APIは変わりません。impfuzzyは、実行ファイルのImport APIを利用して算出したハッシュ値をもとに類似度を判定します。そのため、メモリ上にロードされた実行ファイルであっても同じファイルであることを確認できます。
さらに、impfuzzyは自動にハッシュ値を作成できるため、Yara scanとは異なり手動でシグネチャを作成する手間が不要です。
Impfuzzy for Volatilityの入手とインストール
ツールはソフトウエア開発プロジェクトのための共有ウェブサービスGitHubで公開していますので、次のWebページからダウンロードしてご利用ください。
JPCERTCC/aa-tools GitHub - impfuzzy for Volatility
https://github.com/JPCERTCC/impfuzzy/tree/master/impfuzzy_for_Volatility/
impfuzzy for Volatilityを使用するためには、次のPythonモジュールをインストールしておく必要があります。
- pyimpfuzzy
pyimpfuzzyのインストールに関しては、以下のWebサイトをご覧ください。
JPCERTCC/aa-tools GitHub - pyimpfuzzy
https://github.com/JPCERTCC/impfuzzy/tree/master/pyimpfuzzy
実行する際は、前述したWebサイトからimpfuzzy.pyをダウンロードし、Volatility内の”contrib/plugins”フォルダに保存し、実行します。(--pluginsオプションでimpfuzzy.pyが保存されたフォルダを指定することも可能です。)
おわりに
メモリ上にはハードディスクには残っていないマルウエアなどの情報が残っている可能性があるため、メモリフォレンジックはマルウエア感染のインシデント調査において重要です。マルウエア感染が関わるセキュリティインシデントにおけるメモリフォレンジック調査を効率的に行うためのツールの一つとして、本ツールを活用していただけたら嬉しく思います。
分析センター 朝長 秀誠
参考情報
[1] FireEye - Tracking Malware with Import Hashing
https://www.fireeye.com/blog/threat-research/2014/01/tracking-malware-import-hashing.html