A malicious user can repeatedly deposit and withdraw funds to exploit the RAAC rewards calculation mechanism, allowing them to accumulate an unfair share of the rewards and effectively drain the entire RAAC reward pool.
The issue arises due to the flawed calculation of RAAC rewards in calculateRaacRewards(). Specifically, a user's RAAC rewards are determined by their proportion of total deposits:
A user can exploit this mechanism by rapidly cycling deposits and withdrawals:
Deposit rToken into the pool, receiving deCRVUSD in return.
Withdraw a small amount of deposited rToken , so withdraw function transfer rewards for user.
Call withdraw again and again, withdraw function would calculate and transfer reward every time it's being called.
Since rewards are distributed based on deposit share at the time of calculation, a user who repeatedly deposits and withdraws can repeatedly claim rewards, stealing all rewards from the contract.
RAAC rewards can be drained by a single user with minimal initial capital.
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.