The LevelOne and LevelTwo contracts is designed to be used with the UUPS (Universal Upgradeable Proxy Standard) pattern, but it lacks a constructor that calls _disableInitializers(). This is a critical security measure for upgradeable contracts that prevents the implementation contract from being initialized directly.
Attacker identifies that the implementation contract for LevelOne doesn't have a constructor with _disableInitializers()
Attacker directly calls the initialize(address _principal, uint256 _schoolFees, address _usdcAddress) function on the implementation contract (not the proxy)
Attacker sets themselves as the principal parameter
The implementation contract is now initialized with the attacker as the principal
Attacker can gain principal privileges on the implementation contract
Add a constructor to the LevelOne contract and LevelTwo contract that disables initializers:
The system can be re-initialized by an attacker and its integrity tampered with due to lack of `disableInitializer()`
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.