Description:
The withdraw()
function is publicly accessible and transfers all USDC/USDT balances from the contract to the organizer
. There is no access control or role check restricting who can call this function.
// Root cause in the codebase with @> marks to highlight the relevant section
Likelihood:
This will happen as soon as any user calls the withdraw()
function, which is not restricted to the organizer
.
In a deployed environment, any on-chain scanner or MEV bot could instantly exploit it.
Impact:
All stablecoin balances (USDC/USDT) held by the contract can be drained by anyone.
Permanent and irreversible loss of funds, directly impacting the protocol's treasury and participants.
Critical financial vulnerability with likely real-world consequences.
Simulation using a script:
Also, enforce proper onlyOrganizer
modifier:
Add this modifier to all functions that affect treasury/fund movement.
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.