Skip to content

Architecture

flowchart LR
  F["Forensic artifacts JSON (or REVENANT export)"] --> ING["ingest: typed signals + SHA-256"]
  M["Malware feature records (or VITRINE triage)"] --> ING
  ING --> CUS[("hash-chained custody log, optional Ed25519 signature")]
  ATT["MITRE ATT&CK STIX"] --> KGB["kg_build"]
  MISP["MISP galaxy: aliases, sponsor state"] --> KGB
  AB["abuse.ch ThreatFox / MalwareBazaar metadata"] --> KGB
  KGB --> KG[("knowledge graph: signal - campaign - actor")]
  ING --> ACH["ACH engine: specificity x kind weight + IDF-cosine TTP profile"]
  KG --> ACH
  ACH --> FF["false-flag reasoner R1-R4"]
  FF --> GR["confidence ladder HIGH / MEDIUM / LOW / INSUFFICIENT"]
  GR --> REP["Markdown / JSON / STIX 2.1 report"]
  CUS --> REP
  KG --> NEO["Neo4j Cypher export"]
  ACH --> API["FastAPI /assess"]

Scoring

For each actor, support is a noisy-OR over (a) the case's point signals that link to it, each weighted kind weight x specificity where specificity = 1 / number of actors the signal links to, and (b) one tradecraft term 0.6 x IDF-cosine(case techniques, actor technique profile). Contradiction is the noisy-OR of signals that link to other actors; score = support x (1 - 0.6 x contradiction). Every weight is printed in the report (a Weights table that marks overridden values) and can be overridden (--weight imphash=0.2). See ADR 0002.

False-flag rules (ADR 0003)

Rule Fires when
R1 an actor is supported only by discriminating forgeable artifacts (Rich header, language, mutex)
R2 forgeable artifacts and hard evidence point to disjoint actors (the Olympic Destroyer pattern)
R3 specific hard evidence points to actors of different sponsor states
R4 anchored tooling/infrastructure points to one actor while tradecraft matches another state's actor

Confidence ladder

HIGH needs two independent anchor kinds, score >= 0.85, margin >= 0.3 and no flags; MEDIUM needs an anchor, score >= 0.6, margin >= 0.2 and no flags. Tradecraft-only evidence reaches at most LOW. Any false-flag indicator caps the verdict at LOW; if FALSE_FLAG leads, no actor is named.

Modules

Module Role
dragnet/sources/ loaders: ATT&CK STIX, MISP galaxy, APTnotes, abuse.ch (metadata)
dragnet/kg_build.py knowledge graph (profiles, campaigns, aliases, sponsor state, IOC and imphash layers)
dragnet/graph.py signal index, specificity, IDF-cosine TTP similarity
dragnet/ach.py ACH scoring, false-flag rules, confidence ladder, ACH matrix
dragnet/ingest.py, custody.py evidence to signals, content hashing, custody chain, Ed25519 signing
dragnet/adapters.py REVENANT / VITRINE export to case file
dragnet/stix.py STIX 2.1 bundle export
dragnet/bench.py baselines, ablations, metrics, bootstrap CIs, false-flag stress test
dragnet/report.py, cli.py, api.py, neo4j_export.py reports, CLI, FastAPI, Neo4j Cypher