Normally, when an agreement breaches, the registry transitions to CORRUPTED, and the moderator slashes stakes via flagOutcome(CORRUPTED).
However, if the registry reaches CORRUPTED without a prior UNDER_ATTACK observation (riskWindowStart == 0), claimExpired() fails to auto-slash. An attacker can wait until expiry and front-run the moderator with claimExpired(). This resolves the pool to EXPIRED (returning principal to attackers) and permanently locks out the moderator.
Likelihood:
The registry state can transition to CORRUPTED rapidly without an intermediate pokeRiskWindow() call.
MEV bots actively monitor the mempool and will easily front-run the moderator to prevent their stake from being slashed.
Impact:
The protocol completely loses its insurance protection. Capital is returned to the attackers instead of being slashed to the recovery address.
The vulnerability exists because the auto-slash fallback logic requires riskWindowStart to be non-zero. If it is zero, the logic incorrectly falls through to the EXPIRED state, allowing the attacker to bypass the slash.
To fix this, remove the riskWindowStart != 0 condition. The mechanical resolution should prioritize the terminal CORRUPTED state to ensure the pool is correctly slashed, regardless of whether a risk window was previously observed.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
View preliminary resultsAppeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.