こんにちは、最後まで追跡するセキュリティ研究者の皆さん! 🕵️♂️
サイバーセキュリティの世界は終わりのない「鬼ごっこ」です。セキュリティ企業が特定のマルウェアを検出すると、ハッカーは数日後(あるいは数時間後)にコードを少し変更した「亜種(Variant)」をリリースします。
上着だけ着替えたもの、整形手術をしたもの、武器を変えたもの…種類も様々です。🎭
このとき、アナリストが「この新しいやつは、以前のやつと同じものなのか?」を明らかにする作業をコード類似度分析(Code Similarity Analysis)と呼びます。
以前はBinDiffのようなツールを目を凝らして見ていましたが、今ではAIが瞬時に2つのコードの遺伝子を比較してくれます。今日はAIを活用して、マルウェアのオリジナルと亜種の間で「間違い探し」を行う実習を進めてみましょう。🔍

1. なぜ類似度分析を行う必要があるのでしょうか? 🤷♀️
マルウェアの90%以上は既存コードの使い回しです。毎回車輪を再発明する必要がないからです。
- 検出回避: ウイルスのシグネチャ(指紋)検出を回避するために、変数名や関数順序だけを変更します。
- 機能アップグレード: 既存のランサムウェアに「情報窃取」機能を追加したり、暗号化アルゴリズムを強化したりします。
- 攻撃者追跡(Attribution): 「あれ?このコーディングスタイル、昨年活動した『Lazarus』グループと95%同じじゃないか?」といった手がかりを得ることができます。
2. [準備] オリジナルと亜種のコードを準備 (逆コンパイル済み) 📂
分析のためには、バイナリ(EXE)の状態ではなく、GhidraやIDAを通じてC言語形式に復元された擬似コード(Pseudocode)が必要です。
📁 [Sample A] オリジナルランサムウェア (Original)
C
// オリジナル: 単純なファイル暗号化ループ
void EncryptFiles() {
char* key = "1234"; // 脆弱なハードコードされたキー
FileInfo file = FindFirstFile("*.*");
while (file) {
XOR_Encrypt(file, key); // 単純なXOR暗号化
file = FindNextFile();
}
}
📁 [Sample B] 亜種ランサムウェア (Variant)
C
// 亜種: キー生成方式の変更と機能追加
void ProcessData() { // 関数名が変更されました
char* key = GenerateRandomKey(); // ランダムキー生成で強化
FileInfo f = FindFirstFile("*.*");
while (f) {
if (IsSystemFile(f)) continue; // [変更点] システムファイルはスキップ(安全装置)
AES_Encrypt(f, key); // [変更点] アルゴリズムをAESに変更
f = FindNextFile();
}
}
一見すると構造は似ていますが、細部がかなり変わっていますよね?これをAIに任せてみましょう。
3. AIに「遺伝子検査」を依頼する 🧬
単に「2つを比較して」と言うだけでは、AIはテキストが異なる点しか見つけません。私たちは「機能的/論理的な違い」を求めているので、プロンプトをうまく書く必要があります。
🗣️ [Prompt] 類似度分析プロンプト
[役割] あなたはマルウェアのリバースエンジニアリング専門家です。
>
[タスク] 以下に提供された2つのCコード(Sample A、Sample B)を比較分析してください。
>
Sample Aはオリジナルのマルウェアであり、Sample Bはその亜種と推定されます。
>
[要求事項]
>
1. 類似度スコア: 2つのコードの論理的な構造とフローに基づいて、類似度を0〜100%の間で推定してください。
2. 主要な変更点(Diff): 変数名の変更のような些細なものは無視し、アルゴリズム、ロジック、機能的な追加/削除を中心に相違点を説明してください。
3. 亜種の意図: 攻撃者がコードをこのように修正した理由(検出回避、機能強化など)を推論してください。
>
[Sample A コード]
>
(上記のオリジナルコードを貼り付け)
>
[Sample B コード]
>
(上記の亜種コードを貼り付け)
4. [結果] AIの精密分析レポート 📝
AIは、変数名がfileからfに変わったことは重要ではないと認識しています。その代わりに、核心的なロジックの変化を指摘します。
🤖 AI分析レポート
>
1. 📊 類似度推定: 約70%
>
– 根拠: ファイル探索ループ(FindFirstFile -> while -> FindNextFile)の全体的な骨格(Structure)は同一です。しかし、内部処理ロジックにおいて重要な変化が検出されました。
>
2. 🔄 主要な変更点(Key Differences)
>
– 暗号化強度の強化: 単純なXOR演算が、高度な暗号化標準であるAESに変更されました。
– キー管理方式: ハードコーディングされたキー(”1234″)が、GenerateRandomKey()を通じた動的生成方式に変わり、復号が困難になりました。
– 安全装置の追加: IsSystemFile()チェックロジックが追加されました。これは、Windowsの重要ファイルを暗号化して起動不能になるのを防ぐためです。
>
3. 😈 亜種の意図推論
>
この亜種の制作者は、既存バージョンがセキュリティ企業によってあまりにも簡単に復号されたため、暗号化アルゴリズムを高度化し、被害者が支払わざるを得ないようにしました。また、システム安定性を高め、「持ち逃げ(ランサム費用だけ受け取って復旧不可)」の論争を避ける意図が見られます。
5. 実習の核心ポイント: Diffing(ディフィング)の美学 ✨
この実習を通じて、私たちは以下のインサイトを得ることができます。
- 制御フローグラフ(CFG)の重要性: 変数名は変わっても、While文の中でIf文が実行される構造は簡単には変わりません。AIはこの構造的類似性をよく見ています。
- ノイズ除去: AIに「変数名の変更は無視して」と指示することで、本当に重要な機能的な違いにのみ集中することができました。
- 対応戦略の策定: 「ああ、今回の亜種はAESを使っているのか。それならメモリでキーが生成される時を狙うべきだな?」と分析の方向性を定めることができます。
🎉 終わりに
今日、私たちはAIを活用してマルウェアの系譜(?)を分析してみました。
以前は2つのモニターにコードを表示して「間違い探し」をするのに目を血走らせていましたが、今ではAIが下準備をしてくれるので、私たちは「攻撃者の意図把握」というより高次元の業務に集中できるようになりました。
次回は、これまで学んだすべての分析内容を総合し、「最終マルウェア分析レポートの自動生成」の実習を行い、このシリーズを華麗に締めくくりたいと思います。
皆さんの分析が常に明確であることを願っています!ファイト! 💪
コメントを残す