Root cause: claimCorrupted has no access control and, for bad-faith CORRUPTED, skips the bounty gate; it sweeps the whole pool to recoveryAddress and sets claimsStarted = true the instant a bad-faith CORRUPTED is flagged.
Impact: any unprivileged caller (or the profit-motivated recoveryAddress sponsor) can front-run the moderator's documented correction, permanently locking the wrong outcome and diverting stakers' principal to recoveryAddress.
Normal behavior: flagOutcome may re-flag (correct) an outcome while claimsStarted == false (DESIGN.md §4). §4 justifies the "first claim closes the window" latch with "a staker claiming first is exercising a correct outcome."
The issue: claimCorrupted is permissionless (nonReentrant only) and for bad-faith skips the MustClaimBountyFirst gate. It sweeps the full balance to recoveryAddress and latches claimsStarted. §4's justification does not hold here — the caller holds no stake, gains nothing directly, and moves other people's principal to a third party while destroying an in-progress legitimate correction (to SURVIVED, which would refund stakers, or to good-faith CORRUPTED, which would pay a whitehat).
Likelihood:
The moderator flags bad-faith CORRUPTED and then intends to correct it — to SURVIVED for an out-of-scope breach (refunding stakers), or to good-faith CORRUPTED to name a whitehat.
An unprivileged actor — or the recoveryAddress sponsor, who profits from the sweep — front-runs that correction transaction with claimCorrupted the moment the bad-faith flag lands, on an L2 mempool.
Impact:
When the intended correction was SURVIVED, all stakers lose their entire principal to recoveryAddress instead of being refunded.
The moderator's documented corrective authority is permanently neutralized by an arbitrary caller.
Full test in test/unit/ConfidencePool.claimCorruptedGrief.t.sol (2 tests pass; forge test --match-contract ClaimCorruptedGrief -vv):
Give the moderator a bounded correction window before a permissionless bad-faith sweep can foreclose it, anchored to the flag block (NOT outcomeFlaggedAt, which is riskWindowEnd and can predate the flag):
Alternative: restrict the bad-faith claimCorrupted trigger to the moderator or recoveryAddress during the grace, keeping it permissionless afterward so a stuck pool stays recoverable.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.