The fulfillMintRequest(bytes32 requestId)
function is marked external
and lacks access control. It uses msg.sender
as the recipient of the minted NFT, rather than the original user who initiated the mint request via requestMintWeatherNFT
This allows any actor to call fulfillMintRequest
with a valid requestId
and mint the NFT to themselves, potentially stealing NFTs meant for others — especially if they can front-run or monitor pending mint requests.
Likelihood:
The function is publicly accessible and emits events with requestId
data.
Anyone monitoring the mempool or past logs can find usable requestId
.
No signature checks, no authentication, and no caller verification.
Impact:
Attackers can steal NFTs by calling the function with a known or sniffed requestId
.
The legitimate user who paid msg.value
receives nothing.
Victim calls requestMintWeatherNFT
.
Attacker watches logs, learns the requestId
.
Attacker calls fulfillMintRequest(requestId)
.
NFT is minted to attacker, not victim.
Assertion passes because ownerOf(1)
is the attacker.
Mint the NFT to the original requester, not msg.sender
:
There is no check to ensure that the caller of the `fulfillMintRequest` function is actually the owner of the `requestId`. This allows a malicious user to receive a NFT that is payed from someone else.
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.