Build1 distinct publisher3 min readPublished
One scanner, two pre-exploit Solana codebases, one hit and one miss. The miss is the half that tells you which vulnerability classes static analysis can actually reach.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The two bugs differ in where their evidence lives, and that difference is the whole result.
Wormhole's defect fits inside one struct field and two call sites. The account is declared untyped as `Info<'b>`, its data is parsed as the instructions sysvar by `load_current_index` and `load_instruction_at`, those are the only places the sysvar appears in the program, and there is no comparison against `sysvar::instructions::id()` [4]. Every fact a checker needs is local and decidable: a canonical address exists in the standard library, the code parses an account as if it were that address, the comparison is absent. The scanner reported it as the second of five findings, and the fix it proposed (typed `Sysvar<Instructions>` or an explicit key comparison) is the fix that shipped [3][5].
Cashio's defect is the absence of a root. `BrrrCommon::validate()` and `SaberSwapAccounts::validate()` run nine `assert_keys_eq!` checks, and every one of them compares two caller-supplied accounts to each other [8]. The checks are present and internally consistent, which is why an attacker who supplies the entire chain satisfies all nine [9]. Nine relative comparisons, zero anchored [3]. To call that wrong, a tool needs to know which account in the graph is supposed to be canonical, and the file does not say.
Except that the repository does say, once. `print_cash` compares `issue_authority` against a hardcoded `ISSUE_AUTHORITY_ADDRESS`, and that discipline was never applied to the bank and collateral chain [10]. The distinguishing property is therefore present in the same program: one validation path roots itself in a constant, the exploited path roots itself in nothing. A checker that compared anchoring discipline between paths of a single program would have had something to report. This one did not. It returned three findings, and the nearest was a Medium on `new_bank` being callable by anyone [11].
That Medium is the part worth arguing about. Permissionless `new_bank` is a real precondition of the attack [11]. The scanner then framed the risk as front-running the deployer to squat the canonical bank and closed with the line "If multiple banks are intentionally permissionless, document it and ignore this finding" [12]. Per the writeup, the attacker never front-ran anyone [13]. So the output was a true finding bolted to the wrong threat model, shipped with the exact sentence a maintainer would paste into the ticket while closing it.
Scorekeeping on the Wormhole half is more flattering but not clean. One of the five findings was the defect that cost $325M [2][1]. Three of the five carried severities that survived hand verification, and two were wrong in opposite directions [7][2]: a Critical on permissionless `initialize` that requires uninitialized bridge accounts on a bridge live since 2021 [6], and a Medium on fee front-running whose own source comment says the behaviour is deliberate [14]. The overrated Medium is the more instructive error. The tool read the code and not the comment sitting next to it.
The caveat the authors lead with belongs near the end too: these runs happened in 2026, on code whose outcome has been public for four years, both programs patched long ago [15]. It is a re-run against history, not a claim about February 2022.
Ranked by verification strength, evidence, and original report placement.
The Wormhole scan reported five findings; the second was that instruction_acc is a raw Info account never checked against solana_program::sysvar::instructions::id(), while its data is parsed as the serialized instructions sysvar, so an attacker can supply a fake account with crafted bytes resembling a previous secp256k1 instruction. The writeup states this is the bug that cost $325M.
The authors verified every finding by hand against the source; the actual shape of the Wormhole result was one true Critical, one real High, one real Low, and one severity error in each direction.
The authors took the on-chain source of two Solana protocols as it stood the day before each was exploited, ran it through their scanner with no hints and no knowledge of the expected answer, and published both results including the failure.
Forging the instructions sysvar means every guardian signature is treated as valid without any ECDSA verification happening, and the resulting VAA mints wrapped ETH out of nothing.
In the pre-patch Wormhole source the account is declared as 'pub instruction_acc: Info<'b>' with no type and no owner check; its data is parsed twice as the instructions sysvar via load_current_index and load_instruction_at; those two calls are the only places the sysvar appears in the entire program; and there is no comparison against sysvar::instructions::id().
The Critical finding on permissionless initialize does not apply: initialize has no constraint tying the caller to the deployer, but it requires the bridge accounts to be uninitialized and the bridge has been live since 2021, making it a deployment-window risk rather than a live one.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Detailed first-party code walkthrough, no independent replication
The technical substance is unusually checkable for a single-source post: the untyped instruction_acc declaration is quoted, the two sysvar parse sites are named, the nine Cashio assert_keys_eq! checks are counted, and each Wormhole finding is individually adjudicated including two self-declared severity errors and an outright miss. That raises evidence quality well above a typical vendor demo. It is capped by the absence of any corroborating source in the cluster: the scanner is unnamed and unversioned, no run artifacts or reproduction steps are published, and the external anchors (the $325M loss, the patch that shipped, the attacker's actual transaction path) are asserted without citation.
No adoption signal in supplied sources
The cluster contains no release, deployment, customer, download, pricing, or licensing information for the scanner, and no third party is reported to have run it. The two recorded observations are the authors' own retrospective benchmark runs on long-patched historical code, which measure a demo, not uptake; inferring adoption from them would be guessing.
Mildly overstated, heavily self-corrected
The headline promises a hit and delivers one, and the body actively deflates itself: it discloses a miss, two severity errors, an over-rated Medium flagged against a documented intentional design, and an explicit refusal to claim the scan would have prevented either incident. That self-correction keeps the gap small. What remains is structural: a 20 percent decisive-detection figure derived from one run on one of history's best-known Solana bugs, published by the tool's own authors on a codebase whose answer has been public for four years, is easy for readers to generalise into a capability claim the evidence cannot carry.
Vendor publishing its own tool's benchmark
The article is authored and self-published on dev.to under the tool vendor's own handle, and it exists to demonstrate that vendor's scanner against two celebrated exploits, with the closing section promoting an addition to its reviewer rulebook. The subject codebases were chosen by the authors, the answers were already public, and the hand verification of the tool's findings was performed by the same party. Mitigating factors are real but partial: the miss, the two severity errors, and the no-counterfactual caveat all cut against the promotional interest.
Single first-party source, technically specific
Confidence is limited primarily by source structure: one publisher, one article, one interested party, and no corroboration for any externally verifiable element. It is lifted above a floor because the in-source code assertions are specific enough to be falsified by a reader against public pre-patch code, and because the authors disclose adverse results and bound their own claim. Anything depending on external facts - the shipped patch, the loss figure, the attacker's real path, any general detection rate - should be treated as unconfirmed within this cluster.
invest
A Solana DEX halted trading and says the loss stopped at its treasury. Nobody can check1 distinct publisher
invest
The card networks just picked the referee for agent checkout, and it looks like EMVCo2 distinct publishers
invest
Pump.fun's $12m week puts token issuance above every lending market in crypto1 distinct publisher
invest
Ondo's tokenized stock book passes $1B, and the collateral is the story1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 26, 2026