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.