As per the natspec comments for the distributeByOwner function, the owner should only be able to call functions on the Proxy when block.timestamp >= saltToCloseTime[salt] + EXPIRATION_TIME, however this check is never actually enforced. Instead, there is a proxy address input, which allows the owner to arbitrarily call any function on any address.
Consider the implementation for distributeByOwner:
Although they check the saltToCloseTime[salt] for the salt created from the inputted organizer, contestId, and implementation, this has no relation to the proxy address which the owner is actually calling. For example, this means they can circumvent the EXPIRATION_TIME check.
Owner can arbitrarily call functions for any contract, not just contests, and can also circumvent time checks which are meant to be enforced.
Manual review
Rather than have proxy as an input to this function, proxy should be calculated using the getProxyAddress function.
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.