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.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.