The Governance contract vulnerability in its quorum calculation mechanism. The issue lies in the interaction between vote counting and proposal state transitions, allowing proposals to pass without meeting the required quorum thresholds. The quorum verification lacks proper validation of total voting power against minimum thresholds. Governance.sol#_isProposalSuccessful
The function calculates proposal success based on current voting power snapshots, making it vulnerable to timing attacks. The issue lies in using instantaneous quorum requirements rather than time-weighted averages, which could be exploited during periods of low voting power participation.
The RAAC Protocol's governance system faces a critical weakness in how it handles proposal voting power. Imagine a bank vault that requires 10 security guards to open, but sometimes counts each guard twice, that's effectively what's happening here with the voting power calculation.
In the Governance.sol contract, the quorum calculation interacts with three key components:
The veRAACToken
voting power
The time-weighted average tracking
The proposal state transitions
Here's how an attacker could exploit this:
An opportunistic actor monitors the protocol's veRAACToken
total voting power. When it dips below normal levels (perhaps during a major market event), they submit a proposal. The Governance contract's quorum calculation uses the current voting power snapshot rather than a time-weighted average, allowing the proposal to pass with artificially low participation.
Looking at the code:
The impact extends beyond simple governance, this could affect:
Protocol parameter updates through GaugeController
Fee distribution configurations in FeeCollector
Treasury fund allocations
Passing proposals with artificially low quorum requirements
Undermining governance security during low participation periods
Potential manipulation of protocol parameters
Implement time-weighted average voting power calculations and minimum quorum thresholds:
We uses the TimeWeightedAverage
library already present in the protocol
Follows the same pattern as GaugeController's weight calculations
Additional constants to define:
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.