Platform: Code4rena
Start Date: 30/10/2023
Pot Size: $49,250 USDC
Total HM: 14
Participants: 243
Period: 14 days
Judge: 0xsomeone
Id: 302
League: ETH
Rank: 229/243
Findings: 1
Award: $0.00
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: smiling_heretic
Also found by: 00decree, 00xSEV, 0x180db, 0x3b, 0x656c68616a, 0xAadi, 0xAleko, 0xAsen, 0xDetermination, 0xJuda, 0xMAKEOUTHILL, 0xMango, 0xMosh, 0xSwahili, 0x_6a70, 0xarno, 0xgrbr, 0xpiken, 0xsagetony, 3th, 8olidity, ABA, AerialRaider, Al-Qa-qa, Arabadzhiev, AvantGard, CaeraDenoir, ChrisTina, DanielArmstrong, DarkTower, DeFiHackLabs, Deft_TT, Delvir0, Draiakoo, Eigenvectors, Fulum, Greed, HChang26, Haipls, Hama, Inference, Jiamin, JohnnyTime, Jorgect, Juntao, Kaysoft, Kose, Kow, Krace, MaNcHaSsS, Madalad, MrPotatoMagic, Neon2835, NoamYakov, Norah, Oxsadeeq, PENGUN, REKCAH, Ruhum, Shubham, Silvermist, Soul22, SovaSlava, SpicyMeatball, Talfao, TermoHash, The_Kakers, Toshii, TuringConsulting, Udsen, VAD37, Vagner, Zac, Zach_166, ZdravkoHr, _eperezok, ak1, aldarion, alexfilippov314, alexxander, amaechieth, aslanbek, ast3ros, audityourcontracts, ayden, bdmcbri, bird-flu, blutorque, bronze_pickaxe, btk, c0pp3rscr3w3r, c3phas, cartlex_, cccz, ciphermarco, circlelooper, crunch, cryptothemex, cu5t0mpeo, darksnow, degensec, dethera, devival, dimulski, droptpackets, epistkr, evmboi32, fibonacci, gumgumzum, immeas, innertia, inzinko, jasonxiale, joesan, ke1caM, kimchi, lanrebayode77, lsaudit, mahyar, max10afternoon, merlin, mrudenko, nuthan2x, oakcobalt, openwide, orion, phoenixV110, pontifex, r0ck3tz, rotcivegaf, rvierdiiev, seeques, shenwilly, sl1, slvDev, t0x1c, tallo, tnquanghuy0512, tpiliposian, trachev, twcctop, vangrim, volodya, xAriextz, xeros, xuwinnie, y4y, yobiz, zhaojie
0 USDC - $0.00
https://github.com/code-423n4/2023-10-nextgen/blob/8b518196629faa37eae39736837b24926fd3c07c/hardhat/smart-contracts/AuctionDemo.sol#L105 https://github.com/code-423n4/2023-10-nextgen/blob/8b518196629faa37eae39736837b24926fd3c07c/hardhat/smart-contracts/AuctionDemo.sol#L125
The vulnerability arises due to a timing issue where block.timestamp
is used as a condition to gate both the claimAuction
and cancelBid
functions. Specifically, when block.timestamp
is equal to minter.getAuctionEndTime(_tokenId)
, a user can invoke both functions in the same transaction block. This is because the conditional check uses <=
instead of <
. Consequently, a malicious actor could claim the auctioned token with claimAuction
and then invalidate their bid by calling cancelBid
, retrieving their bid amount and effectively receiving the token without payment.
The attack can be executed as follows:
block.timestamp
is exactly equal to minter.getAuctionEndTime(_tokenId)
, execute claimAuction
.cancelBid
. Due to the condition block.timestamp <= minter.getAuctionEndTime(_tokenId)
, this will succeed.Manual Review.
cancelBid
cannot be called in the same block as claimAuction
. This can be achieved by using a strict inequality (<
) in cancelBid
.auctionClaimed
to true
when claimAuction
is successfully called. This variable should then be checked in the cancelBid
function to prevent bid cancellation after a claim (require(auctionClaim[_tokenid] = false
)Invalid Validation
#0 - c4-pre-sort
2023-11-14T09:57:22Z
141345 marked the issue as duplicate of #1904
#1 - c4-pre-sort
2023-11-14T23:31:54Z
141345 marked the issue as duplicate of #962
#2 - c4-judge
2023-12-04T21:42:34Z
alex-ppg marked the issue as duplicate of #1323
#3 - c4-judge
2023-12-08T17:40:35Z
alex-ppg marked the issue as partial-50