BuyerAgent._computePhase
function uses a weak Pseudo-Random Number Generator (PRNG) to calculate the roundTime
variable.roundTime = elapsedTime % cycleTime
uses the modulo operator to generate a random-like value, but this is not a secure way to generate randomness. The modulo operator can produce predictable and repeating patterns, which can be exploited by an attacker.In a blockchain context, it's essential to use a secure and unpredictable source of randomness to prevent attacks. A weak PRNG can lead to vulnerabilities such as:
Predictable outcomes: An attacker can predict the outcome of the random number generation, allowing them to manipulate the system.
Replay attacks: An attacker can replay a previous random number, allowing them to reuse a previous outcome.
**Attacker Contract: **
Exploitation Steps:
Deploy the WeakPRNG
contract and note its address.
Deploy the Attacker
contract, passing the address of the WeakPRNG
contract as a constructor argument.
Call the exploit()
function on the Attacker
contract.
The Attacker
contract will predict the roundTime
value using the weak PRNG.
The Attacker
contract will increment the elapsedTime
value to repeat the roundTime
value.
The Attacker
contract will verify that the predicted roundTime
value is correct.
The Attacker
contract can now use the predicted roundTime
value to manipulate the system.
Exploitation Example:
Suppose the WeakPRNG
contract is used to determine the winner of a lottery. The Attacker
contract can predict the roundTime
value and use it to manipulate the lottery outcome.
The WeakPRNG
contract generates a roundTime
value of 3.
The Attacker
contract predicts the roundTime
value and increments the elapsedTime
value to repeat the value.
The WeakPRNG
contract generates a new roundTime
value of 3.
The Attacker
contract uses the predicted roundTime
value to manipulate the lottery outcome, ensuring that they win the lottery.
This proof of concept demonstrates how an attacker can exploit the weak PRNG in the WeakPRNG
contract to predict and manipulate the roundTime
value.
Predictable outcomes: An attacker can predict the outcome of the random number generation, allowing them to manipulate the system.
Replay attacks: An attacker can replay a previous random number, allowing them to reuse a previous outcome.
Front-running: An attacker can use their knowledge of the predictable random number to front-run transactions, allowing them to gain an unfair advantage.
Chainlink VRF: Use a decentralized randomness beacon like Chainlink's Verifiable Random Function (VRF) to generate secure randomness.
uint256 roundTime = ChainlinkVRF.getRandomNumber();
RANDAO: Use a RANDAO (Random Number Distribution Algorithm) to generate secure randomness.
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.