The RankedChoice.sol
contract contains a vulnerability that can lead to a Denial of Service (DoS) attack. This issue arises from the inefficient handling of claimants in the selectPresident
function, where iterating over a large number of voters can cause the transaction to run out of gas, thereby preventing the contract from executing as intended.
Affected code - https://github.com/Cyfrin/2024-09-president-elector/blob/fccb8e2b6a32404b4664fa001faa334f258b4947/src/RankedChoice.sol#L60C5-L93C6
The vulnerability is located in the selectPresident
function , specifically at the loop iterating over the voters array:
The selectPresident
function is designed to select the president according the candidates’ rank. However, if the number of voters is extremly large, the loop iterating over the voters array can consume a significant amount of gas. This can lead to a situation where the transaction exceeds the gas limit and fails, effectively making it impossible to close the pot and distribute the rewards.
initiates a big RankedChoice with a lot of voters
every voter rank the candidates
when someone call the selectPresident that will be very costly
The primary impact of this vulnerability is a Denial of Service (DoS) attack vector.
Manual Review and Forge Tests
Size Control:Limit the size of the voter list during contract deployment.
Gas Optimization: Optimize the loop to reduce gas consumption by using a local variable to itterate over, like in the following example:
Batch Processing: Implement batch processing for distributing rewards. This will redesign the protocol functionallity but instead of processing all claimants in a single transaction, allow the function to process a subset of claimants per transaction. This can be achieved by introducing pagination or limiting the number of claimants processed in one call.
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.