关于 analyzing-campaign-attribution-evidence
面向 SOC 分析师和威胁情报调查人员的归因分析技能,按证据类别比较威胁活动与候选行为者。结合 Diamond Model 和 ACH,形成带置信度的评估并考虑替代假设及误导迹象。
主要功能
- 01收集六类归因证据
- 02分析基础设施重叠
- 03比较 ATT&CK TTP
- 04用 ACH 评估竞争假设
- 05生成置信度归因报告
适用场景
- 01调查事件并评估可能的威胁行为者
- 02构建检测规则或威胁狩猎查询
- 03验证相关攻击技术的监控覆盖
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill analyzing-campaign-attribution-evidence安装后在 Claude Code 中输入/analyzing-campaign-attribution-evidence确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py详细介绍
分析行动归因证据
概述
行动归因分析是指系统地评估证据,以确定哪个威胁行为者或组织应对某项网络行动负责。本技能涵盖使用钻石模型和 ACH(竞争性假设分析)收集并加权归因指标,分析基础设施重叠、TTP 一致性、恶意软件代码相似性、行动时间模式和语言痕迹,从而构建带有置信度权重的归因评估。
适用场景
- 调查需要分析行动归因证据的安全事件时
- 为此领域构建检测规则或威胁狩猎查询时
- SOC 分析师需要此类分析的结构化流程时
- 验证针对相关攻击技术的安全监控覆盖情况时
前置条件
- Python 3.9+,以及
attackcti、stix2、networkx库 - 可访问威胁情报平台(MISP、OpenCTI)
- 了解入侵分析钻石模型
- 熟悉 MITRE ATT&CK 威胁组织概况
- 了解恶意软件分析和基础设施追踪技术
核心概念
归因证据类别
- 基础设施重叠:共用 C2 服务、域名、IP 地址范围、托管服务提供商
- TTP 一致性:不同行动中匹配的 ATT&CK 技术和子技术
- 恶意软件代码相似性:共用代码库、编译器、PDB 路径、加密例程
- 行动模式:时间(工作时间、时区)、目标模式、行动节奏
- 语言痕迹:特定语言中的嵌入式字符串、变量名称、错误消息
- 受害者特征:目标行业、地理位置和组织概况的一致性
置信度级别
- 高置信度:多个独立证据类别指向同一行为者
- 中等置信度:若干证据类别相符,但仍存在一些模糊之处
- 低置信度:证据有限,可能存在误导性线索或共用工具
竞争性假设分析(ACH)
一种结构化分析方法,用于依据多个相互竞争的假设评估证据。针对每个假设,将每条证据评分为一致、不一致或中立。优先考虑不一致证据最少的假设。
工作流
步骤 1:收集归因证据
from stix2 import MemoryStore, Filter
from collections import defaultdict
class AttributionAnalyzer:
def __init__(self):
self.evidence = []
self.hypotheses = {}
def add_evidence(self, category, description, value, confidence):
self.evidence.append({
"category": category,
"description": description,
"value": value,
"confidence": confidence,
"timestamp": None,
})
def add_hypothesis(self, actor_name, actor_id=""):
self.hypotheses[actor_name] = {
"actor_id": actor_id,
"consistent_evidence": [],
"inconsistent_evidence": [],
"neutral_evidence": [],
"score": 0,
}
def evaluate_evidence(self, evidence_idx, actor_name, assessment):
"""Assess evidence against a hypothesis: consistent/inconsistent/neutral."""
if assessment == "consistent":
self.hypotheses[actor_name]["consistent_evidence"].append(evidence_idx)
self.hypotheses[actor_name]["score"] += self.evidence[evidence_idx]["confidence"]
elif assessment == "inconsistent":
self.hypotheses[actor_name]["inconsistent_evidence"].append(evidence_idx)
self.hypotheses[actor_name]["score"] -= self.evidence[evidence_idx]["confidence"] * 2
else:
self.hypotheses[actor_name]["neutral_evidence"].append(evidence_idx)
def rank_hypotheses(self):
"""Rank hypotheses by attribution score."""
ranked = sorted(
self.hypotheses.items(),
key=lambda x: x[1]["score"],
reverse=True,
)
return [
{
"actor": name,
"score": data["score"],
"consistent": len(data["consistent_evidence"]),
"inconsistent": len(data["inconsistent_evidence"]),
"confidence": self._score_to_confidence(data["score"]),
}
for name, data in ranked
]
def _score_to_confidence(self, score):
if score >= 80:
return "HIGH"
elif score >= 40:
return "MODERATE"
else:
return "LOW"
步骤 2:分析基础设施重叠
def analyze_infrastructure_overlap(campaign_a_infra, campaign_b_infra):
"""Compare infrastructure between two campaigns for attribution."""
overlap = {
"shared_ips": set(campaign_a_infra.get("ips", [])).intersection(
campaign_b_infra.get("ips", [])
),
"shared_domains": set(campaign_a_infra.get("domains", [])).intersection(
campaign_b_infra.get("domains", [])
),
"shared_asns": set(campaign_a_infra.get("asns", [])).intersection(
campaign_b_infra.get("asns", [])
),
"shared_registrars": set(campaign_a_infra.get("registrars", [])).intersection(
campaign_b_infra.get("registrars", [])
),
}
overlap_score = 0
if overlap["shared_ips"]:
overlap_score += 30
if overlap["shared_domains"]:
overlap_score += 25
if overlap["shared_asns"]:
overlap_score += 15
if overlap["shared_registrars"]:
overlap_score += 10
return {
"overlap": {k: list(v) for k, v in overlap.items()},
"overlap_score": overlap_score,
"assessment": "STRONG" if overlap_score >= 40 else "MODERATE" if overlap_score >= 20 else "WEAK",
}
步骤 3:比较不同组织的 TTP
from attackcti import attack_client
def compare_campaign_ttps(campaign_techniques, known_actor_techniques):
"""Compare campaign TTPs against known threat actor profiles."""
campaign_set = set(campaign_techniques)
actor_set = set(known_actor_techniques)
common = campaign_set.intersection(actor_set)
unique_campaign = campaign_set - actor_set
unique_actor = actor_set - campaign_set
jaccard = len(common) / len(campaign_set.union(actor_set)) if campaign_set.union(actor_set) else 0
return {
"common_techniques": sorted(common),
"common_count": len(common),
"unique_to_campaign": sorted(unique_campaign),
"unique_to_actor": sorted(unique_actor),
"jaccard_similarity": round(jaccard, 3),
"overlap_percentage": round(len(common) / len(campaign_set) * 100, 1) if campaign_set else 0,
}
步骤 4:生成归因报告
def generate_attribution_report(analyzer):
"""Generate structured attribution assessment report."""
rankings = analyzer.rank_hypotheses()
report = {
"assessment_date": "2026-02-23",
"total_evidence_items": len(analyzer.evidence),
"hypotheses_evaluated": len(analyzer.hypotheses),
"rankings": rankings,
"primary_attribution": rankings[0] if rankings else None,
"evidence_summary": [
{
"index": i,
"category": e["category"],
"description": e["description"],
"confidence": e["confidence"],
}
for i, e in enumerate(analyzer.evidence)
],
}
return report
验证标准
- 证据收集涵盖全部六个归因类别
- ACH 矩阵正确评估证据与相互竞争假设之间的关系
- 基础设施重叠分析识别出共用指标
- TTP 比较使用 ATT&CK 技术 ID,以确保精确性
- 归因置信度级别均有充分依据
- 报告包含替代假设和误导性线索方面的考量
参考资料
评论
支持 Markdown