CVE-2024-32481 json
vyper's range(start, start + N) reverts for negative numbers
published 2024-04-25 2 y ago modified 2026-06-17 4 mo ago also EUVD-2024-1269 , GHSA-ppx5-q359-pvwj , PYSEC-2024-246
- cvss
- 5.3
- version 3.1, CNA
- cisa kev
- Not listed
- not in CISA's catalog
- epss
- 0.8%
- EPSS 0.8% chance of exploitation in 30 days, percentile 56%
- public exploits
- 0
- none known
Summary
Vyper is a pythonic Smart Contract Language for the Ethereum virtual machine. Starting in version 0.3.8 and prior to version 0.4.0b1, when looping over a `range` of the form `range(start, start + N)`, if `start` is negative, the execution will always revert. This issue is caused by an incorrect assertion inserted by the code generation of the range `stmt.parse_For_range()`. The issue arises when `start` is signed, instead of using `sle`, `le` is used and `start` is interpreted as an unsigned integer for the comparison. If it is a negative number, its 255th bit is set to `1` and is hence interpreted as a very large unsigned integer making the assertion always fail. Any contract having a `range(start, start + N)` where `start` is a signed integer with the possibility for `start` to be negative is affected. If a call goes through the loop while supplying a negative `start` the execution will revert. Version 0.4.0b1 fixes the issue.
Patch / fix
- pypi vyper 0.4.0, 0.4.0b1
- vyperlang vyper 0.4.0b1
CISA SSVC
- Exploitation
- Proof of concept is public
- Automatable
- yes
- Technical impact
- partial
- Assessed
- 2 y ago
Exploit prediction
0.79% chance of exploitation in the next 30 days, higher than 56% of all scored CVEs (FIRST EPSS, 2026-11-08).
Exploits and checks
- github.com https://github.com/vyperlang/vyper/security/advisories/GHSA-ppx5-q359-pvwj referenced PoC, tagged "exploit" by a source, unverified
CVSS scores
| assigned by | version | score | vector |
|---|---|---|---|
| CNA | 3.1 | 5.3 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N |
| GitHub | 3.1 | 5.3 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N |
| NVD | 3.1 | 5.3 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N |
| OSV | 3.1 | 5.3 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N |
Affected packages
| ecosystem | package | affected | fixed in |
|---|---|---|---|
| pypi | vyper | >=0.3.8, <0.4.0 >=0.3.8, <0.4.0b1 |
0.4.0 0.4.0b1 |
Affected products
- vyperlang vyper
Classification
- Weakness
-
- CWE-681 Incorrect Conversion between Numeric Types
References
-
github.com
/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868
web, patch
-
github.com
/vyperlang/vyper/commit/5319cfbe14951e007ccdb323257e5ada869b35d5
web, patch
-
github.com
/vyperlang/vyper/security/advisories/GHSA-ppx5-q359-pvwj
web, exploit, vendor-advisory, advisory, evidence
-
github.com
/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287
web, product
-
nvd.nist.gov
/vuln/detail/CVE-2024-32481
advisory
-
github.com
/vyperlang/vyper
package
-
github.com
/advisories/GHSA-ppx5-q359-pvwj
advisory
Sources
- CVE List CVE-2024-32481
- GitHub Advisory GHSA-ppx5-q359-pvwj
- NVD CVE-2024-32481
- OSV PYSEC-2024-246
Fencer Vulns keeps one entry per vulnerability: the CVE id wins, then GHSA, and records that alias each other are merged, except that two CVEs always keep separate entries. The same data is available as JSON.
CPEs and fixed versions use Anchore's correction of NVD's data: Added CPE configurations because not yet analyzed by NVD.