The increase(0)
function call allows users to maintain constant voting power by creating new checkpoints that bypass the intended linear decay of voting power over time.
The vulnerability exist in the increase
function in the veRAACToken
contract that doesn't check for Zero amount
as follow :
Each checkpoint stores:
Block number when created and Compressed power value at that block, so can The voting power queries use these checkpoints:
we can show this with a simple attack path :
User has existing lock with voting power.
Calls increase(0) multiple times.
Each call creates new checkpoint at current block.
Same voting power recorded at different blocks.
as we can see in the writeCheckpoint
function in Checkpoints
contract :
This shows that:
When in same block, it applies an operation (op) between last value and new value
When in new block, it directly compresses and stores the new value therefor the vote Power value doesn't decay as intended and Continues until lock expiry.
[the likelihood is high so does the impact.]
The voting power influence got extended with the same initial power effectively maintaining the exact same initial power sustained until the lock period ends.
Implement a strict amount validation.
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.