Normal behavior: The pool separates powers on purpose — the factory makes the sponsor the pool owner and lets it choose the recovery address, while a distinct factory-configured outcomeModerator is the party trusted to decide survival or corruption — so the recovery beneficiary cannot also decide a sweep. After the grace window, the auto-CORRUPTED backstop lets anyone finalize bad-faith CORRUPTED off a terminal registry CORRUPTED reading.
Specific issue: In the pinned Safe Harbor integration the per-agreement attackModerator is initialized to the agreement owner, and the factory forces that same owner to be the pool sponsor and recovery beneficiary. So the sponsor mints a terminal CORRUPTED through markCorrupted (accepted on role and lifecycle state, with no proof of a real breach), waits out the grace, and lets any caller finalize bad-faith CORRUPTED — sending the whole third-party pool to its own recovery address, with the independent moderator never deciding the outcome and latched out of correcting it. The account that funds the sweep destination is the one that authors the state which fills it.
This is not the §11 "trusted registry reports false state" case (§11 names only the registry-level DAO moderator; the lever here is the agreement-level attackModerator the factory forces to be the sponsor), nor the §6 scope-blind fallback (§6 accepts a pessimistic default for a genuine corruption with an absent moderator; here the beneficiary manufactures the corruption).
Likelihood:
WHEN an agreement owner sponsors a pool and keeps the default per-agreement attackModerator role, and the DAO approves the agreement into active risk (a normal attackable operating mode after approval), a public pool interaction seals riskWindowStart.
WHEN the sponsor calls markCorrupted() on its own agreement with no breach and the independent pool moderator stays silent through the fixed 180-day grace, any caller finalizes bad-faith CORRUPTED and claimCorrupted() sweeps to the sponsor's recovery address.
Impact:
The entire unresolved pool balance — all third-party staker principal plus contributor bonus — is transferred to the sponsor-chosen recovery address on a corruption the sponsor fabricated, with the independent moderator structurally bypassed and latched out (claimsStarted). Pool size is uncapped.
The value flow is entirely sponsor-directed and the sponsor risks no capital: in the PoC the sponsor stakes nothing and the 200 tokens swept are 100% third-party. Victims cannot exit — withdraw is disabled after risk is observed, and a staker's claimExpired reverts throughout the grace window.
Full chain on the live BattleChain testnet: the real fixture agreement's owner is also its live attackModerator; that one account authors a real registry CORRUPTED, and the locally-deployed in-scope pool auto-sweeps the whole third-party balance to the sponsor recovery. Save as test/fork/SponsorAuthoredCorruptionAutoSweep.fork.t.sol and run with BATTLECHAIN_TESTNET_RPC=https://testnet.battlechain.com forge test --match-contract SponsorAuthoredCorruptionAutoSweepForkTest -vv.
Passing result: 200 tokens (third-party principal 150 + bonus 50) to the sponsor recovery; sponsor capital at risk 0; the moderator's post-finalization flagOutcome reverts OutcomeAlreadySet.
Severity note for the form: Impact is High (whole third-party pool); Likelihood is Low because the path needs DAO-approved active risk plus an absent moderator through the 180-day grace. Choose High impact / Low likelihood. If a judge keeps the sponsor-retained agreement attackModerator inside the adversarial model, this is a straightforward High.
For a genuine absent-moderator backstop, the authority that finalizes CORRUPTED after the grace must be disjoint from the agreement owner, the pool sponsor, and the recovery beneficiary (a factory/DAO- appointed settler, or a registry attestation the sponsor cannot produce). Do not restore a permissionless sweep keyed solely on getAgreementState(agreement) == CORRUPTED.
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.