The governance system allows proposals to bypass the mandatory timelock delay, enabling immediate execution of sensitive protocol changes. This breaks a core security assumption of the protocol's governance mechanism. Governance.sol#execute
The function fails to verify that sufficient time has passed since proposal queueing, allowing premature execution.
The vulnerability stems from these gaps working together, the Governance contract assumes TimelockController handles all delay validation, while TimelockController's checks are insufficient. This creates a timing vulnerability where proposals can execute before their mandatory delay period expires. TimelockController.sol#executeBatch
The contract assumes the TimelockController handles all delay validation, but lacks synchronization between the two contracts' timing requirements, and this creates a race condition where proposals can execute before their mandatory delay period.
The Broken Timelock Imagine a bank vault with a time-delayed lock except this lock can be opened immediately. The RAAC protocol's governance system has exactly this flaw. The TimelockController
, designed to enforce a mandatory waiting period before executing sensitive protocol changes, can be circumvented through a subtle timing mismatch.
How The Vulnerability Works When a proposal passes voting in the Governance contract, it should enter a mandatory waiting period managed by the TimelockController
. This delay gives the community time to react to potentially malicious proposals. However, the Governance contract's execute()
function fails to properly synchronize with the timelock's delay requirements.
The consequences are severe for the protocol's security. A malicious actor could:
Propose changes to drain the Treasury's funds
Queue the proposal in the timelock
Execute it immediately, before anyone can respond
This bypasses the protocol's 2-day mandatory delay period, turning carefully planned governance into a race to execution.
Adding delay verification restores the intended security model
Maintains the existing state machine logic
Adds explicit delay verification using the timelock's ID
Checks both operation status and delay period
Integrates with the existing TimelockController interface
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.