Zion Boggan
repos/Cyclops V2
zionboggan.com ↗

Cyclops V2

A ground-up rebuild. v1 was a code-*reader* that pattern-matched known bug shapes, drifted to low-severity IDOR/BAC/SSRF, never proved RCE, and only ever found sibling-CVEs. v2 is built on one law: only an execution artifact may declare a finding - an ASan crash, a popped shel...

4 commits First commit Jul 3, 2026 Last commit Jul 6, 2026 (1 month ago)
Markdown 45.8%Python 23.7%YAML 20.1%Shell 10.3%
Files 50 entries
README.md

Cyclops v2 - execution-grounded vulnerability research

A ground-up rebuild. v1 was a code-reader that pattern-matched known bug shapes, drifted to low-severity IDOR/BAC/SSRF, never proved RCE, and only ever found sibling-CVEs. v2 is built on one law: only an execution artifact may declare a finding - an ASan crash, a popped shell, a retrieved secret. Never an LLM's opinion.

The three pillars

Pillar What Where Fixes
1 - Memory KuzuDB graph (targets→hypotheses→proofs→findings + cleared-axes) + Chroma (semantic recall) + Redis (queue/cache) + Obsidian vault/ memory/, vault/ drift, tunnel-vision, re-screening
2 - Brain Semgrep fast-pass → Joern CPG dataflow (reachable source→sink) → CodeQL deep brain/ sibling-CVE-only; finds novel unexplored sinks
3 - Oracle libFuzzer/AFL++ + ASan/UBSan → crash triage (GEF) → Docker/CT detonation oracle/ never proved RCE; the only thing that creates a finding

The severity gate (vault/00-doctrine/SEVERITY-GATE.md) is a refusal engine: 8 P1 impact families, each with its exact oracle and its v1 overclaim traps ("injection reachable" ≠ "ATO completes"; "read DoS" ≠ "RCE"). Anything below the gate goes to the cleared-axes log, never to a finding. Enforced in code: memory.promote_to_finding() raises unless a non-DISPROVEN Proof exists.

Where it runs

Everything runs on the forge box (CT 236, REDACTED-IP) - it holds the heavy tools (Joern, CodeQL, AFL++, clang/ASan, Ghidra, KLEE, SymCC) and the venv (/opt/cyclops-venv). Redis + KuzuDB are forge-local (Redis bound to localhost - never LAN, that's a gate family). The repo + human-readable vault/ live on CT 215 (/shared/projects/cyclops-v2, Samba-readable so Zion opens the vault in Obsidian). Sync: rsync -az cyclops-v2/ root@REDACTED-IP:/opt/cyclops-v2/.

Operate

# on forge (CYCLOPS_HOME=/opt/cyclops-v2, PY=/opt/cyclops-venv/bin/python)
$PY orchestrator/seed_graph.py            # seed archetypes + sink classes + gate
$PY orchestrator/feed.py 21               # poll fresh releases (<=21d) -> targets queue
$PY orchestrator/orchestrator.py drain-targets   # brain pass on each fresh target
$PY orchestrator/orchestrator.py drain-oracle     # route hypotheses to proof
$PY orchestrator/orchestrator.py status   # graph + queues + GATED findings

Configuration is via environment variables, each with an in-code default: copy .env.example to .env and set only the values that differ from your box.

The loop: feed → brain (hypotheses) → oracle (proof) → gate (finding) → vault. Novelty by construction: hunt days-old code (feed.py), CPG finds unexplored source→sink paths, sibling-CVE gate runs before deep work.

Validated

orchestrator/e2e_proof.sh runs the whole chain on real cJSON source (brain CPG → oracle fuzz → ASan crash → triage → gated finding). memory/selftest.py proves the gate refuses findings without proof and honors DISPROVEN (9/9 pass).

Tooling reality (honest)

  • Present + verified: Joern (CPG dataflow proven), CodeQL 2.25.1, Semgrep 1.166, AFL++ 4.0, clang-14 + libFuzzer/ASan/UBSan (compile proven), GEF, Ghidra, KLEE, SymCC, Docker 29, KuzuDB 0.11, Chroma 1.5, Redis 8.
  • rr unavailable: this is an unprivileged LXC (perf_event_paranoid=4, no HW perf counters). Crash→exploit triage uses GEF + the ASan report instead.
  • Firecracker/microVM unavailable: no /dev/kvm in the LXC. Detonation uses Docker on forge + the isolated detonation CT (302) for risky targets.