In RToken::burn, the amount parameter is not properly validated against the user's balance. Instead of reverting when the amount exceeds the user's balance, it silently caps the amount to the user's balance:
This is exploited in LendingPool::withdraw which uses this amount parameter to ensure sufficient liquidity is available via _ensureLiquidity(). An attacker can pass a very large amount to force the protocol to withdraw all funds from the Curve vault, even though they will only receive their actual balance.
This allows any user with a small RToken balance to:
Force unnecessary withdrawals from the Curve vault by passing inflated amounts
Cause loss of yield for other users as funds are pulled from the yield-generating vault
The amount should be validated against the user's balance before attempting to ensure liquidity:
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.