Historical-Incident Corpus Backlog
Generator: This is a hand-maintained backlog for replay_incidents.py.
Pair with: documents/audits/methodology/spectre-historical-incident-replay-2026-05-15.md
What this is
documents/incidents/*.yml catalogues 44 Solana exploits with an
architectural_fingerprint: the SPECTRE rule IDs that should fire on the
pre-hack source if our rule pack covers the class. The replay benchmark
(runner/replay_incidents.py) reads each incident's mapped pre-hack
corpus snapshot, scans it, and scores how many fingerprint rules
SPECTRE actually emits.
As of the 2026-05-15 commit 114677a4, 23 of 44 incidents are mapped
to a corpus snapshot. The remaining 21 (some are duplicate perspectives
on the same hack across the three incident-YAML files; counting distinct
protocols the gap is ~13) need a pre-hack source snapshot added to
benches/solana/corpus/ before they appear in the replay.
Update 2026-05-15 (post-extractor + Cypher backfill): Five backlog items investigated this session. Findings recorded under "Resolved backlog" below; two of the three Cypher incidents now map to a sibling program snapshot. Mapped count is 28 of 44; exact-rule detection 19 of 28 (68%); class-level detection 26 of 28 (93%).
Update 2026-05-16 (post-ITER-001 ship): Added the precise detector
for the April-2022 Jet Protocol $25M whitehat class (if X == Pubkey::default() { break; } in a sparse-array loop). JET-PROTOCOL-BREAK-2022
flips from ✗ (no detection) to ✓ (exact-rule ITER-001). Exact-rule
detection rises to 20 of 28 (71%); class-level rises to
27 of 28 (96%). The only remaining ✗ is UXD-MANGO-CROSS-2022-10,
which needs a separate CROSS-DELEGATE-RISK rule shape (CROSS-001's
strict-trust-downgrade semantics architecturally don't fit UXD's
delegation-of-economic-backing pattern).
Update 2026-05-17 (replay completion): Subsequent commits in the
session shipped CROSS-007 (UXD delegate-risk), ACC-014 (Wormhole
sysvar), AUTH-100 body-level extension (Raydium UpdateConfig), ACC-021
init-write exception (Metaplex CMv1), ACC-015 (Cashio untied typed
account), plus a replay-script duplicate-id merge fix. Replay
benchmark reaches 24/24 exact-rule (100%) and 24/24 class-level
(100%) on the post-merge incident set. Mapped count drops from 28
to 24 because 5 duplicate-id rows across *.yml files collapse. Every
mapped Solana exploit incident now fires at least one rule from its
architectural fingerprint. See
spectre-exact-rule-gap-analysis-2026-05-16.md for the per-incident
trajectory.
This document is the structured worklist for closing that gap.
Workflow per incident
For each unmapped incident:
- Locate the protocol's public github repo. URLs below are starting
points; verify each by
git ls-remote --heads <url>before assuming. - Find a pre-hack sha. Workflow:
git clone --filter=blob:none --no-checkout --depth=500 <url> probe cd probe git fetch --depth=2000 origin <default-branch> # find commits before the incident date: git log --format='%cs %H %s' origin/<default-branch> -- <subpath?> \ | awk '$1 < "<incident-date>"' | head -10 # pick a commit that represents stable pre-disclosure state and capture # the full sha. - Write a manifest at
crates/pinpoint-rules-solana/benches/solana/corpus/<incident-id>.yamlfollowing the schema in01-wormhole-token-bridge-pre-hack.yaml. Include:source.git.url+source.git.sha(40-char lowercase hex)source.git.subpathif only one program subtree is relevantground_truthwith the rule_ids from the incident'sarchitectural_fingerprintreferenceslinking the disclosure or audit URL
- Register the mapping in
runner/replay_incidents.py'sKNOWN_MAPPINGSdict ("<Protocol Name>": "<incident-id>"). - Materialize + scan:
bash crates/pinpoint-rules-solana/benches/solana/runner/materialize.sh # then scan the new entry through the runner or directly: pinpoint spectre scan corpus-cache/<incident-id> \ --languages rust --profile all --output json \ --out runner/results/<incident-id>.json - Re-run the replay to confirm class-level detection lands:
python3 runner/replay_incidents.py \ --report documents/audits/methodology/spectre-historical-incident-replay-2026-05-15.md
Unmapped incidents
Grouped by protocol. Multiple incident IDs may map to the same protocol (separate perspectives on the same hack); usually one corpus snapshot covers all of them.
Native (non-Anchor) — currently un-replayable
These protocols expose architectural-fingerprint classes the rule pack
gates behind Anchor detection. Closing them requires both a corpus
snapshot AND extending ORC-002 / GOV-001 / GOV-002 / similar rules to
match native-Solana entry-point shapes. Tracked in
spectre-vs-audit-firms-gap-analysis-2026-05.md as a P2.
| Protocol | Incident IDs | Repo (probe needed) |
|---|---|---|
| SPL Token Lending | SPL-TOKEN-LENDING-ROUNDING-2021-12 |
https://github.com/solana-labs/solana-program-library subpath token-lending (pre-Dec-2021 sha; see notes below) |
| Drift Protocol v1 | DRIFT-V1-PNL-2022-05 |
Was drift-labs/protocol-v1; archived. Check drift-labs org for mirror. |
The SPL Token Lending rounding finding (Neodyme disclosure, Dec 2021) is public Rust source. The disclosure-fix commit is documented in the solana-program-library history; finding the immediately-prior sha requires fetching deep history (depth 2000 only reaches 2023-08; closer to 2021-12 needs depth ~5000+).
Anchor / mixed — addable now
These have public repos. Each row's repo URL is the starting probe target.
| Protocol | Incident IDs | Pre-hack target date | Repo |
|---|---|---|---|
| Crema Finance | CREMA-FAKE-TICK-2022-07, CREMA-FLASH-LOAN-2022-07 |
2022-07 | Crema repos are difficult to locate (the program was archived after the exploit). Check Crema-Finance org on GitHub; the CLMM source may have been mirrored elsewhere. |
| Nirvana Finance | NIRVANA-FLASHLOAN-PRICE-2022-07, NIRVANA-FLASH-LOAN-2022-07, NIRVANA-FLASHLOAN-2022-07 |
2022-07 | Project abandoned; source may be lost. Worth a nirvana-finance org search. Otherwise mark "no public source — fingerprint stays unverified." |
| OptiFi | OPTIFI-PROGRAM-CLOSE-2022-08 (×2) |
2022-08 | optifi-exchange or OptiFi-Markets org. The accidental-close was an operational error, not a code bug, so even a post-mortem snapshot is informative. |
| Magic Eden | MAGIC-EDEN-UNVERIFIED-CREATOR-2023-01 |
2023-01 | Closed source. Mark "cannot replay; non-public." |
| Metaplex Candy Machine v2 | METAPLEX-CMV2-REINIT-2021-12 |
2021-12 | https://github.com/metaplex-foundation/metaplex-program-library — the v2 codebase was added on top of the v1 import; investigate sha around Dec 2021 in subpaths candy-machine-v2 or earlier. |
| Cypher Protocol | CYPHER-CACHE-INCONSISTENCY-2023-08, CYPHER-SUBACCOUNT-MARGIN-2023-08, CYPHER-SUBACCOUNT-2023-08 |
2023-08 | chugach-foundation org (the Cypher team). Repos were archived after the hack; some are still browseable. |
| Allbridge Core | ALLBRIDGE-CORE-PRICE-2023-04 |
2023-04 | https://github.com/allbridge-io (probe). |
| Slope Wallet | SLOPE-SEED-LEAK-2022-08 |
2022-08 | NOT REPLAYABLE — the bug was in the wallet's mobile client (private keys leaked to Sentry logs), not in any on-chain program. SPECTRE's scope is on-chain; this incident is out of scope. |
| Pump.fun | PUMPFUN-WITHDRAW-AUTHORITY-2024-05 |
2024-05 | Proprietary. Public reverse-engineered IDLs exist but the canonical pre-hack source is not public. |
| Loopscale | LOOPSCALE-RATEX-PRICE-2025-04, LOOPSCALE-RATEX-2025-04 |
2025-04 | https://github.com/Loopscale-app (probe) — recent incident, source may still be browseable. |
| Step Finance | STEP-FINANCE-EXEC-DEVICE-2026-01 |
2026-01 | https://github.com/step-finance (probe) — operational compromise (executive's device), not a code bug. May still be replayable for the AUTH-100 / AUTH-110 family. |
| UXD-Mango (additional perspectives) | covered by uxd-mango-cross-2022-10 |
n/a | Already mapped. |
| Tulip Protocol | TULIP-MANGO-CROSS-2022-10 |
2022-10 | sol-farm or tulip-protocol org. Same architectural class as UXD (CROSS-001 into Mango v3). |
Priority ordering
If executing the backlog in priority order:
- Metaplex Candy Machine v2 — same repo as v1, just a different sha; easy add.
- Allbridge Core — public org, recent incident (2023), Anchor-style.
- Cypher Protocol — three incident IDs collapse to one snapshot; high leverage.
- Tulip — same architectural class as already-mapped UXD/Mango.
- Loopscale — recent, fresh disclosure detail.
- OptiFi — operational-error class; useful for AUTH-* coverage.
- Drift v1 — pre-perp-DEX-class coverage; needs repo location confirmation.
- SPL Token Lending — needs native-rule lift first; defer.
- Skip Slope (wallet, out of scope), Magic Eden (closed source), Nirvana (likely lost), Pump.fun (proprietary).
Closing the top 6 takes the corpus from 23/44 mapped to roughly 31/44 and is achievable in one focused session per protocol (~30 min each).
Why class-level detection is the right metric
When a fingerprint asks for ACC-010 and SPECTRE emits ACC-011, the
architectural CLASS is caught — both rules target account-binding bugs;
the difference is which precision dial fires. The replay benchmark
reports both exact-rule and class-level numbers honestly. For the
backlog, the goal is class-level detection — ACC-013, ACC-010,
CONFIG-010, CPI-003 are reasonable proxies for the "binding/admin
gap caught architecturally" story regardless of which specific rule
matches.
Exact-rule reconciliation is downstream precision work, not a corpus gap.
Resolved backlog (2026-05-15)
| Protocol | Determination | Detail |
|---|---|---|
| Cypher Protocol | MAPPED as cypher-protocol-cache-2023-08 |
chugach-foundation/cypher-vaults-v3 sha 258b54e1 (2023-03-21). Sibling vault program (consumes the same MasterAccount type as the v3 risk engine). The exploited risk-engine program CYPH3o83... was never open-sourced. Class-level claim only, by analogy with 25-drift-v2-architectural-reference. ACC-012 fires exact-rule on all three Cypher incident IDs. |
| Allbridge Core | OUT OF SCOPE | The 2023-04-02 exploit transaction occurred on the BNB Chain pool, not on Solana. SPECTRE's scope is on-chain Solana programs. The fingerprint cites ORC-002 + CROSS-001 against the Allbridge-Solana program BrdgN2RP..., but the exploited swap-pool curve does not live in the Solana program. No truthful Solana mapping. |
| OptiFi | NO PUBLIC SOURCE | No OptiFi GitHub org exists publicly (probed optifi-exchange, OptiFi-Markets, optifi-finance, optifi-org, optifi-network). Source was never published; the architectural fingerprint (AUTH-110/120, GOV-002, CONFIG-010, CLOSE-070) is for a single-key upgrade-authority pattern that, even if confirmed, is not directly testable without the source. |
| Tulip Protocol | NO PUBLIC SOURCE | sol-farm GitHub org has 0 public repositories (source went private). The fingerprint (CROSS-001) targets a yield-aggregator vault depositing into Mango v3 with no per-venue exposure cap — class is detectable but the source is unavailable. |
| Loopscale | NO PUBLIC SOURCE | Loopscale/loopscale on github is a different .NET / web project, not the Solana lending protocol that was exploited in April 2025. No Loopscale-app / loopscale-labs org exists. The architectural fingerprint (ORC-002 + INV-003) is replayable in principle but no public Solana source. |
The Cypher mapping uses the architectural-reference precedent set by Drift v2. Allbridge is reclassified out-of-scope (BNB Chain). OptiFi, Tulip, and Loopscale are paused as "no public Solana source." If pre-hack source surfaces later (e.g. through a security disclosure repo or a leaked archive), they can be added via the standard workflow above.
Where this doc lives
- Path:
documents/audits/methodology/incident-corpus-backlog-2026-05-15.md - Pair with:
spectre-historical-incident-replay-2026-05-15.md - Update when: new incidents land in
documents/incidents/, OR a backlog entry is closed by a corpus snapshot, OR a new "cannot replay" determination is reached.