analyzing-malware について
不審なファイルのトリアージ、インシデント調査、検知情報の抽出を行う分析者向けのマルウェア解析スキルです。隔離と証拠に基づく判断を重視し、静的・動的解析の結果を能力、IOC、検知内容として整理します。
主な機能
- 01解析環境を先に隔離
- 02ファイルとスクリプトの静的トリアージ
- 03プロセス、ファイル、通信の動的観察
- 04設定情報と C2 の抽出
- 05YARA ルールの作成と検証
活用シーン
- 01不審な添付ファイルやバイナリーのトリアージ
- 02サンプルの永続化とコマンド&コントロールの調査
- 03ハンティングやブロック向けの IOC 抽出
- 04サンプルの挙動から検知ルールを作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ trilwu/ secskills --skill analyzing-malwareインストール後、Claude Code で/analyzing-malwareを入力して読み込まれたか確認します。
詳細
マルウェアの分析
分析自体は簡単です。問題が起きるのは封じ込めです。本番環境に接続できるマシンでサンプルを実行してしまったり、進行中の調査に支障をきたす IOC を公開してしまったりすることがあります。まず環境を整えてください。
使用する場面
- 不審なファイル、添付ファイル、スクリプト、またはドロップされたバイナリをトリアージする
- サンプルの機能、永続化、コマンド&コントロールを特定する
- ハンティングやブロック用のインジケーターを抽出する
- サンプルを基に YARA ルールや振る舞い検知を作成する
- サンプル由来のインテリジェンスでインシデント対応を支援する
使用しない場面
- マルウェア、ドロッパー、ローダー、または回避コードの作成 — どのような説明であっても、このスキルの対象外です
- 無害なバイナリの純粋なリバースエンジニアリング —
analyzing-binariesを使用してください - PE/ELF ヘッダーのない生のシェルコードブロブ —
analyzing-shellcodeを使用してください - サンプルのネットワークキャプチャ —
analyzing-network-trafficを使用してください - Web ソースツリー全体から仕込まれた Web シェルを一掃する場合(復元された単一サンプルではない場合) —
hunting-web-backdoorsを使用してください - ファミリー向けの YARA シグネチャの作成 —
writing-yara-rulesを使用してください - より広範なインシデントへの対応 —
responding-to-incidentsを使用してください - 調査結果をデプロイ済みルールにする場合 —
engineering-detectionsを使用してください - サンプルの IOC を関連インフラ、アクター追跡、または完成したインテリジェンス製品へとたどる場合 —
producing-threat-intelligenceを使用してください
封じ込め:何よりも先に実施すること
| 制御項目 | 要件 |
|---|---|
| ホスト | 使い捨ての VM または専用のベアメタル。実行前にスナップショットを取得する |
| ネットワーク | 分離されたセグメント。デフォルトではシミュレートされたサービス(INetSim/FakeNet-NG)を使用する |
| 共有 | ホストフォルダー共有、クリップボード共有、ホストドライブのマウントを行わない |
| 認証情報 | 実アカウントを使用しない。ドメインに参加させない。パスワードマネージャーを使用しない |
| 取り扱い | サンプルはパスワード保護されたアーカイブに保存し、拡張子を無効化する(.bin、.mal) |
| 外部通信 | 明示的な判断と、帰属情報漏えいへの対策がある場合に限り、実際のインターネットに接続する |
ライブの C2 に接続すると、オペレーターにこちらの調査が知られます。進行中のインシデントでは、インシデントリーダーの承認を得るまで、C2 ドメインを名前解決したり、ハッシュを公開したり、マルチスキャナーサービスにサンプルをアップロードしたりしないでください。公開投稿は情報開示にあたります。
静的トリアージ — 実行しない
# Identity, always first
sha256sum sample && file sample && du -h sample
# Fuzzy and import hashes for clustering against known families
ssdeep sample; tlsh sample # Debian tlsh-tools ships /usr/bin/tlsh;
# built from upstream it is tlsh_unittest
python3 -c "import pefile;print(pefile.PE('sample').get_imphash())"
# Structure
pecheck sample # or: rabin2 -I / readelf -h
capa -v sample # capability detection mapped to ATT&CK — start here
floss sample # deobfuscated + stack strings, better than `strings`
# Packing and embedded content
binwalk -E sample # entropy
binwalk -Me sample # extract embedded objects
このワークフローで単独のコマンドとして最も価値が高いのは capa です。バイナリを MITRE ATT&CK と MBC に対応付けた振る舞いの一覧に変換できるため、そもそも詳細な分析が必要かどうかを判断できます。
文書やスクリプトに含まれるサンプル:
oleid doc.xls && olevba --deobf doc.xls # OLE macros
oledump.py doc.doc # stream-level inspection
msodde doc.docx # DDE payloads
rtfobj doc.rtf # embedded objects in RTF
pdfid file.pdf && pdf-parser -a file.pdf # /JS /OpenAction /Launch
# Obfuscated scripts: normalize before reading
box-js payload.js
# PowerShell: decode -EncodedCommand, then unwrap the layers
echo '<base64>' | base64 -d | iconv -f UTF-16LE -t UTF-8
スクリプト型マルウェアの多くは、10 行ほどのロジックを 3 層のエンコードで包んでいます。難読化された形式を読むのではなく、機械的に難読化を解除してください。
動的分析
スナップショットを取得し、実行し、観察し、元に戻します。汚染された状態で二度と分析しないでください。
Baseline snapshot
→ start Procmon / Sysmon / inotify + tcpdump + INetSim
→ detonate with the right launcher (rundll32, wscript, mshta, Office)
→ observe 3-5 minutes, then interact (click, wait past sleep timers)
→ collect artifacts and memory
→ revert
収集するものと、それぞれでわかること:
| アーティファクト | ツール | わかること |
|---|---|---|
| プロセスツリー | Sysmon E1、Procmon、execsnoop | インジェクション、LOLBin の悪用、子プロセスの起動 |
| ファイルおよびレジストリへの書き込み | Procmon、inotifywait | ドロップ、永続化、設定 |
| ネットワーク | tcpdump、Wireshark、INetSim ログ、mitmproxy | C2 エンドポイント、ビーコン間隔、プロトコル |
| メモリ | DumpIt / procdump、続いて Volatility | 展開されたペイロード、インジェクションされたコード、鍵 |
| 永続化 | Autoruns、systemctl list-units、cron、LaunchAgents | 生存メカニズム |
パッカーと格闘するのではなく、メモリから展開済みのペイロードを復元してください。
# After the sample unpacks itself, dump and carve
vol -f mem.raw windows.malfind # injected/RWX regions
vol -f mem.raw windows.dumpfiles --pid <pid>
スリープや回避のゲートに注意してください。多くのサンプルは数分間アイドル状態になったり、ドメイン参加済みのホストかどうかを確認したり、CPU コア数を数えたり、分析用プロセスを探したりします。何も起きない場合は、サンプルが不活性だと結論付ける前に、チェックをパッチするか、Frida で Sleep/NtDelayExecution をフックしてください。
機能モデル
ストーリー形式ではなく、ATT&CK に沿って分析結果を整理します。
- 初期実行 — 起動方法と必要なもの
- 防御回避 — パッキング、インジェクション、AMSI/ETW のパッチ適用、署名済みバイナリを介したプロキシ実行
- 永続化 — 実行キー、サービス、スケジュールされたタスク、WMI サブスクリプション、cron、LaunchAgents
- 認証情報へのアクセス — LSASS へのアクセス、ブラウザーのストア、キーロギング
- 探索 — ホスト、ドメイン、セキュリティ製品の列挙
- 収集と窃取 — 何をどこにステージングし、どのように外部へ送信するか
- コマンド&コントロール — プロトコル、エンコード、ジッター、フォールバックチャネル、キル日
- 影響 — 暗号化、ワイプ、リソースの乗っ取り
各項目について、主張を裏付ける具体的な証拠(アドレス、API 呼び出し、アーティファクト)を記録します。証拠のない機能の主張は推測であり、マルウェアレポートにおける推測は不適切な対応判断につながります。
設定と C2 の抽出
設定は最も価値のある成果物です。ブロック、ハンティング、アトリビューションに役立ちます。
# Known families: use the community extractors first
python3 -m maco.extract sample # MACO / CAPE / RATDecoders ecosystems
# Unknown: find the decode routine, then emulate it over the encrypted blob
設定に含まれることが多い情報:C2 の URL とフォールバック、キャンペーン ID またはボットネット ID、RC4/AES キー、ミューテックス、スリープ間隔とジッター、インストールパス、キル日。すべて抽出してください。キャンペーン ID とミューテックスは、ローテーションされる C2 よりもハンティングのピボットとして有効な場合がよくあります。
IOC と検知の出力
指標を、どれだけ長く有効であり続けるか、どれだけ具体的かに基づいて順位付けします。
Hash → precise, dies immediately (recompile)
C2 IP/domain → useful now, rotates in days
Mutex / config → survives rotation, family-specific
Behaviour/TTP → survives redevelopment; write these
偶発的な文字列ではなく、構造とコードに基づいて YARA ルールを作成します。
rule Family_Loader_ConfigDecode
{
meta:
author = "analyst"
date = "2026-07-26"
description = "Loader config RC4 decode stub"
hash = "<sha256>"
reference = "<internal case id>"
strings:
// The decode loop's constants, not a filename it happens to drop
$decode = { 8A 04 0? 32 0? 88 0? 4? 3B ?? 72 }
$mutex = "Global\\<family-specific>" ascii
condition:
uint16(0) == 0x5A4D and filesize < 2MB and all of them
}
ルールを公開する前に、すべて検証します。
yara -w rule.yar ./samples/family/ # must hit all known-true samples
yara -w rule.yar ./corpus/goodware/ # must produce zero hits — this step is not optional
振る舞いベースの検知は engineering-detections に渡し、Sigma/EDR への変換とチューニングを依頼します。
退けるべき合理化
- 「ただのスクリプトだから、ノート PC で実行しても大丈夫だ。」 スクリプト型マルウェアもマルウェアです。
- 「サンドボックスでは問題なしと判定された。」 サンドボックスは回避されることを前提に設計されています。不審なファイルに対する問題なしの判定は、分析を打ち切る理由ではなく、さらに詳しく分析する理由です。
- 「すぐ確認するため、VirusTotal にアップロードしよう。」 公開提出は、攻撃者や顧客の競合他社に情報を開示することになる可能性があります。慎重に判断してください。
- 「ハッシュが IOC だ。」 ハッシュでブロックできるのは、まさにこのビルドだけです。
- 「AV が Family X と名付けたから、これは Family X だ。」 ベンダー間で名称は一貫していません。そのファミリーのアトリビューションと対応手順を引き継ぐ前に、コードまたは設定の類似性で確認してください。
- 「ネットワークトラフィックがないから、C2 もない。」 結論を出す前に、スリープゲート、特定の日付を待つ DGA シード、デッドドロップリゾルバーを確認してください。
成果物
- 識別情報 — ファイル名、SHA-256、imphash、ssdeep、サイズ、種類、署名者
- 判定と確信度 — 悪意あり/不審/無害と、その根拠
- ファミリーとキャンペーン — アトリビューションを裏付ける証拠
- 機能 — ATT&CK にマッピングし、各項目に証拠を提示
- IOC — 上記のとおり段階分けし、各指標の確信度を明記
- 検知 — YARA、Sigma、ネットワークシグネチャーと、FP テストの結果
- 推奨アクション — 封じ込め、ブロック、ハンティングクエリ
ATT&CK のカバレッジ
secskills-core/ttp-index.json から生成されています。このファイルを編集してから、
python3 scripts/sync_attack.py --write を実行してください。レポートで引用する前に、
ID が現在の ATT&CK リリースと一致していることを再確認してください。
リソース開発(TA0042)
- T1588 能力の取得
初期アクセス(TA0001)
- T1566.001 スピアフィッシング添付ファイル —
performing-social-engineering、analyzing-phishing-emailsも参照
実行(TA0002)
- T1059.001 PowerShell —
escalating-windows-privilegesも参照 - T1203 クライアント実行のための悪用 —
performing-social-engineering、exploiting-memory-corruptionも参照
権限昇格(TA0004)
- T1055 プロセスインジェクション (「防御回避」にも該当) —
escalating-windows-privilegesも参照
防御回避(TA0005)
- T1027 難読化されたファイルまたは情報 —
analyzing-binaries、analyzing-shellcodeも参照 - T1027.002 ソフトウェアのパッキング —
analyzing-binariesも参照 - T1140 ファイルまたは情報の難読化解除/デコード —
analyzing-binaries、analyzing-shellcodeも参照 - T1218.011 Rundll32 —
hunting-threatsも参照 - T1497 仮想化/サンドボックスの回避 —
analyzing-binariesも参照 - T1553 信頼制御の無効化 —
auditing-supply-chainも参照 - T1620 リフレクティブコードローディング —
analyzing-shellcodeも参照 - T1622 デバッガーの回避 —
analyzing-binariesも参照
収集(TA0009)
- T1056.001 キーロギング (「認証情報へのアクセス」にも該当)
コマンド&コントロール(TA0011)
- T1071 アプリケーション層プロトコル —
engineering-detections、analyzing-network-trafficも参照 - T1132 データエンコーディング —
transferring-files、analyzing-network-trafficも参照 - T1568 動的解決 —
hunting-threats、analyzing-network-trafficも参照 - T1573 暗号化チャネル —
engineering-detections、analyzing-network-trafficも参照
影響(TA0040)
- T1486 影響を与えるためのデータ暗号化 —
responding-to-incidentsも参照
これらのいずれかに関する検出コンテンツ:engineering-detections。プロアクティブな検索:hunting-threats。侵害後の対応:responding-to-incidents。
外部ソースを読む
公開されているアドバイザリ、仕様書、ベンダーレポートをMarkdownとして取得します。
curl -sL "https://defuddle.md/<url>" # scheme in the path is optional
ページの定型的な部分を取り除くため、文章中心のページではトークン数を約78%削減できます。また、要約ではなく全文を返すので、検索にかけて、該当する情報がないという結果も信頼できます。
この用途に適さないケースが3つあります。構造化データの可読性を損なうため、JSONやAPIレスポンスはそのまま取得してください。認証が必要なページやJavaScriptで描画されるページは、匿名で取得されるため、直接取得してください。また、攻撃者のインフラ(フィッシングリンク、C2、マルウェアホスティング)、クライアント所有のホスト、エンゲージメントURLは、絶対にこの経由でアクセスしないでください。リクエストは第三者に渡り、稼働中の攻撃者インフラの場合は、運用者に気づかれることにもなります。
一部のサイトは抽出ツールをブロックし、ページの代わりにエラーの内容を返します。たとえば、freedesktop.orgでは{"error":"Failed to fetch: 418 I'm a teapot"}が返されます。これは取得が拒否されたのであって、ソースにその内容が存在しないと書かれているわけではありません。それを根拠に結論を出す前に、URLを直接再取得してください。
参考資料
analyzing-binaries— 逆アセンブル、アンパック、アンチ解析の詳細responding-to-incidents— サンプルを対象としたスコープ設定と根絶engineering-detections— 機能を本番環境に導入するルールへ変換- 分類にはMITRE ATT&CKとMBC(Malware Behavior Catalog)
- 中核となるツールチェーンとして、
capa、floss、oletools、Volatility 3、YARA