From da3e59c8809b93338089ed9a50fe41c6b62a7e6c Mon Sep 17 00:00:00 2001 From: cats2101 Date: Tue, 28 Apr 2026 00:10:39 +0000 Subject: [PATCH] fix: accept onlyDelegateCall as protected modifier in unprotected-upgrade The unprotected-upgrade detector whitelists `onlyProxy` initializers because the modifier prevents calling the implementation contract directly. `onlyDelegateCall` is a common community-defined synonym that provides the same protection (e.g. minimal-proxy / ERC-1167 templates) and was reported as a false positive in #1136. Add `onlyDelegateCall` to the modifier whitelist alongside `onlyProxy` and extend the existing whitelisted.sol e2e fixtures across all solc versions to cover it. Closes #1136 --- .../statements/unprotected_upgradeable.py | 8 ++++++-- .../0.4.25/OnlyDelegateCall.sol | 5 +++++ .../0.4.25/whitelisted.sol | 14 ++++++++++++++ .../0.4.25/whitelisted.sol-0.4.25.zip | Bin 2859 -> 3568 bytes .../0.5.16/OnlyDelegateCall.sol | 5 +++++ .../0.5.16/whitelisted.sol | 14 ++++++++++++++ .../0.5.16/whitelisted.sol-0.5.16.zip | Bin 2866 -> 3559 bytes .../0.6.11/OnlyDelegateCall.sol | 5 +++++ .../0.6.11/whitelisted.sol | 14 ++++++++++++++ .../0.6.11/whitelisted.sol-0.6.11.zip | Bin 2897 -> 3579 bytes .../0.7.6/OnlyDelegateCall.sol | 5 +++++ .../unprotected-upgrade/0.7.6/whitelisted.sol | 14 ++++++++++++++ .../0.7.6/whitelisted.sol-0.7.6.zip | Bin 3588 -> 4295 bytes .../0.8.15/OnlyDelegateCall.sol | 5 +++++ .../0.8.15/whitelisted.sol | 14 ++++++++++++++ .../0.8.15/whitelisted.sol-0.8.15.zip | Bin 3675 -> 4486 bytes 16 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 tests/e2e/detectors/test_data/unprotected-upgrade/0.4.25/OnlyDelegateCall.sol create mode 100644 tests/e2e/detectors/test_data/unprotected-upgrade/0.5.16/OnlyDelegateCall.sol create mode 100644 tests/e2e/detectors/test_data/unprotected-upgrade/0.6.11/OnlyDelegateCall.sol create mode 100644 tests/e2e/detectors/test_data/unprotected-upgrade/0.7.6/OnlyDelegateCall.sol create mode 100644 tests/e2e/detectors/test_data/unprotected-upgrade/0.8.15/OnlyDelegateCall.sol diff --git a/slither/detectors/statements/unprotected_upgradeable.py b/slither/detectors/statements/unprotected_upgradeable.py index 1916885b0e..7508f718f7 100644 --- a/slither/detectors/statements/unprotected_upgradeable.py +++ b/slither/detectors/statements/unprotected_upgradeable.py @@ -47,10 +47,14 @@ def _has_initializing_protection(functions: list[Function]) -> bool: return False +_WHITELISTED_MODIFIERS = {"onlyProxy", "onlyDelegateCall"} + + def _whitelisted_modifiers(f: Function) -> bool: - # The onlyProxy modifier prevents calling the implementation contract (must be delegatecall) + # The onlyProxy / onlyDelegateCall modifiers prevent calling the implementation contract + # directly (the call must go through delegatecall via the proxy). # https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/3dec82093ea4a490d63aab3e925fed4f692909e8/contracts/proxy/utils/UUPSUpgradeable.sol#L38-L42 - return "onlyProxy" not in [modifier.name for modifier in f.modifiers] + return not any(m.name in _WHITELISTED_MODIFIERS for m in f.modifiers) def _initialize_functions(contract: Contract) -> list[Function]: diff --git a/tests/e2e/detectors/test_data/unprotected-upgrade/0.4.25/OnlyDelegateCall.sol b/tests/e2e/detectors/test_data/unprotected-upgrade/0.4.25/OnlyDelegateCall.sol new file mode 100644 index 0000000000..5337332448 --- /dev/null +++ b/tests/e2e/detectors/test_data/unprotected-upgrade/0.4.25/OnlyDelegateCall.sol @@ -0,0 +1,5 @@ +contract OnlyDelegateCall { + modifier onlyDelegateCall() { + _; + } +} diff --git a/tests/e2e/detectors/test_data/unprotected-upgrade/0.4.25/whitelisted.sol b/tests/e2e/detectors/test_data/unprotected-upgrade/0.4.25/whitelisted.sol index d33a1816a6..db51f0da3e 100644 --- a/tests/e2e/detectors/test_data/unprotected-upgrade/0.4.25/whitelisted.sol +++ b/tests/e2e/detectors/test_data/unprotected-upgrade/0.4.25/whitelisted.sol @@ -1,5 +1,6 @@ import "./Initializable.sol"; import "./OnlyProxy.sol"; +import "./OnlyDelegateCall.sol"; contract Whitelisted is Initializable, OnlyProxy{ address owner; @@ -13,3 +14,16 @@ contract Whitelisted is Initializable, OnlyProxy{ selfdestruct(owner); } } + +contract WhitelistedDelegateCall is Initializable, OnlyDelegateCall{ + address owner; + + function initialize() external initializer onlyDelegateCall { + owner = msg.sender; + } + + function kill() external { + require(msg.sender == owner); + selfdestruct(owner); + } +} diff --git a/tests/e2e/detectors/test_data/unprotected-upgrade/0.4.25/whitelisted.sol-0.4.25.zip b/tests/e2e/detectors/test_data/unprotected-upgrade/0.4.25/whitelisted.sol-0.4.25.zip index 64fdf952bbcb76eb573d9440e05d372be66a0ab5..88c6f3a6c3b831a15286eb42d334550335959196 100644 GIT binary patch delta 3467 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 diff --git a/tests/e2e/detectors/test_data/unprotected-upgrade/0.7.6/OnlyDelegateCall.sol b/tests/e2e/detectors/test_data/unprotected-upgrade/0.7.6/OnlyDelegateCall.sol new file mode 100644 index 0000000000..5337332448 --- /dev/null +++ b/tests/e2e/detectors/test_data/unprotected-upgrade/0.7.6/OnlyDelegateCall.sol @@ -0,0 +1,5 @@ +contract OnlyDelegateCall { + modifier onlyDelegateCall() { + _; + } +} diff --git a/tests/e2e/detectors/test_data/unprotected-upgrade/0.7.6/whitelisted.sol b/tests/e2e/detectors/test_data/unprotected-upgrade/0.7.6/whitelisted.sol index c99b1929f2..007aff1860 100644 --- a/tests/e2e/detectors/test_data/unprotected-upgrade/0.7.6/whitelisted.sol +++ b/tests/e2e/detectors/test_data/unprotected-upgrade/0.7.6/whitelisted.sol @@ -1,5 +1,6 @@ import "./Initializable.sol"; import "./OnlyProxy.sol"; +import "./OnlyDelegateCall.sol"; contract Whitelisted is Initializable, OnlyProxy{ address payable owner; @@ -13,3 +14,16 @@ contract Whitelisted is Initializable, OnlyProxy{ selfdestruct(owner); } } + +contract WhitelistedDelegateCall is Initializable, OnlyDelegateCall{ + address payable owner; + + function initialize() external initializer onlyDelegateCall { + owner = msg.sender; + } + + function kill() external { + require(msg.sender == owner); + selfdestruct(owner); + } +} diff --git a/tests/e2e/detectors/test_data/unprotected-upgrade/0.7.6/whitelisted.sol-0.7.6.zip b/tests/e2e/detectors/test_data/unprotected-upgrade/0.7.6/whitelisted.sol-0.7.6.zip index d1d3ce9e812e2aa1a5565df3311c0f0a0d3bb98f..fd35ab8bba7be91504378e0c6d4fcb707a350b4f 100644 GIT binary patch delta 4193 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 delta 3499 zcmV;c4OH^SA%q+lP)h>@KL7#%4gf@rcUC{?E;C#W0066Ekr+*XAJ=oe7BTTh4~3dwgA^ycMbf?gFGi=~mR<#VpE9wnms-9|cTx?XvHgM{v1EJ= z-SU$hUTuOGWaaOD__8Exf0q%)|DMJoPMXa!ND>XzD4Ei4EB9v0V7$J&p^UN=te`ra zNx!{|F7GGF8nvN+zVJbMJV3o8%q0qot1T32sLQYFhUB;&hS}X>q0ACVFvt(p*G!Y1 zubAEv7}dp)IFWJ0I3x8es0K?M{?ma6_|YA3sH&v_(IEASy8_{5TrLp5N4&?ATHkh@ z11*4T6)^r9A*k`g{t6~O+gkzI8X;^YZ6r#IX`iYP3e~rN%xYC+{YnTOt{wDAS(UHE zI5nDdKVf}wO`=$kbd0nTU32h~eoQ}EJ|4jFGYfYy#7;DxN~YGy5P9hfB`^F6(A90k zrG;3zn~#%Ma)?EBYj#5AMEc(+NI3z}Nh#E0;Mi`S`+x zW>(zGHWsmeHru~eIJ%rxjh@(XFS8oMi?xv@GYbS7W-0v+gJL|-K6=5ovP%DL!yTwR zF`PQ>@`P2lRS<3|)K4rRNM=B5V0L>v#|K&P0dx4>k68(VCp6m*7;+f&(Lo@wOQ|8p z*%=LnSC?6SD zq@_Zg=~BkrKtcVnLQ8D-KTz&wD9tOj_V+- zlE|oAjbVsi;5F6$%x0XiD;Q^u z?iop}ZJ@B0!sD$#qP(i~9oXl8dd)Jm<9O0n2;xn4XB)tArHzz{ty7&!)KZ`hzysZ6 zKL+Si&Y}&f&W`WOv>ly+D_Rq9k9;6c`xJXq|LSfq1(6T=kGrip75z)jprh;V8lK2A zT`;zsZ10{WMr+)ZX}MT)6<=3bo54efWJSk@KB9TCu#`$RSRQ&R=~5qmM=?P1E~i<2 zJHypA=XxrNgFRwp#<9Z_+$<7il{`p8MRIG#Po?c#?rb`jF$(L4CKTfSrl3nDPKDNU z)C9e!W8;q#gYMHsqs{FVHx{7O8x`xOP3cWJ!bJW>SM^k=C%Zu>pcaijUt0WTq0Sv# zeK?#V^3}Om{l4%LCP;#RWRP;XIkZkS%$hK*+!e=%fYQnIHLS&~2!d)Aa`BPT0`a7r zV{zH-$cO*VOzrghF`tw$naVj(s-*mEk#?n*>z(T z&c1sm2vG*Bph`(A_Nfbfxo+&rkiNNE8mhWU=$v%%Vy-K7uxnF)JQk#S9m@J5C1%mR zW8hifb+AAGEK2hMY+01J*e%l*sflxy&@xFOXoNfnJ?01-pLsZianvO0yR-#zt>(2O zW$V00`~6qDOc5zdL`zc6H-Bj~&BYE*CKEA}cxotf)(NK`tAxsX*)8}d54smnq0aEf za&7f7*JCAz0w{BT_Rixf@>YB+Yz61R+uYTxVsJ#G+M*}fY~1ILhJpy|F@_`41e9p( z4%>1^)r0rC&G$x`M^I8C3bD$8fIJvZ*zUuCRVgeA&nVcuK&3m_WzCLYWrQ6eIRIc-iSU z8OzVG+UAi7g9?oIxSOZw8kS?t>^Fn@SD)*o%{Uq_68?`=M}O<-@3rix0Z@T;g+q}N z)--qhbWIGo8OKEh2oGNCg9d2)gvABEAAq4FC_bx+aP*A+dl6 z+)pb9%~7s@i-|v@m;PWLGK2!k_~h#YJ%!SIQN@w6DIFUS!I5l8q2x|9H?j?Y5~Jmt z+rRJ;Ek0$UWEG-R(+7hZk(qI;YA-6dmgq+;_q^m6x6)*p^-O7|Y{{kM!eV%pq69%z3~Tpf|d#J}t)qAZ3w zAKqp{2)^ei^e!=qe>xDX2bO!@lDu$cd%Oq|82D(u64B)p?w)MI5{pbX`Hry$FWT8E z(Q%z|!}Ej2rmF#5quf^$G(z|{bV>gX{l~NKHr09yWN8t%LzRT-47)7{N6+XDB+eZf zG8u4xe7F~{gPCSCn_)qBmnGUH%O&o$>`vXxDj9|=JOR;b zd^~2k9|$A>3{HXxgT7w|JT_L$JGt;Z01~->%0AiPjjX^*v($rFldJcT0!=BJaC#}k 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 delta 3568 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