掲載日:2020/11/21

違いを見抜く:視覚的に類似した画像を用いたマルウェアキャンペーンの追跡

※ 本ブログは、2020年2月13日にBromium Blogにポストされた Spot the Difference: Tracking Malware Campaigns using Visually Similar Imagesの日本語訳です。

 

イントロダクション

悪意のあるドキュメントには、Microsoft Officeの読み取り専用モード(保護ビュー)を無効にする、マクロを有効にするなどのアクションを実行するようユーザーに説得するための、偽のプログラムプロンプトの画像が含まれていることがよくあります。このような巧妙な手口は、緊急性や権威をアピールすることで、他の手口よりも効果的な場合が多くあります。脅威アクターは、ソーシャルエンジニアリング用の画像で、小さな合図やごまかしを繰り返し使っていますが、これはおそらく、長い間効果があることが証明されているからだと思われます。

脅威アクターは、マルウェアキャンペーンで使用するソーシャルエンジニアリング画像を再利用したり、ほんの少し手を加えたりすることが多いため、その活動の視覚的な痕跡を残しています。この記事では、知覚的ハッシュアルゴリズムを用いて、視覚的に類似した悪意のあるドキュメントを含むキャンペーンで配布されるマルウェアファミリーを追跡・検知する方法を説明します。[1] また、この技術を実証するスクリプトであるgraph_similar_document_images.pyを公開します。[2]

 

トップソーシャルエンジニアリング画像

2019年に検知された250件の悪意あるドキュメントのサンプルから、32種類の異なるソーシャルエンジニアリング画像を特定しました。表1は、最も頻繁に模倣された製品および組織を示しています。

 

製品/組織 ソーシャルエンジニアリング画像の種類
Microsoft Word 12
Microsoft Office 9
「保護された」ドキュメント全般 3
Office 365 2
Amazon Inc 1
McAfee LLC 1
RSA Secure ID 1
Barclays plc 1
その他 2

表1 - ソーシャルエンジニアリング画像で模倣された上位の製品および企業

 

最も多かったのは「保護されている」と主張するもの(13件)で、次いで「閲覧するソフトウェアのバージョンと互換性がない」と主張するもの(10件)でした。

 

比較ができない暗号学的ハッシュ関数による困難

ハッシュは、脅威情報において最も一般的に使用される原子的インジケーターの1つです。SHAやMD5などの暗号学的ハッシュ関数は、決定論的つまり同じ入力データが同じハッシュ値になるように設計されているため、データの完全性をある程度保証するためによく使用されています。[3] この性質により、これらの関数を使用して、既知の悪質なファイルを識別するインジケーター(すなわちハッシュ値)を作成することができるのです。これらのハッシュ関数の第二の特性は、意図的に比較できないようにしていることです。これは、強力なハッシュ関数を設計する上では望ましいことですが、ソーシャルエンジニアリング画像の追跡においては、画像にわずかな変更を加えるだけで全く異なる値が得られるため、障害となります(これはアバランシェ効果として知られています)。[4] 脅威アクターはわずかな努力でソーシャルエンジニアリング画像のハッシュ値を意図的に変更できるため、ファイルのコンテンツから得られるハッシュ値を使って画像の再利用を追跡しても、強固な解決にはならないことを意味しています。

 

例 - QAKBOTキャンペーン、2019年

図1~3は、2019年10月に行われた、認証情報を盗むワーム Qakbot を配信するキャンペーンにおいて、脅威アクターがプログラムによってソーシャルエンジニアリング画像を変更し、比較不可能なハッシュ関数を使用して追跡を妨害した様子を示しています。[5] 脅威アクターは、青い楕円(赤くハイライト)をランダムな場所に挿入して、各ソーシャルエンジニアリング画像を変更し、画像とそれを含むドキュメントが固有のMD5値(図4)を生成していることを意味しています。

QakBotを配信するキャンペーンで使用された悪意のあるWordドキュメントから抽出されたJPEG画像 図1 - QakBotを配信するキャンペーンで使用された悪意のあるWordドキュメントから抽出されたJPEG画像
同じキャンペーンで使用された2つ目の悪意のあるWordドキュメントから抽出されたJPEG 図2 - 同じキャンペーンで使用された2つ目の悪意のあるWordドキュメントから抽出されたJPEG
楕円形(薄いグレー)が挿入された3つ目のサンプルの編集したJPEG 図3 - 楕円形(薄いグレー)が挿入された3つ目のサンプルの編集したJPEG
キャンペーンで使用された視覚的に類似した画像のユニークなMD5値 図4 - キャンペーンで使用された視覚的に類似した画像のユニークなMD5値

 

画像間の視覚的な違いはわずかですが、これらの変更は図5に示すように、JPEGファイルのエンコードによって、ファイルの構造を大幅に変更します。[6]

binvis.ioで生成した図1および図2の抽出画像のバイト可視化 図5 - binvis.ioで生成した図1および図2の抽出画像のバイト可視化

 

 

知覚的ハッシュアルゴリズム

ソーシャルエンジニアリング画像のハッシュ値を、比較可能な知覚的ハッシュアルゴリズムを用いて計算することで、比較不可能なハッシュ関数の弱点を克服することができます。最も単純な知覚的ハッシュアルゴリズムの1つが、8バイトのハッシュ値になるAverage Hashです。[7] その仕組みを示すために、Johannes BuchnerのPythonライブラリImageHashを使って、QakBotキャンペーンのソーシャルエンジニアリング画像の1つのAverage Hash を計算してみましょう。[8]

 

>>> from PIL import Image
>>> import imagehash
>>> a = imagehash.average_hash(Image.open('sample (1).jpg'))
>>> print(a)
0000c0d3dedc4000

 

Average Hashを計算するには、まず画像を8×8ピクセルにリサイズし、グレースケールに変換して色数を減らす必要があります。次に、画像の平均的な色値を計算します。最後に、各ピクセルの色値について、平均値より大きい場合は1を、小さい場合は0をビットにセットします。これがどのように機能するかを示すために、グリッドをPrintすることができます。

 

>>> print(a.hash)
[[False False False False False False False False]
[False False False False False False False False]
[ True  True False False False False False False]
[ True  True False  True False False  True  True]
[ True  True False  True  True  True  True False]
[ True  True False  True  True  True False False]
[False  True False False False False False False]
 [False False False False False False False False]]

 

ハッシュ値0000c0d3dec4000は、各行のビットを上から下へ16進数で表したものです。これは、Hamming 距離のような文字列メトリックを使って2つのハッシュの距離を計算することで、平均的なハッシュのペアがどれだけ似ているかを識別できることを意味します。[9]  QakBotキャンペーンから別のサンプルのハッシュを計算し、それらの距離を計算してみましょう。

 

>>> b = imagehash.average_hash(Image.open('sample (2).jpg'))
>>> print(b)
0000c0d3dedc4000
>>> a-b
0

 

MD5値が異なるにもかかわらず、2つの画像のAverage Hash値は一致しています。

 

 

GRAPH_SIMILAR_DOCUMENT_IMAGES.PYを用いたアプローチの適用

知覚的ハッシュアルゴリズムと文字列メトリクスを用いて、視覚的に類似した悪意のあるドキュメントを特定することができます。この研究の一環として、このアプローチをソーシャルエンジニアリングの画像に適用し、検知・識別する手法として、graph_similar_document_images.pyというスクリプトをリリースしました。

このスクリプトは、まず、LibreOfficeを使用して、ドキュメントをOffice Open XML(OOXML)形式に変換し、埋め込まれた画像を確実に抽出できるようにします。[10] このステップは、私たちが目にする悪意のあるドキュメントのほとんどが、古いCFBF(Compound File Binary File Format)を使用しているために必要です。[11] 次に、スクリプトは埋め込まれた画像を抽出し、そのAverage Hash値を計算し、各画像のハッシュ間の距離を計算します。最後に、距離が類似度のしきい値(デフォルトでは87.5%)を満たす場合、スクリプトは画像をグラフ化し、図6と7に示すような画像ハッシュの類似度グラフを作成します。

悪意のあるドキュメントのサンプルセットに対するgraph_similar_document_images.py が生成した画像ハッシュ類似度グラフ 図6 - 悪意のあるドキュメントのサンプルセットに対するgraph_similar_document_images.py が生成した画像ハッシュ類似度グラフ

 

 

 QakBotキャンペーンで使用された視覚的に類似したソーシャルエンジニアリング画像の画像ハッシュ類似度グラフ 図7 - QakBotキャンペーンで使用された視覚的に類似したソーシャルエンジニアリング画像の画像ハッシュ類似度グラフ

 

また、このスクリプトには、既知の不正な画像ハッシュのブラックリストと視覚的に類似した画像を識別する検知モードもあります。(図8)[12]

Graph_similar_document_images.py検知モードのCSV出力とソーシャルエンジニアリング画像シグネチャのマッチング結果 図8 - Graph_similar_document_images.py検知モードのCSV出力とソーシャルエンジニアリング画像シグネチャのマッチング結果

 

悪意のあるドキュメントを含むキャンペーンで配布されたマルウェアのファミリーやファミリー群が判明している場合、それらのファミリーと画像ハッシュを関連付けることも可能です。その結果、画像ハッシュは、マルウェアのキャンペーンやファミリの活動を追跡するための有効な指標となります。(表2)

 

イメージハッシュ
(Average Hash)
シグネチャ名 関連するマルウェアファミリー 
0038386eff7e7c00 Image.Social-Engineering.Office-365.Online-Version.Blue Emotet
cfc7c7cfffff00e5 Image.Social-Engineering.MS-Office.Old-Version.White.Attemting Emotet
efe7ffc38100ffff Image.Social-Engineering.MS-Office.OpenOffice.Gray Emotet
c7c7818f83cbffff Image.Social-Engineering.Office-365.Desktop-Laptop.White Emotet
ffffc3ffff8101ff Image.Social-Engineering.MS-Word.License Emotet
0000c0d3dedc4000 Image.Social-Engineering.MS-Word.Previous-Version.Blue.Circle QakBot
0000187f76000000 Image.Social-Engineering.Generic.Protected.Full-Page.Blue Ursnif
00c0c4fcc0d6c000 Image.Social-Engineering.MS-Word.Earlier-Version.Italian.Navy Ursnif
00c0f8e0e6e4c000 Image.Social-Engineering.MS-Word.Earlier-Version.Navy Ursnif

表2 - 悪意のあるドキュメントから計算されたイメージハッシュと関連するマルウェアファミリー

 

リファレンス

HP WOLF SECURITY

Emotetにお悩みの方
(無料試用キャンペーン)