The actual proxy contract that gets called in the distributeByOwner function does not get validated for expiration.
In the current implementation of the ProxyFactory::distributeByOwner function, the validation for whether the proxy is expired or not, is actually made on the salt, generated from the organizer, contestId and implementation function parameters. However, since the actual proxy address is a separate parameter, this check is pointless.
ProxyFactory::distributeByOwner can be called with any proxy address parameter, even if the proxy hasn't expired yet.
Manual review
To address this issue, you should derive the proxy address from the validated salt + the implementation parameter:
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.