Bulwark — the antivirus
Not a signature engine. Not an EDR widget. Proposed design: the Fulcrum pipeline run continuously, unattended, against the device images and firmware revisions critical infrastructure actually deploys.
By design, Bulwark would run the same seven steps as Fulcrum, but with the schedule as the operator, the vendor surface (Cisco IOS XE, Juniper Junos, Fortinet FortiOS, ICS firmware, federal civilian-agency images) as the target set, and the same EVRP-pinned disclosure terminal. Once built, findings would exit only through coordinated disclosure — a Bulwark run would not be able to terminate at a broker, an internal-only stockpile, or a private exploit retention. The profile would be gated; unauthorized accounts could not launch it; every run would be append-only audit-logged in Firestore. See EAR compliance for the full control inventory the design specifies.
The same seven steps that, run on a single CVE-2023-20198 patch in late 2023, would have surfaced the variant class Salt Typhoon weaponized 14 months later. The thing that didn’t exist was the agent loop to run them continuously, across the entire vendor surface, without a human in the patch-diff seat for every iteration. Bulwark is the proposed agent loop to fill that gap.
# salt-typhoon-eviction.yaml — sample Bulwark campaign.
# Run continuously and unattended; PSIRT subscription auto-seeds.
campaign:
name: salt-typhoon-eviction
intent: CND # antivirus / eviction
cadence: continuous # no operator in the loop per cycle
audit: firestore://bulwark_runs/{run_id}
surface:
# Layers 1+2 of the eviction stack: where the entry vector and
# the persistence implants live.
- vendor: cisco
product: ios-xe
coverage: all 16.x and 17.x trains
images_from: software.cisco.com
- vendor: cisco
product: ios-classic
coverage: 12.x train (legacy ISP edge)
- vendor: cisco
product: nx-os
coverage: 9.x and 10.x
- vendor: cisco
product: smart-install
note: legacy feature, CVE-2018-0171 surface
seeds:
# Patched CVEs whose variant class Bulwark hunts. New advisories
# auto-ingest via PSIRT RSS; the entries below are the historical
# Salt Typhoon entry vectors as initial reference points.
- id: CVE-2023-20198
component: ios-xe / web-ui
primitive: privilege escalation via web management
- id: CVE-2023-20273
component: ios-xe / web-ui
primitive: command injection
- id: CVE-2018-0171
component: smart install
primitive: RCE on stale feature
pipeline:
- phase: acquire tool: software.cisco.com fetcher
out: paired_image{patched, vulnerable}
- phase: diff tool: ghidra-headless
out: bindiff/{added, removed, modified}.json
- phase: search tool: variant-hunt
target: sibling sinks of seed primitives
out: candidate_locations.jsonl
- phase: fuzz tool: afl++
duration_per_target: 24h
corpus: /var/bulwark/corpora/{component}
- phase: triage tool: gdb + pwndbg
classify: [crash_kind, exploit_primitive, reachability]
- phase: poc tool: pwntools
constraint: minimal repro for vendor confirmation
- phase: disclose terminal: cisco-psirt
cc: [cert-cc, hackerone]
severity_floor: medium
disclosure:
# Pinned in code (src/contracts/evrp.schema.json —
# DisclosureTerminal enum). A Bulwark run cannot terminate
# at any other channel.
allowed: [psirt, hackerone, cert-cc, public-90day-advisory]
forbidden: [broker, private_retention, internal_only_stockpile]
constraints:
ear: ECCN 4D004
allowlist_gated: true
rulebook: src/contracts/agent-rules.schema.json
# Illustrative output — design mock-up, not a real run.
$ trenchwork bulwark deploy salt-typhoon-eviction.yaml
[bulwark 16:42:01] campaign loaded — surface: 4 trains across 1 vendor
[bulwark 16:42:01] seeds resolved — 3 historical CVEs (Salt Typhoon vectors)
[bulwark 16:42:02] PSIRT subscription active — new advisories auto-seed
[bulwark 16:42:04] phase acquire ▸ 18 paired images queued
[bulwark 16:43:12] phase diff ▸ ghidra-headless workers: 12 (16.x: 8, 17.x: 4)
[bulwark 16:51:28] phase search ▸ 47 candidate variant locations
[bulwark 17:02:09] phase fuzz ▸ afl++ campaigns: 47 × 24h queued
[bulwark 17:02:09] disclosure terminal: cisco-psirt (cc: cert-cc, hackerone)
[bulwark 17:02:09] audit log: firestore://bulwark_runs/2026-05-12T16:42:01Z
If built, sale and use would be scoped under EAR ECCN 4D004, with controls allowlist-gated and append-only audit-logged.
Fulcrum Details →
- Driver
- Operator
- Cadence
- Per-engagement
- Scope
- Chosen target
- Intent
- CNE / CNA-shaped, disclosure-pinned
- Surface
- Variant research, exploit dev
Bulwark this page
- Driver
- Schedule
- Cadence
- Continuous, unattended
- Scope
- Vendor surface deployed at scale
- Intent
- CND, coordinated-disclosure-pinned
- Surface
- Eviction by pre-empting the next weaponized variant