implementing-threat-modeling-with-mitre-attack について
SOCチームやセキュリティ責任者向けに、MITRE ATT&CKを使った脅威モデルの構築と継続的な更新を支援するスキルです。攻撃者の行動と既存の検知範囲を照合し、ギャップの特定、対策計画、防御の検証を行います。
主な機能
- 01関連する脅威グループとTTPの特定
- 02ATT&CK Navigatorの脅威レイヤー作成
- 03検知ルールの対応付けとギャップ分析
- 04検知対策の優先順位付け
- 05攻撃者エミュレーションによる範囲検証
活用シーン
- 01業界関連の脅威グループへの検知評価
- 02クラウド移行時の検知戦略立案
- 03検知ギャップに基づくパープルチーム演習
- 04検知の盲点を用いた予算要求の裏付け
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill implementing-threat-modeling-with-mitre-attackインストール後、Claude Code で/implementing-threat-modeling-with-mitre-attackを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
MITRE ATT&CK を使用した脅威モデリングの実施
使用する場面
次のような場合に、このスキルを使用します。
- SOC チームが、関連する脅威アクターとその TTP に対する検知カバレッジを評価する必要がある場合
- セキュリティ部門のリーダーが、脅威に基づく防御の優先順位付けを必要としている場合
- 新しい環境(クラウド移行、OT 統合)で検知戦略の計画が必要な場合
- パープルチーム演習で、脅威モデルに基づく体系的な敵対者エミュレーションが必要な場合
- 年次リスク評価で、ATT&CK に基づく脅威情勢の分析が必要な場合
一度限りの演習としては使用しないでください。脅威モデルは、敵対者の TTP の進化や、組織の攻撃対象領域の変化に応じて継続的に更新する必要があります。
前提条件
- MITRE ATT&CK フレームワークの知識(Enterprise、ICS、Mobile、または Cloud のマトリックス)
- レイヤーの可視化に使用する ATT&CK Navigator ツール(Web またはローカル)
- ATT&CK のテクニック ID にマッピングされた最新の検知ルール一覧
- 自組織のセクターを標的とする敵対者グループに関する脅威インテリジェンス
- 重要度分類を含む組織の資産一覧
ワークフロー
ステップ 1:関連する脅威アクターを特定する
MITRE ATT&CK Groups を使用して、自組織のセクターを標的とする敵対者グループを調査します。
import requests
import json
# Download ATT&CK STIX data
response = requests.get(
"https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json"
)
attack_data = response.json()
# Extract groups and their techniques
groups = {}
for obj in attack_data["objects"]:
if obj["type"] == "intrusion-set":
group_name = obj["name"]
aliases = obj.get("aliases", [])
description = obj.get("description", "")
groups[group_name] = {
"aliases": aliases,
"description": description[:200],
"techniques": []
}
# Map techniques to groups via relationships
relationships = [obj for obj in attack_data["objects"] if obj["type"] == "relationship"]
techniques = {obj["id"]: obj for obj in attack_data["objects"]
if obj["type"] == "attack-pattern"}
for rel in relationships:
if rel["relationship_type"] == "uses":
source = rel["source_ref"]
target = rel["target_ref"]
for group_name, group_data in groups.items():
if source == group_data.get("id") and target in techniques:
tech = techniques[target]
ext_refs = tech.get("external_references", [])
for ref in ext_refs:
if ref.get("source_name") == "mitre-attack":
group_data["techniques"].append(ref["external_id"])
# Example: Financial sector threat actors
financial_actors = ["FIN7", "FIN8", "Carbanak", "APT38", "Lazarus Group"]
for actor in financial_actors:
if actor in groups:
print(f"{actor}: {len(groups[actor]['techniques'])} techniques")
print(f" Top techniques: {groups[actor]['techniques'][:10]}")
ステップ 2:脅威アクターの TTP プロファイルを作成する
優先度の高い脅威アクターについて、ATT&CK Navigator のレイヤーを作成します。
import json
def create_attack_layer(actor_name, techniques, color="#ff6666"):
"""Generate ATT&CK Navigator JSON layer for a threat actor"""
layer = {
"name": f"{actor_name} TTP Profile",
"versions": {
"attack": "15",
"navigator": "5.0",
"layer": "4.5"
},
"domain": "enterprise-attack",
"description": f"Techniques associated with {actor_name}",
"techniques": [
{
"techniqueID": tech_id,
"tactic": "",
"color": color,
"comment": f"Used by {actor_name}",
"enabled": True,
"score": 1
}
for tech_id in techniques
],
"gradient": {
"colors": ["#ffffff", color],
"minValue": 0,
"maxValue": 1
}
}
return layer
# Create layers for top threat actors
fin7_techniques = ["T1566.001", "T1059.001", "T1053.005", "T1547.001",
"T1078", "T1021.001", "T1003", "T1071.001", "T1041"]
layer = create_attack_layer("FIN7", fin7_techniques, "#ff6666")
with open("fin7_layer.json", "w") as f:
json.dump(layer, f, indent=2)
ステップ 3:現在の検知カバレッジをマッピングする
ATT&CK にマッピングされた現在の検知ルールをエクスポートします。
--- Extract ATT&CK technique mappings from Splunk ES correlation searches
| rest /services/saved/searches
splunk_server=local
| where match(title, "^(COR|ESCU|RBA):")
| eval techniques = if(isnotnull(action.correlationsearch.annotations),
spath(action.correlationsearch.annotations, "mitre_attack"),
"unmapped")
| stats count by techniques
| mvexpand techniques
| stats count by techniques
| rename techniques AS technique_id, count AS rule_count
検知カバレッジレイヤーを作成します。
def create_coverage_layer(detection_rules):
"""Generate coverage layer from detection rule inventory"""
technique_counts = {}
for rule in detection_rules:
for tech in rule.get("techniques", []):
technique_counts[tech] = technique_counts.get(tech, 0) + 1
layer = {
"name": "SOC Detection Coverage",
"versions": {"attack": "15", "navigator": "5.0", "layer": "4.5"},
"domain": "enterprise-attack",
"techniques": [
{
"techniqueID": tech_id,
"color": "#31a354" if count >= 2 else "#a1d99b" if count == 1 else "",
"score": count,
"comment": f"{count} detection rule(s)"
}
for tech_id, count in technique_counts.items()
],
"gradient": {
"colors": ["#ffffff", "#a1d99b", "#31a354"],
"minValue": 0,
"maxValue": 3
}
}
return layer
ステップ 4:ギャップ分析を実施する
脅威アクターの TTP と検知カバレッジを重ね合わせます。
def gap_analysis(threat_techniques, covered_techniques):
"""Identify detection gaps for specific threat actor"""
gaps = set(threat_techniques) - set(covered_techniques)
covered = set(threat_techniques) & set(covered_techniques)
print(f"Threat Actor Techniques: {len(threat_techniques)}")
print(f"Detected: {len(covered)} ({len(covered)/len(threat_techniques)*100:.0f}%)")
print(f"Gaps: {len(gaps)} ({len(gaps)/len(threat_techniques)*100:.0f}%)")
# Prioritize gaps by kill chain phase
priority_order = {
"TA0001": 1, "TA0002": 2, "TA0003": 3, "TA0004": 4,
"TA0005": 5, "TA0006": 6, "TA0007": 7, "TA0008": 8,
"TA0009": 9, "TA0010": 10, "TA0011": 11, "TA0040": 12
}
gap_details = []
for tech_id in gaps:
gap_details.append({
"technique": tech_id,
"priority": "HIGH" if tech_id.split(".")[0] in ["T1003", "T1021", "T1059"] else "MEDIUM",
"recommendation": f"Build detection for {tech_id}"
})
return {
"total_actor_techniques": len(threat_techniques),
"covered": len(covered),
"gaps": len(gaps),
"coverage_pct": round(len(covered)/len(threat_techniques)*100, 1),
"gap_details": sorted(gap_details, key=lambda x: x["priority"])
}
# Run analysis
result = gap_analysis(fin7_techniques, current_coverage)
ステップ 5:優先順位を付けた修復計画を作成する
検知エンジニアリングのロードマップを作成します。
threat_model_remediation_plan:
assessed_date: 2024-03-15
primary_threats:
- FIN7 (Financial sector)
- APT38 (DPRK financial)
- Lazarus Group (Destructive)
current_coverage: 64%
target_coverage: 80%
priority_1_gaps: # 30-day target
- technique: T1021.002
name: SMB/Windows Admin Shares
data_source: Windows Security Event 5140
effort: Low
detection_approach: Monitor admin share access from non-admin workstations
- technique: T1003.006
name: DCSync
data_source: Windows Security Event 4662
effort: Medium
detection_approach: Detect DS-Replication-Get-Changes from non-DC sources
priority_2_gaps: # 60-day target
- technique: T1055
name: Process Injection
data_source: Sysmon EventCode 8, 10
effort: High
detection_approach: Monitor cross-process memory access patterns
- technique: T1071.001
name: Web Protocols (C2)
data_source: Proxy/Firewall logs
effort: Medium
detection_approach: Detect beaconing patterns in HTTP/S traffic
priority_3_gaps: # 90-day target
- technique: T1070.004
name: File Deletion
data_source: Sysmon EventCode 23
effort: Low
detection_approach: Monitor mass file deletion in sensitive directories
ステップ 6:敵対者エミュレーションで検証する
MITRE Caldera または Atomic Red Team を使用して、カバレッジをテストします。
# Using Atomic Red Team to validate coverage for FIN7 techniques
# T1566.001 — Spearphishing Attachment
Invoke-AtomicTest T1566.001
# T1059.001 — PowerShell
Invoke-AtomicTest T1059.001 -TestNumbers 1,2,3
# T1053.005 — Scheduled Task
Invoke-AtomicTest T1053.005
# T1547.001 — Registry Run Keys
Invoke-AtomicTest T1547.001
# T1003 — Credential Dumping
Invoke-AtomicTest T1003 -TestNumbers 1,2
# Verify detections
# Check SIEM for corresponding alerts within 15 minutes
脅威モデルの正確性を検証するため、エミュレーションの結果を記録します。
主要な概念
| 用語 | 定義 |
|---|---|
| MITRE ATT&CK | 実環境での観測に基づく、敵対者の戦術、テクニック、手順のナレッジベース |
| TTP | 戦術、テクニック、手順。敵対者グループの行動パターン |
| ATT&CK Navigator | カバレッジや脅威プロファイルを示すレイヤー化されたヒートマップとして、ATT&CK マトリックスを可視化する Web ツール |
| ギャップ分析 | 脅威アクターの TTP と検知カバレッジを比較して、見落としを特定するプロセス |
| 脅威に基づく防御 | 理論上のリスクではなく、実際の敵対者の行動に基づいて防御の優先順位を決めるセキュリティ戦略 |
| 敵対者エミュレーション | 検知および対応能力を検証するために、脅威アクターの TTP を制御された形でシミュレーションすること |
ツールとシステム
- MITRE ATT&CK Navigator:ATT&CK テクニックのレイヤーを作成および重ね合わせるための Web ベースの可視化ツール
- MITRE Caldera:大規模な検知カバレッジのテストに使用する、自動化された敵対者エミュレーションプラットフォーム
- Atomic Red Team:セキュリティ制御の検証に使用する、ATT&CK テクニックのオープンソーステストライブラリ
- CTID ATT&CK Workbench:ATT&CK ナレッジベースを組織のコンテキストに合わせてカスタマイズするための MITRE ツール
- Tidal Cyber:ATT&CK フレームワークを使用して、脅威に基づく防御計画を支援する商用プラットフォーム
一般的なシナリオ
- 年次脅威評価:主要な脅威アクター上位 5 組を ATT&CK にマッピングし、検知と重ね合わせて、ギャップ分析を作成する
- クラウド移行計画:クラウド固有の脅威(T1078.004、T1537)をモデル化し、検知カバレッジを計画する
- M&A セキュリティ評価:買収した企業の環境を、関連する脅威アクターに照らして脅威モデリングする
- 予算の正当化:ギャップ分析を使用して、ツールへの投資が必要な検知の見落としを示す
- パープルチーム計画:脅威モデルで優先度が最も高いギャップに基づいて、敵対者エミュレーションのシナリオを選定する
出力形式
THREAT MODEL ASSESSMENT — Financial Services Division
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Date: 2024-03-15
Threat Actors: FIN7, APT38, Lazarus Group
Techniques Total: 87 unique techniques across all actors
DETECTION COVERAGE:
Covered: 56/87 (64%)
Gaps: 31/87 (36%)
Tactic Coverage Breakdown:
Initial Access: 78% ████████░░
Execution: 82% █████████░
Persistence: 71% ████████░░
Priv Escalation: 65% ███████░░░
Defense Evasion: 52% ██████░░░░ <-- Priority gap
Credential Access: 58% ██████░░░░ <-- Priority gap
Discovery: 45% █████░░░░░
Lateral Movement: 61% ███████░░░
Collection: 50% ██████░░░░
Exfiltration: 55% ██████░░░░
C2: 67% ███████░░░
TOP PRIORITY GAPS (30-day remediation):
1. T1055 Process Injection — used by all 3 actors, 0 detections
2. T1003.006 DCSync — used by FIN7 and Lazarus, 0 detections
3. T1070.004 File Deletion — evidence destruction, 0 detections
INVESTMENT RECOMMENDATION:
Closing top 10 gaps requires: 2 detection engineer FTEs, 60 days
Expected coverage improvement: 64% -> 76%
コメント
Markdown 対応