Normal behavior: The marketplace accepts bids and, when a new higher bid arrives, refunds the previous highest bidder so only the current highest bidder holds locked funds. Refunds are attempted immediately in the bidding transaction and — on failure — the contract credits the recipient so they can later withdraw.
Issue: The contract attempts to push the refund to the previous bidder inside placeBid using a low-level call that forwards essentially all gas. A malicious previous bidder can make their receive() / fallback consume large amounts of gas causing the entire placeBid transaction from a new bidder to run out of gas and revert. This allows the malicious bidder to remain the highest bidder (grief/DoS) and potentially win the auction at their low bid when the auction ends.
Likelihood:
A previous highest bidder becomes a contract that has a heavy (or deliberately malicious) receive()/fallback handler; this occurs when users place bids from contracts rather than EOAs.
New bidders send limited gas with their transactions (common when wallets or relayers specify gas limits) so the refund attempt exhausts the available gas and reverts the new bid.
Impact:
Auction Denial-of-Service: the malicious bidder can remain the highest bidder and prevent honest bidders from outbidding them, effectively locking the auction.
Strategic / economic harm: the attacker may later win the auction at their low bid (seller receives less revenue), or force seller/marketplace to relist/remove item — reputational and financial damage.
Run the following test:
Attack sequence:
Attacker.becomeHighest(tokenId) — attacker becomes highest bidder.
Honest bidder calls market.placeBid{value: higherBid}(tokenId). During that call the marketplace attempts to refund the attacker via low-level call. The attacker's receive() consumes gas and causes the outer transaction to run out of gas or revert — new bid fails. Attacker remains highest bidder.
Converting refunds to pull-payments removes the in-line untrusted call which was consuming caller gas. The marketplace simply records the refund and the recipient calls withdrawAllFailedCredits() to pull funds later.
BidBeast Marketplace has a Medium-severity reentrancy vulnerability in its "buy-now" feature that allows an attacker to disrupt the platform by blocking sales or inflating gas fees for legitimate users.
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.