Skip to content

Vyper's `extract32` can ready dirty memory

Low severity GitHub Reviewed Published Feb 26, 2024 in vyperlang/vyper • Updated Feb 26, 2024

Package

pip vyper (pip)

Affected versions

<= 0.3.10

Patched versions

None

Description

Summary

When using the built-in extract32(b, start), if the start index provided has for side effect to update b, the byte array to extract 32 bytes from, it could be that some dirty memory is read and returned by extract32.

Details

Before evaluating start, the function Extract32.build_IR caches only:

but do not cache the actual content of b. This means that if the evaluation of start changes b's content and length, an outdated length will be used with the new content when extracting 32 bytes from b.

PoC

Calling the function foo of the following contract returns b'uuuuuuuuuuuuuuuuuuuuuuuuuuu\x00\x00789' meaning that extract32 accessed some dirty memory.

var:Bytes[96]

@internal
def bar() -> uint256:
    self.var = b'uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu'
    self.var = b''
    return 3

@external
def foo() -> bytes32:
    self.var = b'abcdefghijklmnopqrstuvwxyz123456789'
    return extract32(self.var, self.bar(), output_type=bytes32)
    # returns b'uuuuuuuuuuuuuuuuuuuuuuuuuuu\x00\x00789'

Impact

For contracts that are affected, it means that calling extract32 returns dirty memory bytes instead of some expected output.

References

@charles-cooper charles-cooper published to vyperlang/vyper Feb 26, 2024
Published to the GitHub Advisory Database Feb 26, 2024
Reviewed Feb 26, 2024
Published by the National Vulnerability Database Feb 26, 2024
Last updated Feb 26, 2024

Severity

Low
3.7
/ 10

CVSS base metrics

Attack vector
Network
Attack complexity
High
Privileges required
None
User interaction
None
Scope
Unchanged
Confidentiality
Low
Integrity
None
Availability
None
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N

Weaknesses

CVE ID

CVE-2024-24564

GHSA ID

GHSA-4hwq-4cpm-8vmx

Source code

Credits

Checking history
See something to contribute? Suggest improvements for this vulnerability.