SuperAPI AI 工具集

analyzing-campaign-attribution-evidence

安全与审计

查看项目

更新于 10-15 13:49

技能介绍

用途

本技能用于在网络行动调查中系统地评估归因证据,以判断某项行动由哪个威胁行为者或组织负责。其核心方法结合了入侵分析钻石模型(Diamond Model)与竞争性假设分析(ACH,Analysis of Competing Hypotheses),通过对多类归因指标进行收集、加权和对比,形成带置信度的归因评估。

主要能力

技能覆盖六类归因证据:

  • 基础设施重叠:共用的 C2 服务器、域名、IP 段、托管服务商
  • TTP 一致性:跨行动匹配的 ATT&CK 技术与子技术
  • 恶意软件代码相似性:共享代码库、编译器、PDB 路径、加密例程
  • 操作模式:时间(工作时段、时区)、目标模式、行动节奏
  • 语言痕迹:特定语言的内嵌字符串、变量名、错误消息
  • 受害目标画像:目标行业、地理与组织特征的一致性

置信度分为高(多个独立证据类别指向同一行为者)、中(若干类别匹配但仍有模糊)和低(证据有限,可能存在假旗或共享工具)。

使用方式

技能提供可运行的 Python 代码与工作流:

Step 1:收集归因证据

使用 AttributionAnalyzer 类收集证据并管理假设:

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"

Step 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",
    }

Step 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,
    }

Step 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

适用场景

  • 调查安全事件并分析行动归因证据时
  • 为该领域构建检测规则或威胁狩猎查询时
  • SOC 分析师需要结构化分析流程时
  • 验证相关攻击技术的安全监控覆盖时

限制与前提

使用前需具备以下条件:Python 3.9+ 及 attackcti、stix2、networkx 库;可访问威胁情报平台(MISP、OpenCTI);理解入侵分析钻石模型;熟悉 MITRE ATT&CK 威胁组织画像;了解恶意软件分析与基础设施追踪技术。

验证标准包括:证据收集覆盖全部六个归因类别;ACH 矩阵正确评估证据与竞争假设;基础设施重叠分析识别共享指标;TTP 对比使用 ATT&CK 技术 ID 保证精度;归因置信度得到合理论证;报告包含替代假设与假旗考量。

参考:钻石模型、MITRE ATT&CK Groups、竞争性假设分析、Threat Attribution Framework。