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.