Import APIとFuzzy Hashingでマルウエアを分類する ~impfuzzy~(2016-05-09)
一般に、マルウエア検体の調査は、既知のマルウエアかどうかを判別することから始めます。データベース化された多数の既知のマルウエアと調査検体との比較を高速に実行するために、ハッシュ関数をマルウエア検体に施して得られたハッシュ値が利用されます。
ハッシュ関数の中でも、MD5やSHA1などの伝統的なハッシュ関数の場合には、入力データが1ビットでも異なれば、まったく異なるハッシュ値になりますので、完全に同じではないが類似した既知の検体があれば、既知のマルウエアと判定したい場合には役に立ちません。
現在では、カスタマイズされた上で攻撃に使われるマルウエアがほとんどであるため、カスタマイズされた検体を類似していると判断できるようなハッシュ関数が望まれています。
そのために、単純で機械的な変換しか施されていないコードのハッシュ値は元のハッシュ値に近い値をとるfuzzy hash関数が利用されたり、Windows実行ファイル検体に対してはPE(portable executable)のインポートテーブルから値を算出するimphash[1] (import hash)が利用されたりします。
前者のfuzzy hashの一例としてはssdeep[2]が知られています。
しかしながら、ssdeepによるハッシュ値はマルウエア検体の類似性と一致しないケースが多く、imphashではマルウエアに機能が追加されると異なる値になってしまう等の問題点を抱えていました。
今回は、新たな手法impfuzzyを提案し、impfuzzyをマルウエアに施して得られる値を用いることにより、類似したマルウエアを的確に見つけられることを、従来の手法との比較により示します。
impfuzzy
提案する手法は、imphashと同様にImport APIから値を算出しますが、imphashの欠点を補うため、Import APIのハッシュ値計算にFuzzy Hashingを用います。
これにより、一部のImport APIが追加、変更されただけならば、計算結果が近い値になります。
また、ハッシュ値計算の対象をImport APIとすることで、実行ファイル全体のFuzzy Hashing値を求めるより演算に要する時間が短縮でき、効率良く比較ができます。
impfuzzyの実装
impfuzzyを計算、比較するPythonモジュールpyimpfuzzyをソフトウエア開発プロジェクトのための共有ウェブサービスGitHubで公開しています。次のWebページからダウンロードしてご利用ください。
JPCERTCC/aa-tools GitHub - impfuzzy
https://github.com/JPCERTCC/impfuzzy/
また、同時にimpfuzzyを使用してメモリイメージからロードされている実行ファイルのハッシュ値を基に類似のファイルを調査するVolatility Pluginも公開しています。
pyimpfuzzyを使用するためには、次のツールをインストールしておく必要があります。
なお、本実装では、Fuzzy Hashingとしてssdeepを使用しています。
- pefile (バージョン1.2.10-139以上)
- ssdeep (http://ssdeep.sourceforge.net)
pyimpfuzzyには次の関数が含まれます。
- get_impfuzzy: 指定したPEファイルからハッシュ値を計算する
- get_impfuzzy_data: データ形式のPEファイルからハッシュ値を計算する
- hash_compare: 2つのハッシュを比較し、類似度を0~100の静数値(同一の時に100)で返す
2つのPEファイルの類似度は次のように計算します。
import pyimpfuzzy
import sys
hash1 = pyimpfuzzy.get_impfuzzy(sys.argv[1])
hash2 = pyimpfuzzy.get_impfuzzy(sys.argv[2])
print "ImpFuzzy1: %s" % hash1
print "ImpFuzzy2: %s" % hash2
print "Compare: %i" % pyimpfuzzy.hash_compare(hash1, hash2)
上記スクリプトを実行すると次のような結果が得られます。
impfuzzyの評価
次に、提案手法とimphash、ssdeepの三者を用いてマルウエアの類似性を評価する比較実験の結果を示します。
比較実験では、20種類のマルウエアについて、それぞれ異なる10検体ずつ(合計200検体)を用意しました。200検体から2検体を選ぶすべての組合せについて、3つの方法で類似度を計算して、類似度が30以上なった場合に同じマルウエアと判定しているものとみなしました。
なお、各検体はパックされている場合、アンパックしてから各手法を適用しています。
図1に比較実験の結果を示しています。
なお、今回の比較実験では、異なるマルウエアを誤って同じマルウエアだとする誤判定は、いずれの方式でも皆無でした。
評価の結果、同一マルウエア判別率を比較するとimpfuzzyが、他の方式に比べてより多くのマルウエアを同一と判定できていることが分かります。詳細な比較結果についてはAppendix Aをご覧ください。
本手法は、Import APIを基に類似度を判定しているため、マルウエア作成ツール(ビルダー)が公開されている検体(例えば、PonyやZeuSなど)は、使用するWindows APIも変化する可能性が少ないため一致率が高いことがわかります。
反対に、Emdiviのように積極的に機能の追加や改良が行なわれている検体は、判別率が低いことがわかります。
なお、今回の検証ではimpfuzzyの閾値を30としましたが、実行ファイルによっては誤検知する可能性があります。そのため、実際に使用する際は、比較対象の実行ファイルに合わせて閾値を調整することをおすすめします。
impfuzzyが有効に機能しない場合
マルウエアによっては、Import APIが少ない検体があります。
例えば、ダウンローダと呼ばれる種別の検体の中には、Windows APIを5つ程度しか使用しないものも存在します。そのようなImport APIが少ない検体の場合、比較対象のデータが小さいため正確にハッシュ値比較できない場合があります。
また、.NET Frameworkで作成された検体の場合、Windows APIを直接実行するアプリケーションとは仕組みが異なります。そのため、ハッシュ値を計算することができません。
おわりに
日々大量のマルウエアが発生している現状において、効率的にマルウエアを分類し、分析するべき新種のマルウエアを見つけることが重要になります。今回紹介した手法は、その作業をサポートする1つの方法になると思います。
また、同時に公開しているVolatility Pluginは、マルウエア感染の有無を調査するメモリフォレンジックに活用できます。
これを利用すると、メモリ上でアンパックされた状態の検体のハッシュ値を計算することができるため、マルウエアがパッキングされていた場合でも気にすることなく類似度を判定することができます。
このPluginについては、以下からダウンロードすることができます。こちらについては別の機会に紹介する予定です。
JPCERTCC/aa-tools GitHub - impfuzzy for Volatility
https://github.com/JPCERTCC/impfuzzy/tree/master/impfuzzy_for_Volatility/
分析センター 朝長 秀誠
参考情報
[1]FireEye - Tracking Malware with Import Hashing
https://www.fireeye.com/blog/threat-research/2014/01/tracking-malware-import-hashing.html
[2]Fuzzy Hashing and ssdeep
http://ssdeep.sourceforge.net/
Appendix A impfuzzy, imphash, ssdeep比較
表1: マルウエア判別率
種別 | impfuzzy (%) | imphash (%) | ssdeep (%) |
Agtid | 100 | 35.6 | 26.7 |
BeginX Server | 15.6 | 11.1 | 11.1 |
IXESHE 196 | 44.4 | 4.4 | 2.2 |
IXESHE 2 | 28.9 | 6.7 | 2.2 |
IXESHE 2sw | 100 | 15.6 | 17.8 |
Daserf | 35.6 | 4.4 | 4.4 |
Dyre | 100 | 6.7 | 2.2 |
Fucobha | 44.4 | 4.4 | 2.2 |
Gstatus | 60 | 4.4 | 2.2 |
Hikit | 64.4 | 35.6 | 6.7 |
Netwire | 80 | 15.6 | 28.9 |
NfIpv6 | 24.4 | 4.4 | 4.4 |
Emdivi t17 | 37.8 | 0 | 0 |
Emdivi t20 | 4.4 | 0 | 0 |
plurk | 15.6 | 6.7 | 11.1 |
Derusbi | 80 | 8.9 | 8.9 |
Pony | 95.6 | 15.6 | 0 |
sregister | 100 | 11.1 | 15.6 |
Sykipot | 8.9 | 0 | 2.2 |
ZeuS | 80 | 35.6 | 35.6 |
※ マルウエアの種別は、JPCERT/CCで分析し、分類したものを利用している