vyper performs double eval of the slice start/length args in certain cases
Summary
Using the slice builtin can result in a double eval vulnerability when the buffer argument is either msg.data, self.code or <address>.code and either the start or length arguments have side-effects.
A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since 0.3.4 since the unique symbol fence was introduced (https://github.com/vyperlang/vyper/pull/2914).
Details
It can be seen that the _build_adhoc_slice_node function of the slice builtin doesn't cache the mentioned arguments to the stack: https://github.com/vyperlang/vyper/blob/4595938734d9988f8e46e8df38049ae0559abedb/vyper/builtins/functions.py#L244
As such, they can be evaluated multiple times (instead of retrieving the value from the stack).
PoC
with Vyper version 0.3.3+commit.48e326f the call to foo passes the asserts:
l: DynArray[uint256, 10]
@external
def foo(cs: String[64]) -> uint256:
for i in range(10):
self.l.append(1)
assert len(self.l) == 10
s: Bytes[64] = b""
s = slice(msg.data, self.l.pop(), 3)
assert len(self.l) == 10 - 2
return len(self.l)
Patches
Patched in https://github.com/vyperlang/vyper/pull/3976.
Impact
No vulnerable production contracts were found.
Affected software
Click a technology to see all vulnerabilities affecting it.
| Platform | Package | Vulnerable versions | Fixed in |
|---|---|---|---|
| Python (PyPI) | vyper | < 0.4.0 | 0.4.0 |
References
- https://github.com/vyperlang/vyper/security/advisories/GHSA-r56x-j438-vw5m
- https://github.com/advisories/GHSA-r56x-j438-vw5m
- https://nvd.nist.gov/vuln/detail/CVE-2024-32646
- https://github.com/vyperlang/vyper/pull/2914
- https://github.com/pypa/advisory-database/tree/main/vulns/vyper/PYSEC-2024-207.yaml
- https://github.com/vyperlang/vyper
- CVSS vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N- Weakness (CWE)
CWE-20- Platform
- Python (PyPI)
- Package
vyper- Disclosed
- 25.04.2024
- Updated
- 11.10.2026 12:20
Sources and licenses
OSV / GitHub Advisory Database - PYSEC-2024-207 - PyPA Advisory Database; CC BY 4.0
OSV / GitHub Advisory Database - GHSA-r56x-j438-vw5m - CC BY 4.0
Vulnerability history: vyper
All published vulnerabilities of this package (Python (PyPI)), newest first. Shows whether this is a one-off slip or a package that needs watching.
- Total entries
- 47
- First → latest
- 03.2020 10.2026
- Without a fix
- 5
- Exploited in attacks
- 0
Severity breakdown
- Critical 3
- High 14
- Medium 20
- Low 10
Disclosures per year
- 2020: 1
- 2021: 5
- 2022: 4
- 2023: 14
- 2024: 14
- 2025: 6
- 2026: 3
-
vyper performs double eval of the slice start/length args in certain cases this entry
Know which vulnerabilities affect your application
With the DockRay integration and software inventory enabled, DockRay checks reported component versions against known vulnerabilities and notifies you about confirmed matches. Coverage depends on the supported technology and available advisory data.