Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions slither/detectors/statements/unprotected_upgradeable.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
contract OnlyDelegateCall {
modifier onlyDelegateCall() {
_;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import "./Initializable.sol";
import "./OnlyProxy.sol";
import "./OnlyDelegateCall.sol";

contract Whitelisted is Initializable, OnlyProxy{
address owner;
Expand All @@ -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);
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
contract OnlyDelegateCall {
modifier onlyDelegateCall() {
_;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import "./Initializable.sol";
import "./OnlyProxy.sol";
import "./OnlyDelegateCall.sol";

contract Whitelisted is Initializable, OnlyProxy{
address payable owner;
Expand All @@ -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);
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
contract OnlyDelegateCall {
modifier onlyDelegateCall() {
_;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import "./Initializable.sol";
import "./OnlyProxy.sol";
import "./OnlyDelegateCall.sol";

contract Whitelisted is Initializable, OnlyProxy{
address payable owner;
Expand All @@ -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);
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
contract OnlyDelegateCall {
modifier onlyDelegateCall() {
_;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import "./Initializable.sol";
import "./OnlyProxy.sol";
import "./OnlyDelegateCall.sol";

contract Whitelisted is Initializable, OnlyProxy{
address payable owner;
Expand All @@ -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);
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
contract OnlyDelegateCall {
modifier onlyDelegateCall() {
_;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import "./Initializable.sol";
import "./OnlyProxy.sol";
import "./OnlyDelegateCall.sol";

contract Whitelisted is Initializable, OnlyProxy{
address payable owner;
Expand All @@ -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 = payable(msg.sender);
}

function kill() external {
require(msg.sender == owner);
selfdestruct(owner);
}
}
Binary file not shown.