Stratax is deployed as an upgradeable contract using the Beacon Proxy pattern. The proxy stores all user state and delegates calls to the implementation via delegatecall. Each proxy instance is initialized through initialize(), which sets the owner and protocol addresses.
The implementation contract has no constructor calling _disableInitializers(). As a result, initialize() remains callable directly on the implementation address by anyone. An attacker who calls it first becomes the owner of the implementation. Because initialize() uses the initializer modifier, the legitimate deployer cannot recover ownership — any subsequent call reverts permanently.
Likelihood:
Any on-chain observer monitors the mempool or block history for a newly deployed Stratax implementation and calls initialize() before or immediately after deployment — no special privileges are required.
The attack window remains open for the entire lifetime of the implementation until it is replaced, giving the attacker unlimited time to act.
Impact:
The attacker becomes the owner of the implementation and can call recoverTokens() to drain any ERC-20 tokens accidentally sent to the implementation address — a common user mistake in Beacon Proxy deployments where users confuse the proxy and implementation addresses.
Re-initialization by the deployer is permanently blocked by the initializer modifier, leaving the implementation compromised with no recovery path.
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.
The contest is complete and the rewards are being distributed.