The circuit accepts recipient as a public input, but never uses it in any constraint.
As a result, the proof is not bound to the payout address, allowing the same valid proof to be submitted with a different recipient .
Likelihood:
Any valid claim transaction exposes the proof and public inputs on-chain.
Because recipient is not constrained by the circuit, an attacker can reuse the same proof and treasureHash while replacing recipientwith their recipient's address.
Impact:
An attacker can front-run or replay a valid proof and redirect the reward to themselves.
This breaks the intended replay protection described by the protocol and can result in loss of the legitimate finder’s reward.
The PoC deploys the verifier and TreasureHunt contract with 100 ether, then loads a valid proof, treasureHash, and original recipient from the generated fixtures. An attacker submits the same proof and treasureHash, but replaces the recipient with their own address; the claim succeeds and the reward is paid to the attacker.
Bind the recipient to the proof by using it in a circuit constraint. For example, include recipient in the hashed statement that the proof verifies
The key requirement is that recipient must affect at least one circuit constraint. Merely declaring it as a public input is not enough.
The claim that the proof system is broken because the recipient is not explicitly constrained in the Noir circuit reflects a misunderstanding of how zero-knowledge proofs bind public inputs. Although the circuit does not impose algebraic constraints on recipient, the value is still included in the public input vector, which is cryptographically committed to during proof generation. As a result, the proof is only valid for the exact tuple of public inputs it was created with. Any attempt by an attacker to front-run and substitute a different recipient would alter this tuple, causing the verifier’s check to fail because the proof no longer matches the provided public inputs. Therefore, while unconstrained public inputs do not enforce logical relationships within the circuit, they remain inseparably bound to the proof itself, and this binding is sufficient to prevent tampering or replay with modified values. Run the unit tests 'testClaimInvalidProofFails', 'testFrontRunningClaimFails'.
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.