From 469286fa99e7c73b6551ad0169e8351b31ff997e Mon Sep 17 00:00:00 2001 From: Simone Date: Fri, 21 Jun 2024 10:51:56 +0200 Subject: [PATCH] Don't report if destination is immutable state var --- .../detectors/functions/arbitrary_send_eth.py | 3 +++ ...ndEth_0_6_11_arbitrary_send_eth_sol__0.txt | 8 ++++---- ...endEth_0_7_6_arbitrary_send_eth_sol__0.txt | 8 ++++---- .../0.6.11/arbitrary_send_eth.sol | 7 ++++++- .../0.6.11/arbitrary_send_eth.sol-0.6.11.zip | Bin 3698 -> 4147 bytes .../0.7.6/arbitrary_send_eth.sol | 7 ++++++- .../0.7.6/arbitrary_send_eth.sol-0.7.6.zip | Bin 3610 -> 4052 bytes 7 files changed, 23 insertions(+), 10 deletions(-) diff --git a/slither/detectors/functions/arbitrary_send_eth.py b/slither/detectors/functions/arbitrary_send_eth.py index f6c688a3f..56fb11250 100644 --- a/slither/detectors/functions/arbitrary_send_eth.py +++ b/slither/detectors/functions/arbitrary_send_eth.py @@ -30,6 +30,7 @@ from slither.slithir.operations import ( SolidityCall, Transfer, ) +from slither.core.variables.state_variable import StateVariable # pylint: disable=too-many-nested-blocks,too-many-branches from slither.utils.output import Output @@ -67,6 +68,8 @@ def arbitrary_send(func: Function) -> Union[bool, List[Node]]: continue if ir.call_value == SolidityVariableComposed("msg.value"): continue + if isinstance(ir.destination, StateVariable) and ir.destination.is_immutable: + continue if is_dependent( ir.call_value, SolidityVariableComposed("msg.value"), diff --git a/tests/e2e/detectors/snapshots/detectors__detector_ArbitrarySendEth_0_6_11_arbitrary_send_eth_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_ArbitrarySendEth_0_6_11_arbitrary_send_eth_sol__0.txt index 56ccf3cd3..d2a1a487f 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_ArbitrarySendEth_0_6_11_arbitrary_send_eth_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_ArbitrarySendEth_0_6_11_arbitrary_send_eth_sol__0.txt @@ -1,8 +1,8 @@ -Test.indirect() (tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#19-21) sends eth to arbitrary user +Test.direct() (tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#16-18) sends eth to arbitrary user Dangerous calls: - - destination.send(address(this).balance) (tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#20) + - msg.sender.send(address(this).balance) (tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#17) -Test.direct() (tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#11-13) sends eth to arbitrary user +Test.indirect() (tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#24-26) sends eth to arbitrary user Dangerous calls: - - msg.sender.send(address(this).balance) (tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#12) + - destination.send(address(this).balance) (tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#25) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_ArbitrarySendEth_0_7_6_arbitrary_send_eth_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_ArbitrarySendEth_0_7_6_arbitrary_send_eth_sol__0.txt index 3d4a4f037..5d9356126 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_ArbitrarySendEth_0_7_6_arbitrary_send_eth_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_ArbitrarySendEth_0_7_6_arbitrary_send_eth_sol__0.txt @@ -1,8 +1,8 @@ -Test.direct() (tests/e2e/detectors/test_data/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#11-13) sends eth to arbitrary user +Test.direct() (tests/e2e/detectors/test_data/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#16-18) sends eth to arbitrary user Dangerous calls: - - msg.sender.send(address(this).balance) (tests/e2e/detectors/test_data/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#12) + - msg.sender.send(address(this).balance) (tests/e2e/detectors/test_data/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#17) -Test.indirect() (tests/e2e/detectors/test_data/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#19-21) sends eth to arbitrary user +Test.indirect() (tests/e2e/detectors/test_data/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#24-26) sends eth to arbitrary user Dangerous calls: - - destination.send(address(this).balance) (tests/e2e/detectors/test_data/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#20) + - destination.send(address(this).balance) (tests/e2e/detectors/test_data/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#25) diff --git a/tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol b/tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol index 9a0c743c4..d494d0e08 100644 --- a/tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol +++ b/tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol @@ -1,13 +1,18 @@ contract Test{ address payable destination; - + address payable immutable destination_imm; mapping (address => uint) balances; constructor() public{ + destination_imm = payable(msg.sender); balances[msg.sender] = 0; } + function send_immutable() public{ + destination_imm.send(address(this).balance); + } + function direct() public{ msg.sender.send(address(this).balance); } diff --git a/tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol-0.6.11.zip b/tests/e2e/detectors/test_data/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol-0.6.11.zip index ebbb8c3463edc4b4a78616f9fe1be05d27b62ee5..bec986a858d51d4dd1da8672bd35cebc8ae9413f 100644 GIT binary patch delta 4031 zcmV;w4?ytp9J3%BP)h>@KL7#%4gj}R)mYms9zuN&005ks001hJFAgn{NGgBzLq3k% z8(|US<+$<-R-TXbNE-97FH-K9mq@1&+0=A#oo)!e&BRa?>@UL&m{xMKPC59HR20S% z5ODwq5A%Q*MB%C(?OqWlHvD&PN0tm4XZ!~VsZvFV7wRmWI*{u2h|qdD*?x`p#+r^A z$&qu;hpC*Q?uBrPUj5xI>Oz0dX-88uB1!EVkTFr5R2R@^8Px{$EaLQnF}R7Kh29x7 zLgqwITHCc#NjuD&IqSFW+NipdgUMAvI(BC6`Dzomfu_ee`^NgLwRLS6BF)nTkX(wd zY#VfAA2Ip;rv-5p3_#CZv9zG3FeB#B_|gT`B^VF~^_~ZllA?kqIb(k|h5%}7FY&cU zaz}pG63e&D0~?DifMZREy=gn@h0n7@Q_rWo!4e|~cD~ko()!*%>lKk${JM$;n9OIe z`EGS`8)5O-#fz^FbI;CwzKeB?wp(2}28gle=Q zKd4msp&}o63TuDJolyn~uYk5k={_rl)Y8p{QqnyQStZ<<40EjV?pvuc1vK4F-WFtd z_*fF>6EFTD1Fnx(r7CsogCkJ9*>X~gDmeZ?{oLyv*Etf%_WO;b)ALp5?H(CvwH{+e zqTI)FbDdMwe(3?C-!%aY4FX{xXLV}g`qyW7UljNkjLLr_O*9U_9ewSBmyWWJ3-NTJ zwHKLEmhP6~xo)o~az6dD0-inUqZTQhP8r+Hpwb(`U;dhc4A{)S(K<&C6K5w4N!Z0Q zThV@_DhgraATgbIRzWmwZ#0;0%K1vgUwu1m9J&Pf4jgUx|ET6Dcg9UJ28`X8=p1`V zgb<9hOksa5^PX~;yCbE+tgUpmPnow90cHL%tazTGCh!1hJ*9ONqOA}s;hZvsZ-5wS zX;3;Ijn5E9?UhDx^dQZi%|Sq$D∓&^CqfeTJOC)F@#paT`Y-utc5}DmKPR-2sjF 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 delta 3578 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 uint) balances; constructor() public{ + destination_imm = payable(msg.sender); balances[msg.sender] = 0; } + function send_immutable() public{ + destination_imm.send(address(this).balance); + } + function direct() public{ msg.sender.send(address(this).balance); } diff --git a/tests/e2e/detectors/test_data/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol-0.7.6.zip b/tests/e2e/detectors/test_data/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol-0.7.6.zip index 3bd2416f58c603b01349fc84d0af1d54fca92d8d..e84aca40ef51edb58097c3db2b84f53590b352c4 100644 GIT binary patch delta 3928 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 delta 3489 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 Pc9Vb)P6n(E00000@vNX>