There is no check that proxy address passed to distributeByOwner function corresponds to organizer, contestId, and implementation. If the ProxyFactory contract has at least one expired contest the owner can use organizer, contestId, and implementation from it to pass expiration check at the same time providing proxy address of the current contest to execute distribution immediately.
The test below illustrates how the owner can successfully call distributeByOwner before the contest expiration.
The owner can distribute stuck funds before the contest expiration.
Manual Review
Derive proxy using getProxyAddress function instead of passing it through arguments.
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.