From 50888b92fd28d80eb9e69c7b148405603ce71d09 Mon Sep 17 00:00:00 2001 From: Lawrence Forman Date: Sat, 9 Mar 2024 17:34:33 -0500 Subject: [PATCH] Identify bounty in payer and pauser callbacks. (#3) * fix pauser and payer reuse vuln update testnet scripts fix broken tests update README * update readme * Add Test to Validate Mitigation of Unauthorized Bounty Claim (#5) Added test to check for bounty using another pauser payer * Return pay amount (#4) * return paid amount from claims * update readme * update flow img * update flow img --------- Co-authored-by: JordanCason --- README.md | 10 +- assets/flow.jpg | Bin 69913 -> 70243 bytes script/demo/Dummies.sol | 22 +--- script/demo/SecretProtocol.sol | 144 ++++++++++++++++++++++++-- script/demo/Testnet.s.sol | 68 ++++-------- src/HoneyPause.sol | 67 ++++++++---- src/LibSandbox.sol | 2 +- test/HoneyPause.t.sol | 183 +++++++++++++++++++++++++++------ 8 files changed, 358 insertions(+), 138 deletions(-) diff --git a/README.md b/README.md index ae4b59d..7214d7a 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Projects register bounties with the HoneyPause contract via the `add()` function 1. A bounty token and amount, but no deposit*. 2. The address of a custom [`Verifier`](ause/blob/main/src/HoneyPause.sol#L8) contract which asserts onchain state invariants that would be violated in the case of an exploit. Examples could be an AMM's reserve violating the constant product formula or a lending protocol incurring bad debt. 3. The address of a custom [`Pauser`](./src/HoneyPause.sol#L28) contract which is authorized to pause/freeze the protocol when called by the HoneyPause contract. -4. The address of a custom [`Payer`](./src/HoneyPause.sol#L42) contract which must pay the bounty to the whitehat when called by the HoneyPause contract. +4. The address of a custom [`Payer`](./src/HoneyPause.sol#L44) contract which must pay the bounty to the whitehat when called by the HoneyPause contract. 5. An operator account for the bounty, who will be able to modify the bounty. > \* Note that the HoneyPause contract never custodies bounties. It is up to the project's **Payer** contract to surface funds to cover the bounty when called. @@ -36,7 +36,7 @@ A whitehat that has discovered an exploit on a registered project will submit a > ⚠️ On Ethereum mainnet, it is critical that the whitehat uses a private mempool mechanism (e.g., Flashbots Protect with max privacy) to submit the transaction in order to prevent discovery of the exploit mechanism before the transaction is mined and the protocol can be paused! On other chains where sequencing cannot be practically frontrun, it may be sufficient to submit directly to the tx sequencer. -You can check out an example trace of a claim tx [here](https://phalcon.blocksec.com/explorer/tx/sepolia/0xd3ce2ef3a80a6461142020909acc8499e8b6e893073c77d534734d7d129abdc7). +You can check out an example trace of a claim tx [here](https://phalcon.blocksec.com/explorer/tx/sepolia/0x1b957becc3839f34d1e7f221eeb7353e6073b69da91ac717478a64c3fd2bf291) (older version). ## Writing Verifiers **Verifier**s must confirm that some critical invariants or health checks have been violated in the post-exploit state. Projects need to do the legwork of identifying a robust set of checks that would be considered critical enough to warrant pausing the entire protocol. These would typically be invariants that do not get checked during normal user interactions due to gas constraints. @@ -56,10 +56,10 @@ A **Verifier**'s `beforeExploit()` function returns arbitrary data. This will la If the **Verifier** applies any state changes (even transient ones), they should restrict the caller to the HoneyPause contract. Otherwise the **Verifier** may be maliciously invoked before the call to `claim()` to manipulate results. ## Writing Pausers -Because the exploit will be detailed onchain for all to see after the claim tx is made, **Pausers** should pause as much of the protocol to prevent replicating the exploit across related components (pools) of the system. Only the HoneyPause contract should be allowed to call `pause()` on the **Pauser** contract. The pause *must* occur when `Pauser.pause()` is called, and not in the payer, which is called immediately afterwards. +Because the exploit will be detailed onchain for all to see after the claim tx is made, **Pausers** should pause as much of the protocol to prevent replicating the exploit across related components (pools) of the system. Only the HoneyPause contract should be allowed to call `pause()` on the **Pauser** contract and the `bountyId` parameter should be confirmed to be one created by the project. The pause *must* occur when `Pauser.pause()` is called, and not in the payer, which is called immediately afterwards. ## Writing Payers -The **Payer** contract will be invoked by HoneyPause to transfer the bounty to the whitehat. Bounties can be in either ETH or ERC20. HoneyPause will surround the `payExploiter()` call with balance checks to ensure that payment has been delivered. The **Payer** contract should only allow the HoneyPause contract to call its `payExploiter()` function. +The **Payer** contract will be invoked by HoneyPause to transfer the bounty to the whitehat. Bounties can be in either ETH or ERC20. HoneyPause will surround the `payExploiter()` call with balance checks to ensure that payment has been delivered. The **Payer** contract should only allow the HoneyPause contract to call its `payExploiter()` function and the `bountyId` parameter should be confirmed to be one created by the project. The simplest **Payer** implementation will transfer the bounty directly out of a dedicated fund. Alternatively, a project may choose to keep the bounty value in its protocol and perform the conversion on-the-fly. In that case, the payment mechanism should be distinct from normal user operations on the protocol because the **Payer** will be invoked *after* the **Pauser**. Keep in mind that more complex payment mechanisms can open projects up to a secondary exploit. @@ -68,7 +68,7 @@ The simplest **Payer** implementation will transfer the bounty directly out of a | Chain | Address | |-------|---------| | Ethereum Mainnet | `TBD` | -| Ethereum Sepolia | [`0x5cd701310ae6e3185C29de433019C96efd298d60`](https://sepolia.etherscan.io/address/0x5cd701310ae6e3185c29de433019c96efd298d60) | +| Ethereum Sepolia | [`0x81cb0ba5E7B724B03C8B64A5FAF4f2C655aD15E4`](https://sepolia.etherscan.io/address/0x81cb0ba5E7B724B03C8B64A5FAF4f2C655aD15E4) | ## Credits diff --git a/assets/flow.jpg b/assets/flow.jpg index c1a51c6024b4385b27447fe3a523556bdea5e019..2bf8aec644f52da682cc93c2c91d2cdd7f36429b 100644 GIT binary patch literal 70243 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

N2`DdQ~w&le+v*F^Bov@C2H8hE6DfCBq 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 0x80 + rlpNonceLength := 2 + mstore8(0x16, 0x81) + mstore8(0x17, deployNonce) + } + default { + rlpNonceLength := 1 + switch iszero(deployNonce) + case 1 { + // zero nonce + mstore8(0x16, 0x80) + } + default { + // 1 byte nonce < 0x80 + mstore8(0x16, deployNonce) + } + } + } + } + } + mstore8(0x00, add(0xD5, rlpNonceLength)) + mstore8(0x01, 0x94) + deployed := and( + keccak256(0x00, add(0x16, rlpNonceLength)), + 0xffffffffffffffffffffffffffffffffffffffff + ) + } + } } \ No newline at end of file diff --git a/script/demo/Testnet.s.sol b/script/demo/Testnet.s.sol index 7dd565b..1532466 100644 --- a/script/demo/Testnet.s.sol +++ b/script/demo/Testnet.s.sol @@ -6,12 +6,11 @@ import { ERC20 } from 'solmate/tokens/ERC20.sol'; import { HoneyPause, IVerifier, IPauser, IPayer, ETH_TOKEN } from '../../src/HoneyPause.sol'; import { SecretProtocol, - SecretProtocolVerifier, SecretExploiter, - SecretProtocolPauser, - SecretProtocolPayer + SecretProtocolBountyDeployer, + SecretProtocolVerifier } from './SecretProtocol.sol'; -import { TestPayer, TestToken, SucceedingContract, FailingContract } from './Dummies.sol'; +import { TestToken } from './Dummies.sol'; contract Testnet is Script { uint256 deployerKey; @@ -52,61 +51,32 @@ contract Testnet is Script { new TestToken('USDC', 'USDC', 6); } - function exploitProtocol(uint256 bountyId, SecretProtocol proto, bytes32 preimage) external { - require(bytes3(keccak256(abi.encode(preimage))) == proto.hash(), 'invalid preimage'); + function exploitProtocol(uint256 bountyId, string memory preimage) external { + (,,, IVerifier verifier,,) = honey.getBounty(bountyId); + SecretProtocol proto = SecretProtocolVerifier(address(verifier)).proto(); + require(bytes3(keccak256(bytes(preimage))) == proto.hash(), 'invalid preimage'); _broadcast(); SecretExploiter exploiter = new SecretExploiter(); _broadcast(); honey.claim(bountyId, payable(tx.origin), exploiter, abi.encode(proto, preimage), ""); } - function registerUsdcProtocol(string memory name, uint256 amount, bytes3 hash) external { - address pauserAddress = vm.computeCreateAddress(deployer, vm.getNonce(deployer) + 2); + function registerUsdcProtocol(string memory name, uint256 amount, string memory preimage) external { + bytes3 hash = bytes3(keccak256(bytes(preimage))); _broadcast(); - SecretProtocol proto = new SecretProtocol(hash, pauserAddress); - _broadcast(); - IVerifier verifier = new SecretProtocolVerifier(proto); - _broadcast(); - IPauser pauser = new SecretProtocolPauser(honey, proto); - assert(address(pauser) == pauserAddress); - _broadcast(); - IPayer payer = new SecretProtocolPayer(honey); - _broadcast(); - usdc.mint(address(payer), amount); - _broadcast(); - honey.add({ - name: name, - payoutToken: usdc, - payoutAmount: amount, - verifier: verifier, - pauser: pauser, - payer: payer, - operator: operator - }); + SecretProtocolBountyDeployer d = new SecretProtocolBountyDeployer( + honey, + name, + usdc, + amount, + hash, + operator + ); + (bool canPay,) = honey.verifyBountyCanPay(d.bountyId(), payable(tx.origin)); + require(canPay, 'cannot pay'); } function _broadcast() private { vm.broadcast(deployerKey); } - - function _deployPayerContract(ERC20 token, uint256 amount) private returns (IPayer) { - _broadcast(); - if (token == ETH_TOKEN) { - return new TestPayer{value: amount}(); - } - IPayer payer = new TestPayer(); - _broadcast(); - TestToken(address(token)).mint(address(payer), amount); - return payer; - } - - function _deploySucceedingContract() private returns (address) { - _broadcast(); - return address(new SucceedingContract()); - } - - function _deployFailingContract() private returns (address) { - _broadcast(); - return address(new FailingContract()); - } } \ No newline at end of file diff --git a/src/HoneyPause.sol b/src/HoneyPause.sol index 8fb7681..9ca3e24 100644 --- a/src/HoneyPause.sol +++ b/src/HoneyPause.sol @@ -27,8 +27,10 @@ interface IVerifier { /// @dev Interface for a protocol's pauser contract. interface IPauser { /// @dev Pause a protocol. - /// The implementer MUST check that the caller of this function is the HoneyPause contract. - function pause() external; + /// The implementer MUST check that the caller of this function is the HoneyPause contract + /// and that the `bountyId` is one they recognize as their own. + /// @param bountyId ID of the bounty that triggered it. + function pause(uint256 bountyId) external; } /// @dev Interface for an exploit contract provided by a whitehat making a claim. @@ -41,13 +43,15 @@ interface IExploiter { /// @dev Interface for a protocol's payer contract. interface IPayer { /// @dev Pay the whitehat the bounty after proving an exploit was possible. - /// The implementer MUST check that the caller of this function is the HoneyPause contract. - /// This payment mechanism should be distinct from typical protocol + /// The implementer MUST check that the caller of this function is the HoneyPause contract + /// and that the `bountyId` is one they recognize as their own. + /// This payment mechanism should be distinct from user operations /// interactions because this function will be called AFTER the pauser has been invoked. + /// @param bountyId ID of the bounty that triggered it. /// @param token The bounty token. /// @param to The receving account for payment. /// @param amount The bounty amount. - function payExploiter(ERC20 token, address payable to, uint256 amount) external; + function payExploiter(uint256 bountyId, ERC20 token, address payable to, uint256 amount) external; } /// @dev ERC20 type alias for ETH. @@ -200,9 +204,10 @@ contract HoneyPause { bytes memory exploiterData, bytes memory verifierData ) - external + external returns (uint256 payAmount) { - Bounty memory bounty = _claim({ + Bounty memory bounty; + (bounty, payAmount) = _claim({ bountyId: bountyId, payReceiver: payReceiver, exploiter: exploiter, @@ -210,7 +215,7 @@ contract HoneyPause { verifierData: verifierData, skipExploit: false }); - emit Claimed(bountyId, bounty.payoutToken, bounty.payoutAmount); + emit Claimed(bountyId, bounty.payoutToken, payAmount); } /// @notice Carries out an exploit, verifies it, then reverts the call frame. @@ -239,7 +244,7 @@ contract HoneyPause { verifier.assertExploit, (verifierData, verifierStateData) )); - revert SandboxSucceededError(); + revert SandboxSucceededError(''); } /// @notice Check whether a bounty can actually pay out its reward. @@ -247,15 +252,24 @@ contract HoneyPause { /// determination. All state is reverted before returning so this can /// be safely called on-chain but most likely it will be consumed off-chain /// via eth_call. + /// @param bountyId ID of a valid, active bounty. + /// @param payReceiver Recepient of bounty. + /// @return bountyCanPay Whether the payer sent at least the bounty amount to the receiver. + /// @return payAmount Actual amount sent to receiver (may be more than bounty amount). function verifyBountyCanPay(uint256 bountyId, address payable payReceiver) - external returns (bool bountyCanPay) + external returns (bool bountyCanPay, uint256 payAmount) { try this.sandboxTryPayBounty(bountyId, payReceiver) { // Should always fail. assert(false); } catch (bytes memory errData) { - return LibSandbox.handleSandboxCallRevert(errData, true); + if (!LibSandbox.handleSandboxCallRevert(errData, true)) { + return (false, 0); + } + // The data inside the SandboxSucceededError is the pay amount. + payAmount = abi.decode(abi.decode(errData.skip(4), (bytes)), (uint256)); } + return (true, payAmount); } /// @notice Mimics the logic for a successful claim() to verify that a bounty can @@ -265,7 +279,7 @@ contract HoneyPause { function sandboxTryPayBounty(uint256 bountyId, address payable payReceiver) external { - _claim({ + (, uint256 payAmount) = _claim({ bountyId: bountyId, payReceiver: payReceiver, exploiter: IExploiter(address(0)), @@ -275,7 +289,7 @@ contract HoneyPause { // it does minus the exploit verification. skipExploit: true }); - revert SandboxSucceededError(); + revert SandboxSucceededError(abi.encode(payAmount)); } /// @dev The logic of claim(), refactored out for sandboxTryPayBounty(). @@ -288,7 +302,7 @@ contract HoneyPause { bool skipExploit ) internal - returns (Bounty memory bounty) + returns (Bounty memory bounty, uint256 payAmount) { bounty = getBounty[bountyId]; if (bounty.operator == address(0)) { @@ -312,25 +326,40 @@ contract HoneyPause { } } // Pause the protocol. - address(bounty.pauser).safeCall(abi.encodeCall(bounty.pauser.pause, ())); + address(bounty.pauser).safeCall(abi.encodeCall(bounty.pauser.pause, (bountyId))); // Pay the bounty. - _payout(bounty.payer, bounty.payoutToken, payReceiver, bounty.payoutAmount); + payAmount = _payout( + bountyId, + bounty.payer, + bounty.payoutToken, + payReceiver, + bounty.payoutAmount + ); } - // Call a bounty's payer contract and verify that it transferred the payment. - function _payout(IPayer payer, ERC20 token, address payable to, uint256 amount) + // Call a bounty's payer contract, verify that it transferred the payment, and + // return the amount transferred. + function _payout( + uint256 bountyId, + IPayer payer, + ERC20 token, + address payable to, + uint256 amount + ) internal + returns (uint256 payAmount) { uint256 balBefore = _balanceOf(token, to); address(payer).safeCall(abi.encodeCall( payer.payExploiter, - (token, to, amount) + (bountyId, token, to, amount) )); uint256 balAfter = _balanceOf(token, to); if (balBefore > balAfter || balAfter - balBefore < amount) { revert InsufficientPayoutError(); } + return balAfter - balBefore; } // Get the balance of a token (or ETH) of an account. diff --git a/src/LibSandbox.sol b/src/LibSandbox.sol index d8f28a6..12367ad 100644 --- a/src/LibSandbox.sol +++ b/src/LibSandbox.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.24; import { LibBytes } from './LibBytes.sol'; error SandboxFailedError(bytes innerError); -error SandboxSucceededError(); +error SandboxSucceededError(bytes data); library LibSandbox { using LibBytes for bytes; diff --git a/test/HoneyPause.t.sol b/test/HoneyPause.t.sol index dbf6aab..2877d2b 100644 --- a/test/HoneyPause.t.sol +++ b/test/HoneyPause.t.sol @@ -38,9 +38,9 @@ contract HoneyPauseTest is Test { TestHoneyPause honey = new TestHoneyPause(); TestERC20 testToken = new TestERC20(); bytes TEST_ERROR = abi.encodeWithSelector(TestError.selector, 'FAILED'); - bytes SANDBOX_SUCCEEDED_ERROR = abi.encodeWithSelector(SandboxSucceededError.selector); + bytes EMPTY_SANDBOX_SUCCEEDED_ERROR = abi.encodeWithSelector(SandboxSucceededError.selector, ""); bytes WRAPPED_SANDBOX_SUCCEEDED_ERROR = abi.encodeWithSelector(SandboxFailedError.selector, - abi.encodeWithSelector(SandboxSucceededError.selector) + abi.encodeWithSelector(SandboxSucceededError.selector, "") ); function test_errorSelectorsCanBeSandboxed() external { @@ -54,44 +54,52 @@ contract HoneyPauseTest is Test { function test_payout_canPayERC20() external { IPayer payer = new TestERC20Payer(testToken, TEST_BOUNTY_AMOUNT); - honey.__payout(payer, testToken, RECEIVER, TEST_BOUNTY_AMOUNT); + vm.expectEmit(true, true, true, true); + emit TestERC20Payer.PayExploiterCalled(1337, testToken, RECEIVER, TEST_BOUNTY_AMOUNT); + honey.__payout(1337, payer, testToken, RECEIVER, TEST_BOUNTY_AMOUNT); assertEq(testToken.balanceOf(RECEIVER), TEST_BOUNTY_AMOUNT); } function test_payout_canPayZeroERC20() external { IPayer payer = new TestERC20Payer(testToken, 0); - honey.__payout(payer, testToken, RECEIVER, 0); + vm.expectEmit(true, true, true, true); + emit TestERC20Payer.PayExploiterCalled(1337, testToken, RECEIVER, 0); + honey.__payout(1337, payer, testToken, RECEIVER, 0); assertEq(testToken.balanceOf(RECEIVER), 0); } function test_payout_failsIfUnderpaysERC20() external { IPayer payer = new TestERC20Payer(testToken, TEST_BOUNTY_AMOUNT - 1); vm.expectRevert(InsufficientPayoutError.selector); - honey.__payout(payer, testToken, RECEIVER, TEST_BOUNTY_AMOUNT); + honey.__payout(1337, payer, testToken, RECEIVER, TEST_BOUNTY_AMOUNT); } function test_payout_canPayEth() external { IPayer payer = new TestEthPayer{value: TEST_BOUNTY_AMOUNT}(); - honey.__payout(payer, ETH_TOKEN, RECEIVER, TEST_BOUNTY_AMOUNT); + vm.expectEmit(true, true, true, true); + emit TestERC20Payer.PayExploiterCalled(1337, ETH_TOKEN, RECEIVER, TEST_BOUNTY_AMOUNT); + honey.__payout(1337, payer, ETH_TOKEN, RECEIVER, TEST_BOUNTY_AMOUNT); assertEq(RECEIVER.balance, TEST_BOUNTY_AMOUNT); } function test_payout_canPayZeroEth() external { IPayer payer = new TestEthPayer(); - honey.__payout(payer, ETH_TOKEN, RECEIVER, 0); + vm.expectEmit(true, true, true, true); + emit TestERC20Payer.PayExploiterCalled(1337, ETH_TOKEN, RECEIVER, 0); + honey.__payout(1337, payer, ETH_TOKEN, RECEIVER, 0); assertEq(RECEIVER.balance, 0); } function test_payout_failsIfUnderpaysEth() external { IPayer payer = new TestEthPayer{value: TEST_BOUNTY_AMOUNT - 1}(); vm.expectRevert(InsufficientPayoutError.selector); - honey.__payout(payer, ETH_TOKEN, RECEIVER, TEST_BOUNTY_AMOUNT); + honey.__payout(1337, payer, ETH_TOKEN, RECEIVER, TEST_BOUNTY_AMOUNT); } function test_sandboxExploit_revertsOnSuccess() external { IVerifier verifier = new TestVerifier(); IExploiter exploiter = new TestExploiter(); - vm.expectRevert(SandboxSucceededError.selector); + vm.expectRevert(EMPTY_SANDBOX_SUCCEEDED_ERROR); honey.sandboxExploit(exploiter, verifier, "", ""); } @@ -128,7 +136,7 @@ contract HoneyPauseTest is Test { function test_sandboxExploit_wrapsSandboxSuccessFromVerifierBeforeExploitCall() external { IVerifier verifier = IVerifier(_createFailingFnContract( IVerifier.beforeExploit.selector, - SANDBOX_SUCCEEDED_ERROR + EMPTY_SANDBOX_SUCCEEDED_ERROR )); IExploiter exploiter = new TestExploiter(); vm.expectRevert(WRAPPED_SANDBOX_SUCCEEDED_ERROR); @@ -138,7 +146,7 @@ contract HoneyPauseTest is Test { function test_sandboxExploit_wrapsSandboxSuccessFromVerifierAssertExploitCall() external { IVerifier verifier = IVerifier(_createFailingFnContract( IVerifier.assertExploit.selector, - SANDBOX_SUCCEEDED_ERROR + EMPTY_SANDBOX_SUCCEEDED_ERROR )); TestExploiter exploiter = new TestExploiter(); vm.expectRevert(WRAPPED_SANDBOX_SUCCEEDED_ERROR); @@ -149,7 +157,7 @@ contract HoneyPauseTest is Test { IVerifier verifier = new TestVerifier(); IExploiter exploiter = IExploiter(_createFailingFnContract( IExploiter.exploit.selector, - SANDBOX_SUCCEEDED_ERROR + EMPTY_SANDBOX_SUCCEEDED_ERROR )); vm.expectRevert(WRAPPED_SANDBOX_SUCCEEDED_ERROR); honey.sandboxExploit(exploiter, verifier, "", ""); @@ -168,7 +176,7 @@ contract HoneyPauseTest is Test { emit TestExploiter.ExploitCalled(exploiterData); vm.expectEmit(true, true, true, true); emit TestVerifier.AssertExploitCalled(verifierData, verifierStateData); - vm.expectRevert(SandboxSucceededError.selector); + vm.expectRevert(EMPTY_SANDBOX_SUCCEEDED_ERROR); honey.sandboxExploit(exploiter, verifier, exploiterData, verifierData); } @@ -341,8 +349,9 @@ contract HoneyPauseTest is Test { IExploiter exploiter = new TestExploiter(); vm.expectEmit(true, true, true, true); emit Claimed(bountyId, ETH_TOKEN, 100); - honey.claim(bountyId, RECEIVER, exploiter, "", ""); + uint256 payAmount = honey.claim(bountyId, RECEIVER, exploiter, "", ""); assertEq(honey.isBountyClaimed(bountyId), true); + assertEq(payAmount, TEST_BOUNTY_AMOUNT); } function test_claim_passesData() external { @@ -361,7 +370,7 @@ contract HoneyPauseTest is Test { uint256 bountyId = _addTestBounty(); IExploiter exploiter = new TestExploiter(); vm.expectEmit(true, true, true, true); - emit TestPauser.PauseCalled(); + emit TestPauser.PauseCalled(bountyId); honey.claim(bountyId, RECEIVER, exploiter, "", ""); } @@ -423,15 +432,26 @@ contract HoneyPauseTest is Test { uint256 bountyId = _addTestBounty(); IExploiter exploiter = IExploiter(_createFailingFnContract( IExploiter.exploit.selector, - SANDBOX_SUCCEEDED_ERROR + EMPTY_SANDBOX_SUCCEEDED_ERROR )); - vm.expectRevert(SANDBOX_SUCCEEDED_ERROR); + vm.expectRevert(EMPTY_SANDBOX_SUCCEEDED_ERROR); honey.claim(bountyId, RECEIVER, exploiter, "", ""); } function test_verifyBountyCanPay_returnsTrueIfBountyPays() external { uint256 bountyId = _addTestBounty(); - assertEq(honey.verifyBountyCanPay(bountyId, RECEIVER), true); + (bool canPay, uint256 payAmount) = honey.verifyBountyCanPay(bountyId, RECEIVER); + assertEq(canPay, true); + assertEq(payAmount, TEST_BOUNTY_AMOUNT); + } + + function test_verifyBountyCanPay_returnsTrueIfBountyPaysTooMuch() external { + uint256 bountyId = _addTestBounty(); + (,,,,, IPayer payer) = honey.getBounty(bountyId); + payable(address(payer)).transfer(1); + (bool canPay, uint256 payAmount) = honey.verifyBountyCanPay(bountyId, RECEIVER); + assertEq(canPay, true); + assertEq(payAmount, TEST_BOUNTY_AMOUNT + 1); } function test_verifyBountyCanPay_doesNotModifyState() external { @@ -449,7 +469,9 @@ contract HoneyPauseTest is Test { IPayer.payExploiter.selector, TEST_ERROR ))); - assertEq(honey.verifyBountyCanPay(bountyId, RECEIVER), false); + (bool canPay, uint256 payAmount) = honey.verifyBountyCanPay(bountyId, RECEIVER); + assertEq(canPay, false); + assertEq(payAmount, 0); } function test_verifyBountyCanPay_returnsFalseIfPauserReverts() external { @@ -458,37 +480,92 @@ contract HoneyPauseTest is Test { IPauser.pause.selector, TEST_ERROR ))); - assertEq(honey.verifyBountyCanPay(bountyId, RECEIVER), false); + (bool canPay, uint256 payAmount) = honey.verifyBountyCanPay(bountyId, RECEIVER); + assertEq(canPay, false); + assertEq(payAmount, 0); } function test_verifyBountyCanPay_returnsFalseIfPayerDoesNotPayEnoughEth() external { uint256 bountyId = _addTestBounty(); honey.__testSetBountyPayer(bountyId, new TestEthPayer{value: TEST_BOUNTY_AMOUNT - 1}()); - assertEq(honey.verifyBountyCanPay(bountyId, RECEIVER), false); + (bool canPay, uint256 payAmount) = honey.verifyBountyCanPay(bountyId, RECEIVER); + assertEq(canPay, false); + assertEq(payAmount, 0); } function test_verifyBountyCanPay_returnsFalseIfPayerDoesNotPayEnoughErc20() external { uint256 bountyId = _addTestBounty(); honey.__testSetBountyPayer(bountyId, new TestERC20Payer(testToken, TEST_BOUNTY_AMOUNT - 1)); - assertEq(honey.verifyBountyCanPay(bountyId, RECEIVER), false); + (bool canPay, uint256 payAmount) = honey.verifyBountyCanPay(bountyId, RECEIVER); + assertEq(canPay, false); + assertEq(payAmount, 0); } function test_verifyBountyCanPay_returnsFalseIfPayerRevertsWithSandoxSucceeded() external { uint256 bountyId = _addTestBounty(); honey.__testSetBountyPayer(bountyId, IPayer(_createFailingFnContract( IPayer.payExploiter.selector, - SANDBOX_SUCCEEDED_ERROR + EMPTY_SANDBOX_SUCCEEDED_ERROR ))); - assertEq(honey.verifyBountyCanPay(bountyId, RECEIVER), false); + (bool canPay, uint256 payAmount) = honey.verifyBountyCanPay(bountyId, RECEIVER); + assertEq(canPay, false); + assertEq(payAmount, 0); } function test_verifyBountyCanPay_returnsFalseIfPauserRevertsWithSandoxSucceeded() external { uint256 bountyId = _addTestBounty(); honey.__testSetBountyPauser(bountyId, IPauser(_createFailingFnContract( IPauser.pause.selector, - SANDBOX_SUCCEEDED_ERROR + EMPTY_SANDBOX_SUCCEEDED_ERROR ))); - assertEq(honey.verifyBountyCanPay(bountyId, RECEIVER), false); + (bool canPay, uint256 payAmount) = honey.verifyBountyCanPay(bountyId, RECEIVER); + assertEq(canPay, false); + assertEq(payAmount, 0); + } + + function test_bountyCannotUseAnotherBountyPauserPayer() external { + MockPauser mockPauser = new MockPauser(); + MockPayer mockPayer = new MockPayer(); + + uint256 bountyAmount = 1 ether; + + // Create legitimate and a fake bounty with the mock contracts. + uint256 legitimateBountyId = honey.add( + "Legitimate", + testToken, + bountyAmount, + new TestVerifier(), + mockPauser, + mockPayer, + address(this) + ); + + uint256 fakeBountyId = honey.add( + "ExploitTest", + testToken, + bountyAmount, + new TestVerifier(), + mockPauser, + mockPayer, + address(this) + ); + + IExploiter exploiter = new TestExploiter(); + + // Set the valid bountyId in mock contracts to the legitimate bountyId. + mockPauser.setValidBountyId(legitimateBountyId); + mockPayer.setValidBountyId(legitimateBountyId); + + // Test that the pauser receives the correct bountyId and reverts against the fake bountyId. + vm.expectRevert("Unauthorized bountyId in pauser"); + honey.claim(fakeBountyId, payable(address(this)), exploiter, "", ""); + + // Temporarily allow pausing for the fake bounty to test payer logic. + mockPauser.setValidBountyId(fakeBountyId); + + // Test that the payer also correctly identifies and reverts against fake bountyId claims. + vm.expectRevert("Unauthorized bountyId in payer"); + honey.claim(fakeBountyId, payable(address(this)), exploiter, "", ""); } function _addTestBounty() @@ -536,6 +613,31 @@ contract HoneyPauseTest is Test { } } +contract MockPauser is IPauser { + uint256 private validBountyId; + + function setValidBountyId(uint256 validBountyId_) external { + validBountyId = validBountyId_; + } + + function pause(uint256 bountyId) external view { + require(bountyId == validBountyId, "Unauthorized bountyId in pauser"); + } +} + +contract MockPayer is IPayer { + uint256 private validBountyId; + + function setValidBountyId(uint256 validBountyId_) external { + validBountyId = validBountyId_; + } + + function payExploiter(uint256 bountyId, ERC20 token, address payable to, uint256 amount) external override { + require(bountyId == validBountyId, "Unauthorized bountyId in payer"); + token.transfer(to, amount); + } +} + contract TestExploiter is IExploiter { event ExploitCalled(bytes exploiterData); @@ -545,10 +647,10 @@ contract TestExploiter is IExploiter { } contract TestPauser is IPauser { - event PauseCalled(); + event PauseCalled(uint256 bountyId); - function pause() external { - emit PauseCalled(); + function pause(uint256 bountyId) external { + emit PauseCalled(bountyId); } } @@ -575,11 +677,14 @@ contract TestVerifier is IVerifier { } contract TestERC20Payer is IPayer { + event PayExploiterCalled(uint256 bountyId, ERC20 token, address payable to, uint256 amount); + constructor(TestERC20 token, uint256 reserve) { token.mint(address(this), reserve) ; } - function payExploiter(ERC20 token, address payable to, uint256) external { + function payExploiter(uint256 bountyId, ERC20 token, address payable to, uint256 amount) external { + emit PayExploiterCalled(bountyId, token, to, amount); token.transfer(to, token.balanceOf(address(this))); } } @@ -613,19 +718,29 @@ contract FailingContract { } contract TestEthPayer is IPayer { + event PayExploiterCalled(uint256 bountyId, ERC20 token, address payable to, uint256 amount); constructor() payable {} - function payExploiter(ERC20 token, address payable to, uint256) external { + function payExploiter(uint256 bountyId, ERC20 token, address payable to, uint256 amount) external { + emit PayExploiterCalled(bountyId, token, to, amount); assert(token == ETH_TOKEN); return to.transfer(address(this).balance); } + + receive() external payable {} } contract TestHoneyPause is HoneyPause { - function __payout(IPayer payer, ERC20 token, address payable to, uint256 amount) + function __payout( + uint256 bountyId, + IPayer payer, + ERC20 token, + address payable to, + uint256 amount + ) external { - _payout(payer, token, to, amount); + _payout(bountyId, payer, token, to, amount); } function __testSetBountyVerifier(uint256 bountyId, IVerifier verifier) @@ -654,4 +769,4 @@ contract TestHoneyPause is HoneyPause { ) external pure { _validateBountyConfig({ operator: operator, pauser: pauser, verifier: verifier, payer: payer }); } -} \ No newline at end of file +}