-
Notifications
You must be signed in to change notification settings - Fork 996
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1344 from plotchy/dev_fp_uuc
add _disableInitializers() detection
- Loading branch information
Showing
12 changed files
with
330 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
16 changes: 13 additions & 3 deletions
16
tests/detectors/unprotected-upgrade/0.7.6/Initializable.sol
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,15 @@ | ||
contract Initializable{ | ||
modifier initializer() { | ||
_; | ||
} | ||
uint8 private _initialized; | ||
bool private _initializing; | ||
|
||
modifier initializer() { | ||
_; | ||
} | ||
|
||
function _disableInitializers() internal virtual { | ||
require(!_initializing, "Initializable: contract is initializing"); | ||
if (_initialized < type(uint8).max) { | ||
_initialized = type(uint8).max; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
import "./Initializable.sol"; | ||
|
||
contract Buggy is Initializable{ | ||
address payable owner; | ||
|
||
function initialize() external initializer{ | ||
require(owner == address(0)); | ||
owner = payable(msg.sender); | ||
} | ||
function kill() external{ | ||
require(msg.sender == owner); | ||
selfdestruct(owner); | ||
} | ||
} |
145 changes: 145 additions & 0 deletions
145
tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol.0.8.15.UnprotectedUpgradeable.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
[ | ||
[ | ||
{ | ||
"elements": [ | ||
{ | ||
"type": "contract", | ||
"name": "Buggy", | ||
"source_mapping": { | ||
"start": 31, | ||
"length": 294, | ||
"filename_relative": "tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol", | ||
"filename_absolute": "/GENERIC_PATH", | ||
"filename_short": "tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol", | ||
"is_dependency": false, | ||
"lines": [ | ||
3, | ||
4, | ||
5, | ||
6, | ||
7, | ||
8, | ||
9, | ||
10, | ||
11, | ||
12, | ||
13, | ||
14 | ||
], | ||
"starting_column": 1, | ||
"ending_column": 2 | ||
} | ||
}, | ||
{ | ||
"type": "function", | ||
"name": "initialize", | ||
"source_mapping": { | ||
"start": 96, | ||
"length": 124, | ||
"filename_relative": "tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol", | ||
"filename_absolute": "/GENERIC_PATH", | ||
"filename_short": "tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol", | ||
"is_dependency": false, | ||
"lines": [ | ||
6, | ||
7, | ||
8, | ||
9 | ||
], | ||
"starting_column": 5, | ||
"ending_column": 6 | ||
}, | ||
"type_specific_fields": { | ||
"parent": { | ||
"type": "contract", | ||
"name": "Buggy", | ||
"source_mapping": { | ||
"start": 31, | ||
"length": 294, | ||
"filename_relative": "tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol", | ||
"filename_absolute": "/GENERIC_PATH", | ||
"filename_short": "tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol", | ||
"is_dependency": false, | ||
"lines": [ | ||
3, | ||
4, | ||
5, | ||
6, | ||
7, | ||
8, | ||
9, | ||
10, | ||
11, | ||
12, | ||
13, | ||
14 | ||
], | ||
"starting_column": 1, | ||
"ending_column": 2 | ||
} | ||
}, | ||
"signature": "initialize()" | ||
} | ||
}, | ||
{ | ||
"type": "function", | ||
"name": "kill", | ||
"source_mapping": { | ||
"start": 225, | ||
"length": 98, | ||
"filename_relative": "tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol", | ||
"filename_absolute": "/GENERIC_PATH", | ||
"filename_short": "tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol", | ||
"is_dependency": false, | ||
"lines": [ | ||
10, | ||
11, | ||
12, | ||
13 | ||
], | ||
"starting_column": 5, | ||
"ending_column": 6 | ||
}, | ||
"type_specific_fields": { | ||
"parent": { | ||
"type": "contract", | ||
"name": "Buggy", | ||
"source_mapping": { | ||
"start": 31, | ||
"length": 294, | ||
"filename_relative": "tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol", | ||
"filename_absolute": "/GENERIC_PATH", | ||
"filename_short": "tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol", | ||
"is_dependency": false, | ||
"lines": [ | ||
3, | ||
4, | ||
5, | ||
6, | ||
7, | ||
8, | ||
9, | ||
10, | ||
11, | ||
12, | ||
13, | ||
14 | ||
], | ||
"starting_column": 1, | ||
"ending_column": 2 | ||
} | ||
}, | ||
"signature": "kill()" | ||
} | ||
} | ||
], | ||
"description": "Buggy (tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol#3-14) is an upgradeable contract that does not protect its initialize functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol#10-13)", | ||
"markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol#L3-L14) is an upgradeable contract that does not protect its initialize functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol#L10-L13)", | ||
"first_markdown_element": "tests/detectors/unprotected-upgrade/0.8.15/Buggy.sol#L3-L14", | ||
"id": "d85b90230632a30f7ffb5140a791d4a9ae8b0be045c5b27175f3c477e189c08c", | ||
"check": "unprotected-upgrade", | ||
"impact": "High", | ||
"confidence": "High" | ||
} | ||
] | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
import "./Initializable.sol"; | ||
|
||
contract Fixed is Initializable{ | ||
address payable owner; | ||
|
||
constructor() { | ||
owner = payable(msg.sender); | ||
} | ||
|
||
function initialize() external initializer{ | ||
require(owner == address(0)); | ||
owner = payable(msg.sender); | ||
|
||
} | ||
function kill() external{ | ||
require(msg.sender == owner); | ||
selfdestruct(owner); | ||
} | ||
|
||
function other_function() external{ | ||
|
||
} | ||
} | ||
|
||
contract Not_Upgradeable{ | ||
} | ||
|
||
contract UpgradeableNoDestruct is Initializable{ | ||
address payable owner; | ||
|
||
constructor() { | ||
owner = payable(msg.sender); | ||
} | ||
|
||
function initialize() external initializer{ | ||
require(owner == address(0)); | ||
owner = payable(msg.sender); | ||
} | ||
} | ||
|
||
contract Fixed2 is Initializable { | ||
address payable owner; | ||
|
||
constructor() initializer {} | ||
|
||
function initialize() external initializer { | ||
require(owner == address(0)); | ||
owner = payable(msg.sender); | ||
} | ||
|
||
function kill() external { | ||
require(msg.sender == owner); | ||
selfdestruct(owner); | ||
} | ||
} | ||
|
||
contract Fixed3 is Initializable { | ||
address payable owner; | ||
|
||
constructor() { | ||
_disableInitializers(); | ||
} | ||
|
||
function initialize() external initializer { | ||
require(owner == address(0)); | ||
owner = payable(msg.sender); | ||
} | ||
|
||
function kill() external { | ||
require(msg.sender == owner); | ||
selfdestruct(owner); | ||
} | ||
} |
3 changes: 3 additions & 0 deletions
3
tests/detectors/unprotected-upgrade/0.8.15/Fixed.sol.0.8.15.UnprotectedUpgradeable.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
[ | ||
[] | ||
] |
15 changes: 15 additions & 0 deletions
15
tests/detectors/unprotected-upgrade/0.8.15/Initializable.sol
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
contract Initializable { | ||
uint8 private _initialized; | ||
bool private _initializing; | ||
|
||
modifier initializer() { | ||
_; | ||
} | ||
|
||
function _disableInitializers() internal virtual { | ||
require(!_initializing, "Initializable: contract is initializing"); | ||
if (_initialized < type(uint8).max) { | ||
_initialized = type(uint8).max; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
contract OnlyProxy { | ||
modifier onlyProxy() { | ||
_; | ||
} | ||
} |
15 changes: 15 additions & 0 deletions
15
tests/detectors/unprotected-upgrade/0.8.15/whitelisted.sol
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
import "./Initializable.sol"; | ||
import "./OnlyProxy.sol"; | ||
|
||
contract Whitelisted is Initializable, OnlyProxy{ | ||
address payable owner; | ||
|
||
function initialize() external initializer onlyProxy { | ||
owner = payable(msg.sender); | ||
} | ||
|
||
function kill() external { | ||
require(msg.sender == owner); | ||
selfdestruct(owner); | ||
} | ||
} |
3 changes: 3 additions & 0 deletions
3
...s/detectors/unprotected-upgrade/0.8.15/whitelisted.sol.0.8.15.UnprotectedUpgradeable.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
[ | ||
[] | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters