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.
{
"cna_assigner": "GitHub_M",
"cwe_ids": [
"CWE-681"
],
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2024/32xxx/CVE-2024-32481.json"
}{
"extracted_events": [
{
"cpe": "cpe:2.3:a:vyperlang:vyper:*:*:*:*:*:python:*:*",
"range": [
{
"introduced": "0.3.8"
},
{
"last_affected": "0.3.10"
}
],
"source": "CPE_RANGE"
},
{
"cpe": "cpe:2.3:a:vyperlang:vyper:0.4.0:-:*:*:*:python:*:*",
"range": [
{
"introduced": "0.4.0-NA"
},
{
"last_affected": "0.4.0-NA"
}
],
"source": "CPE_STRING"
},
{
"range": [
{
"fixed": "3de1415ee77a9244eb04bdb695e249d3ec9ed868"
}
],
"source": "REFERENCES_COMMIT"
},
{
"range": [
{
"fixed": "5319cfbe14951e007ccdb323257e5ada869b35d5"
}
],
"source": "REFERENCES_COMMIT"
}
]
}