The contract's initialization process is vulnerable to a front-running attack where anyone can initialize the proxy contract and take control of the system by becoming the principal.
=> The initialize function is public and only protected by OpenZeppelin's initializer modifier
=> The initializer modifier only prevents re-initialization, not unauthorized initialization
Real-World Attack Scenario:
Deployer submits transaction to deploy proxy and implementation
Before the initialization transaction is mined
Attacker front-runs with their own initialization transaction
Attacker becomes principal and can:
Control teacher appointments
Set arbitrary school fees
Control student expulsions
Control the upgrade process
Anyone can initialize the proxy contract if they are the first to call initialize
An attacker can front-run the deployment transaction and take control of the contract
This would allow the attacker to become the principal and control all school operations
manual review
instead of the current implementation
use atomic deployment
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.