The vulnerability in the Solidity contract's function resolveTrick is related to the unauthorized change of the requiredCost without proper updating mechanisms to previously initiated purchase agreements (i.e., in pendingNFTsAmountPaid).
The function relies on a dynamic calculation of the requiredCost (treat.cost * 2), which is directly tied to the treat associated with the tokenId. If the treat's cost associated with a specific tokenId is changed after a user initiates a purchase but before they complete it, it can put the user in a position where the requiredCost becomes unexpectedly higher. This can happen especially if additional msg.value (ETH) sent aligns with a previously accurate price but becomes insufficient due to a change in treat.cost.
Initial Scenario Setup:
Assume a user initiates the purchase of a Treat (represented by a tokenId) whose original cost is X ETH. Therefore, the initially computed requiredCost would be 2X ETH.
The user sends a portion of the cost, say X ETH, which is stored in pendingNFTsAmountPaid[tokenId].
Cost Amendment by Contract Owner/Admin:
Before the user sends the remainder of the required ETH, the treat.cost for the specific tokenId is updated by the contract owner or through another function in the contract, changing treat.cost from X to 2X. Now, the new requiredCost expected becomes 4X ETH.
User Completes the Purchase:
The user, unaware of the change in pricing, sends an additional X ETH to complete the assumed 2X ETH total price.
The function now evaluates the total paid (2X ETH from pendingNFTsAmountPaid[tokenId] + X ETH msg.value) against the new requiredCost (4X ETH), and finds it insufficient.
Resulting in Denial of Service or Loss of Funds:
The user has now paid 3X ETH but cannot complete the purchase due to the new requiredCost of 4X ETH, leading to either a need for an additional payment or possible loss of funds if the user decides against continuing the purchase.
This vulnerability leaves room for unexpected behavior and potential financial loss for users, contingent on external control over the cost parameter of a treat. A suitable fix would involve locking the price at the time of initial payment or implementing mechanisms that ensure users are informed and consent to new prices before additional payments are made. This exploit outlines how a seemingly fair transaction becomes unfair due to unannounced changes in transaction terms, directly impacting user trust and contract integrity.
Only the owner has the rights to change the cost of the treat. Therefore it is assumed that the owner will not change the cost of the pending NFTs. The owner role is trusted.
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.