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をマルウエアに施して得られる値を用いることにより、類似したマルウエアを的確に見つけられることを 【取寄せ】 ROLAND SANDS DESIGN ローランドサンズ デザイン 76054 RSD SEAT RSD 08-18 FLT シート RSD 2008-2016 ツーリング系 FLHT FLHR、従来の手法との比較により示します。


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を使用するためには、次のツールをインストールしておく必要があります。
なお、本実装では 10%OFF【取寄】52-1092 16" X 3" フロント ホイール, クローム FLSTS 2000-UP、Fuzzy Hashingとしてssdeepを使用しています。

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

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

  •  get_impfuzzy: 指定したPEファイルからハッシュ値を計算する
  •  get_impfuzzy_data: データ形式のPEファイルからハッシュ値を計算する
  •  hash_compare: 2つのハッシュを比較し ■ ORC409D(シングル)スタンダードタイプ・ダンパー付き プッシュ式 セリカ ST185 3S-GTE 【ORC-409D-03T】【smtb-k】【kb】、類似度を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の評価

次に スロットルキットType2 インナー巻取径Φ36 Tゴールドホルダー ワイヤー: 800mm ACTIVE(アクティブ)、提案手法とimphash、ssdeepの三者を用いてマルウエアの類似性を評価する比較実験の結果を示します。

比較実験では、20種類のマルウエアについて、それぞれ異なる10検体ずつ(合計200検体)を用意しました。200検体から2検体を選ぶすべての組合せについて 2輪 EK/江沼チヱン シールチェーン QXリング メタルレッド 520SRX2(AR,NP) 110L 継手:MLJ スズキ GSX250 E/T/L GSX250 アクロス GSX250E GSX-R250、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としましたが、実行ファイルによっては誤検知する可能性があります。そのため、実際に使用する際は、

【カーツ】LSD 2WAY NISSAN シルビア SILVIA 【PS13】 【SR20DE】 Q ’s [91.01-93.10] MT/AT POSITION[REAR] STD DIFF[VISCOUS] TYPE[SOLID] PLATE QTY[16] PLATE SIZE[L]

LSD 2WAY NISSAN シルビア SILVIA 【PS13】 【SR20DE】 Q ’s [91.01-93.10] MT/AT POSITION[REAR] STD DIFF[VISCOUS] TYPE[SOLID] PLATE QTY[16] PLATE SIZE[L]
メーカーカーツ【KAAZ】
メーカーコードSAN2635
適合代表車種※詳細な適合の事前確認はお問い合わせください。
お届け納期メーカー及び商品によって異なる為、お急ぎの方はお問い合わせください。
※ショッピングカート受注後でも納期確認後のキャンセルは可能です。
発送送料お届けの地域によって異なります。目安送料は ¥4,320円(税込) となります。
※個人のお客様への発送は追加料金が掛かる場合があります。ご自宅へ発送希望の方は予めお問い合わせください。
注意事項※商品画像は装着画像や塗装済みのイメージ画像の場合がございます。カラーが異なる場合もございますのでご注意ください。
※塗装が必要な外装品(エアロパーツ)は特性上下地処理が必要となります。表面の小傷等は不良ではございません。
※商品の装着後(塗装後含)のキャンセルはお受け致しかねます。商品が届きましたら必ず装着前にご確認をお願い致します。
商品タグSAN2635 LSD 2WAY NISSAN シルビア SILVIA 【PS13】 【SR20DE】 Q ’s [91.01-93.10] MT/AT POSITION[REAR] STD DIFF[VISCOUS] TYPE[SOLID] PLATE QTY[16] PLATE SIZE[L] カーツ KAAZ
詳細は・・・お気軽にお問い合わせください。

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


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

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


おわりに

日々大量のマルウエアが発生している現状において、効率的にマルウエアを分類し、分析するべき新種のマルウエアを見つけることが重要になります。今回紹介した手法は、その作業をサポートする1つの方法になると思います。
また JK-103(07-103)カーボンプロテクトメッシュジャケット ブラック/レッド 2XLサイズ コミネ(KOMINE)、同時に公開している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で分析し、分類したものを利用している