The pool reads AttackRegistry state through state-touching calls such as stake(), withdraw(), claim*(), pokeRiskWindow(), and flagOutcome(). It only sets riskWindowStart when _observePoolState() happens to see an active-risk state.
If the registry enters and exits an active-risk state entirely between two pool interactions, riskWindowStart remains 0 even though stakers were actually exposed during that window. At resolution, _bonusShare() interprets riskWindowStart == 0 as if no risk ever occurred, so stakers receive no bonus. Because the bonus is never reserved for them, sweepUnclaimedBonus() can transfer the full bonus pot to recoveryAddress.
Stakers can lose their full time-weighted bonus despite remaining exposed during a real active-risk interval. Principal is not affected, and the swept funds go to the protocol-controlled recoveryAddress, not an attacker.
This requires the active-risk interval to begin and end without any pool interaction observing it, and also requires nobody to call the permissionless pokeRiskWindow() during that time. Because the harm is limited to bonus loss and is preventable with a single poke, the impact is bounded.
Stakers can lose their full time-weighted bonus for a pool cycle despite remaining exposed during an actual active-risk interval. The loss is bonus-only, not principal loss, and the swept funds go to the protocol-controlled recoveryAddress rather than to an attacker. Because any participant can prevent the condition by calling pokeRiskWindow() once during the window, the harm is bounded and best classified as Low severity.
Place this file at test/audit/ConfidencePoolUnobservedRiskBonusSweep.t.sol and run:
Do not rely exclusively on local observation to decide bonus eligibility. If possible, bonus entitlement should depend on whether active risk actually occurred on the registry, not only on whether the pool observed it live.
If historical registry state cannot be queried, the minimum mitigation is to operationally require at least one pokeRiskWindow() call during every active-risk interval and document that assumption clearly.
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.