Description
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.
Analysis and contextual insights are available on OpenCVE Cloud.
Remediation
No vendor fix or workaround currently provided.
Additional remediation guidance may be available on OpenCVE Cloud.
Tracking
Sign in to view the affected projects.
Advisories
| Source | ID | Title |
|---|---|---|
EUVD |
EUVD-2024-1269 | 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. |
Github GHSA |
GHSA-ppx5-q359-pvwj | vyper's range(start, start + N) reverts for negative numbers |
References
History
Mon, 05 May 2025 18:00:00 +0000
| Type | Values Removed | Values Added |
|---|---|---|
| First Time appeared |
Vyperlang
Vyperlang vyper |
|
| CPEs | cpe:2.3:a:vyperlang:vyper:*:*:*:*:*:python:*:* cpe:2.3:a:vyperlang:vyper:0.4.0:-:*:*:*:python:*:* |
|
| Vendors & Products |
Vyperlang
Vyperlang vyper |
Status: PUBLISHED
Assigner: GitHub_M
Published:
Updated: 2024-08-02T02:13:39.300Z
Reserved: 2024-04-12T19:41:51.168Z
Link: CVE-2024-32481
Updated: 2024-08-02T02:13:39.300Z
Status : Analyzed
Published: 2024-04-25T17:15:50.273
Modified: 2025-05-05T17:31:53.233
Link: CVE-2024-32481
No data.
OpenCVE Enrichment
No data.
Weaknesses
EUVD
Github GHSA