# Fixture 7 (slow_burn) — see development/CAMPAIGN_CLUSTERING.md §2. # # Multi-month APT campaign. The unique signal this fixture stresses # is OPERATIONAL TEMPO: APTs (real ones, not skiddies) take their # time. Recon over weeks, exploitation later, action-on-objectives # later still. Long stretches of true silence between phases. # Compresses-to-three-days adversaries this is not. # # A MazeNET-style deep nested topology (DECNET's recursive DAG mode) # is exactly what an APT operator burns weeks against — mapping # decoy networks, working out which subnet looks productive, only # then committing to exploitation. This fixture encodes that tempo # as a 90-day campaign with three operational windows: # # week 2 (days 7-11) Delivery, Discovery # month 2 (days 35-39) Exploitation, Persistence # month 3 (days 75-79) Lateral Movement, Collection, Exfiltration # # Modeled as three DSL actors representing the same operator's three # operational phases (same modeling caveat as fixtures 4 and 5: the # factory mints a separate truth_identity_id per DSL actor; this is # a CAMPAIGN-LEVEL fixture only). All three share JA3 + HASSH + # payload + C2 callback — the operator's toolchain stays stable # across the campaign. # # Pass condition: composite_signals_clusterer (fingerprint OR C2) # folds all three windows into one cluster regardless of when they # happened. Time-agnostic edge construction is what makes this work. # # Adversarial condition: recency_decay_clusterer with a 14-day # half-life and a 0.5 weight threshold cannot bridge the multi-week # silences. Edges between week-2 and month-2 (≥24 days) decay to # ~exp(-24/14) ≈ 0.18 < 0.5 → dropped. Edges between month-2 and # month-3 (≥36 days) decay to ~exp(-36/14) ≈ 0.075 → dropped. The # campaign fragments into three clusters; completeness collapses. # # This is the canonical production failure mode for graph-based # clusterers that silently expire old edges to bound memory or # bias toward "what's hot." Catching it in synthetic data is what # this fixture exists for. campaign: id: slow-burn-001 duration_days: 90 actors: - id: ops-recon asn: 64540 ip_pool: sticky ja3: "771,4865-4866-4867-49195-49199-49196-49200-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513,29-23-24,0" hassh: "slow-burn-gggggggg-gggggggg-gggggggg" hours_active_utc: [3, 4, 5] jitter_seconds: 60 active_days: [7, 8, 9, 10, 11] - id: ops-exploit asn: 64541 ip_pool: sticky ja3: "771,4865-4866-4867-49195-49199-49196-49200-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513,29-23-24,0" hassh: "slow-burn-gggggggg-gggggggg-gggggggg" hours_active_utc: [3, 4, 5] jitter_seconds: 60 active_days: [35, 36, 37, 38, 39] - id: ops-action asn: 64542 ip_pool: sticky ja3: "771,4865-4866-4867-49195-49199-49196-49200-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513,29-23-24,0" hassh: "slow-burn-gggggggg-gggggggg-gggggggg" hours_active_utc: [3, 4, 5] jitter_seconds: 60 active_days: [75, 76, 77, 78, 79] phases: # Week 2 — recon window. Delivery probes, discovery against the # MazeNET surface to identify productive subnets. - name: delivery actor: ops-recon tool_signature: c2_callback: "c2.slow-burn.example" target_selector: { service: any, count: 3 } dwell_seconds: 1 - name: discovery actor: ops-recon tool_signature: c2_callback: "c2.slow-burn.example" target_selector: { service: any, count: 3 } dwell_seconds: 5 # Month 2 — exploitation. Operator commits to one of the # productive subnets identified during recon. - name: exploitation actor: ops-exploit tool_signature: payload_hash: "slow-burn-stage1-payload" c2_callback: "c2.slow-burn.example" target_selector: { service: ssh, count: 3 } dwell_seconds: 10 - name: persistence actor: ops-exploit tool_signature: c2_callback: "c2.slow-burn.example" target_selector: { decky: previous_success, count: 2 } dwell_seconds: 10 # Month 3 — actions on objectives. Lateral movement, collection, # exfil — only after the operator has confidence in the foothold. - name: lateral_movement actor: ops-action tool_signature: c2_callback: "c2.slow-burn.example" target_selector: { service: ssh, count: 3 } dwell_seconds: 10 - name: collection actor: ops-action tool_signature: payload_hash: "slow-burn-stage1-payload" c2_callback: "c2.slow-burn.example" target_selector: { service: ssh, count: 2 } dwell_seconds: 10 - name: exfiltration actor: ops-action tool_signature: c2_callback: "c2.slow-burn.example" target_selector: { service: ssh, count: 2 } dwell_seconds: 10