Normal behavior: withdrawAllFailedCredits() allows users to withdraw funds that failed to be transferred directly. Users can call this to retrieve their credit manually.
The problem: There is a critical logical flaw where it mixes two different addresses inconsistently. The function reads credits from the parameter _receiver. It clears credits from msg.sender (the caller). It then sends ETH to msg.sender (the caller). This creates a disconnect between whose creidts are being read vs. whose credits are being cleared. This essentially allows for UNLIMITED THEFT of any user's failed transfer credits.
Likelihood:
Any user with failed credits becomes a victim
Failed credits occur naturally when bid refunds fail to reverting contracts
The attacker can force failed credits by bidding from reverting contracts
Impact:
Critical because it leads to complete theft of all failed credit balances
Infinite drainage, and it affects all users.
Also no access control and the function is external. Anybody can call it with any address as the parameter and steal credit.
This is not a theoretical bug but has real impact.
withdrawAllFailedCredits allows any user to withdraw another account’s failed transfer credits due to improper use of msg.sender instead of _receiver for balance reset and transfer.
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.