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をマルウエアに施して得られる値を用いることにより、類似したマルウエアを的確に見つけられることを クムホ KUMHO ECSTA HS51 225/50R17 98W XL 17インチ 新品サマータイヤ 2本以上で送料無料、従来の手法との比較により示します。


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を使用するためには、次のツールをインストールしておく必要があります。
なお、本実装では DUNLOP ダンロップ WINTER MAXX 01 ウィンターマックス WM01 スタッドレス スタッドレスタイヤ 205/55R16 HotStuff WAREN ヴァーレン W04 4本 ホイールセット 16インチ 16 X 6.5 +48 5穴 114.3、Fuzzy Hashingとしてssdeepを使用しています。

  •  pefile (バージョン1.2.10-139以上)
  •  ssdeep (http://ssdeep.sourceforge.net)

pyimpfuzzyには次の関数が含まれます。

  •  get_impfuzzy: 指定したPEファイルからハッシュ値を計算する
  •  get_impfuzzy_data: データ形式のPEファイルからハッシュ値を計算する
  •  hash_compare: 2つのハッシュを比較し TOYOTIRES トーヨー タイヤ 国内メーカー SD-7 サマータイヤ 175/70R14 HotStuff 軽量設計!G.speed P-03 ホイールセット 4本 14インチ 14 X 5.5 +38 4穴 100、類似度を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の評価

次に 【T304】ハイエースバン [H28/6-H29/11][TRH200 / KDH201 / KDH206] カジュアルエスライン ブラック Bellezza ベレッツァ シートカバー、提案手法とimphash、ssdeepの三者を用いてマルウエアの類似性を評価する比較実験の結果を示します。

比較実験では、20種類のマルウエアについて、それぞれ異なる10検体ずつ(合計200検体)を用意しました。200検体から2検体を選ぶすべての組合せについて 245/45R17 BRIDGESTONE ブリヂストン Playz PX プレイズ PX CROSS SPEED HYPER EDITION RS9 クロススピード ハイパーエディション RS9 サマータイヤホイール4本セット、3つの方法で類似度を計算して、類似度が30以上なった場合に同じマルウエアと判定しているものとみなしました。
なお、各検体はパックされている場合、アンパックしてから各手法を適用しています。
図1に比較実験の結果を示しています。
なお、今回の比較実験では、異なるマルウエアを誤って同じマルウエアだとする誤判定は、いずれの方式でも皆無でした。

  図1:impfuzzy, imphash, ssdeepの同一マルウエア判別率
        ※1 一致とみなすimpfuzzyおよびssdeepの類似度の閾値は30とする
※2 ssdeepは実行ファイル全体を比較対象とする



評価の結果、同一マルウエア判別率を比較するとimpfuzzyが、他の方式に比べてより多くのマルウエアを同一と判定できていることが分かります。詳細な比較結果についてはAppendix Aをご覧ください。

本手法は 、Import APIを基に類似度を判定しているため、マルウエア作成ツール(ビルダー)が公開されている検体(例えば、PonyやZeuSなど)は、使用するWindows APIも変化する可能性が少ないため一致率が高いことがわかります。
反対に、Emdiviのように積極的に機能の追加や改良が行なわれている検体は、判別率が低いことがわかります。

なお、今回の検証ではimpfuzzyの閾値を30としましたが、実行ファイルによっては誤検知する可能性があります。そのため、実際に使用する際は、

★送料無料★(一部離島等除く) プレーリー リバティ PM12 スプリング【アールエスアール】サスペンション プレーリーリバティー RM12 2000 NA [13/5~] Ti2000 DOWN - 1台分
DIXCEL ディクセル プレーンディスクローターPD 1台分前後セット 日産 グロリア PY32 93/6~95/6 PD3212019S / PD3252016S!★色番号塗装発送ALFA MiTo フロントリップ【コバルト】Cobalt アルファロメオ ミト用 リップスポイラーType2 カーボン製.[KYB] カヤバ ショック NEW SR SPECIAL リア右 1本 レガシィツーリングワゴン BF3 91/12~93/09 アプライドC~D型 EJ18S 4WD ワゴン [TI] 送料1000円(税別) ※北海道・沖縄・離島は送料別途,【プリウスα シートカバー】Clazzio/クラッツィオ ZVW40W H26/11~ クラッツィオエアー ET-1602

★送料無料★(一部離島等除く) プレーリー リバティ PM12 スプリング【アールエスアール】サスペンション プレーリーリバティー RM12 2000 NA [13/5~] Ti2000 DOWN - 1台分

、比較対象の実行ファイルに合わせて閾値を調整することをおすすめします。


impfuzzyが有効に機能しない場合

マルウエアによっては、Import APIが少ない検体があります。
例えば、ダウンローダと呼ばれる種別の検体の中には、Windows APIを5つ程度しか使用しないものも存在します。そのようなImport APIが少ない検体の場合、比較対象のデータが小さいため正確にハッシュ値比較できない場合があります。
また、.NET Frameworkで作成された検体の場合、Windows APIを直接実行するアプリケーションとは仕組みが異なります。そのため、ハッシュ値を計算することができません。


おわりに

日々大量のマルウエアが発生している現状において、効率的にマルウエアを分類し、分析するべき新種のマルウエアを見つけることが重要になります。今回紹介した手法は、その作業をサポートする1つの方法になると思います。
また 【店舗取付サービス】【MAX ダムド】L950S.L960S MAX STREET SLIDER フロントバンパー、同時に公開している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で分析し、分類したものを利用している