The LevelOne
the contract is upgradeable via UUPS and inherits from Initializable
, but fails to call _disableInitializers()
in the implementation contract’s constructor. This oversight allows anyone to call initialize()
on the implementation contract directly, enabling unauthorized reinitialization and potential takeover of critical roles like principal
.
If deployed behind a proxy, the logic (implementation) contract remains unprotected.
An attacker can:
Call initialize()
on the implementation contract directly.
Set themselves as the principal
.
Call privileged functions like graduateAndUpgrade()
and transfer funds.
This can lead to a full takeover and loss of all user funds.
Aderyn
Add the following constructor to the LevelOne
contract to prevent reinitialization:
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.