※ 本ブログは、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] 脅威アクターはわずかな努力でソーシャルエンジニアリング画像のハッシュ値を意図的に変更できるため、ファイルのコンテンツから得られるハッシュ値を使って画像の再利用を追跡しても、強固な解決にはならないことを意味しています。
図1~3は、2019年10月に行われた、認証情報を盗むワーム Qakbot を配信するキャンペーンにおいて、脅威アクターがプログラムによってソーシャルエンジニアリング画像を変更し、比較不可能なハッシュ関数を使用して追跡を妨害した様子を示しています。[5] 脅威アクターは、青い楕円(赤くハイライト)をランダムな場所に挿入して、各ソーシャルエンジニアリング画像を変更し、画像とそれを含むドキュメントが固有のMD5値(図4)を生成していることを意味しています。
画像間の視覚的な違いはわずかですが、これらの変更は図5に示すように、JPEGファイルのエンコードによって、ファイルの構造を大幅に変更します。[6]
ソーシャルエンジニアリング画像のハッシュ値を、比較可能な知覚的ハッシュアルゴリズムを用いて計算することで、比較不可能なハッシュ関数の弱点を克服することができます。最も単純な知覚的ハッシュアルゴリズムの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というスクリプトをリリースしました。
このスクリプトは、まず、LibreOfficeを使用して、ドキュメントをOffice Open XML(OOXML)形式に変換し、埋め込まれた画像を確実に抽出できるようにします。[10] このステップは、私たちが目にする悪意のあるドキュメントのほとんどが、古いCFBF(Compound File Binary File Format)を使用しているために必要です。[11] 次に、スクリプトは埋め込まれた画像を抽出し、そのAverage Hash値を計算し、各画像のハッシュ間の距離を計算します。最後に、距離が類似度のしきい値(デフォルトでは87.5%)を満たす場合、スクリプトは画像をグラフ化し、図6と7に示すような画像ハッシュの類似度グラフを作成します。
また、このスクリプトには、既知の不正な画像ハッシュのブラックリストと視覚的に類似した画像を識別する検知モードもあります。(図8)[12]
悪意のあるドキュメントを含むキャンペーンで配布されたマルウェアのファミリーやファミリー群が判明している場合、それらのファミリーと画像ハッシュを関連付けることも可能です。その結果、画像ハッシュは、マルウェアのキャンペーンやファミリの活動を追跡するための有効な指標となります。(表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 - 悪意のあるドキュメントから計算されたイメージハッシュと関連するマルウェアファミリー
[1] https://en.wikipedia.org/wiki/Perceptual_hashing
[2] https://github.com/cryptogramfan/Malware-Analysis-Scripts/tree/master/graph_similar_document_images
[4] https://en.wikipedia.org/wiki/Avalanche_effect
[6] https://en.wikipedia.org/wiki/JPEG#JPEG_compression
[7] http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html
[8] https://pypi.org/project/ImageHash/
[9] https://en.wikipedia.org/wiki/Hamming_distance
[10] https://en.wikipedia.org/wiki/Office_Open_XML
[11] https://en.wikipedia.org/wiki/Compound_File_Binary_Format
Author : Alex Holland
監訳:日本HP