CVE-2020-37288
LowCVSS 3.7Summary
Vyper from 0.1.0b10 before 0.2.3 generates incorrect code for a return statement inside a for loop in an internal function called two or more internal calls deep, producing an invalid jump destination (stack underflow). Affected contracts revert such calls unnecessarily, which in limited circumstances could enable denial of service against public contracts.
Risk Assessment
This may cause unexpected reverts of transactions in smart contracts and, in limited circumstances, allow an attacker to cause denial of service against public contracts.
Recommendation
Upgrade the Vyper compiler to version 0.2.3 or later and recompile and redeploy affected contracts.
Other vulnerabilities in Vyper
See all- CVE-2026-114118Medium
In Vyper 0.3.4 through 0.5.0b1, create_from_blueprint computes the remaining blueprint size via uint256 subtraction without checking that code_offset is below the code size. A huge offset can wrap to a small positive value.
- CVE-2026-114117Medium
Vyper 0.3.8 through 0.5.0b1 contains an optimizer miscompilation where (msg.value | K) or (len(msg.data) | K) with nonzero K compiles to constant 1 in a ternary branch under -O gas or -O codesize. Affected contracts use the wrong value without warning.
- CVE-2026-114116Medium
Vyper 0.1.0b1 before 0.1.0b17 and 0.4.1 through 0.5.0b1 builds its source-line table with str.splitlines(), which treats characters like form feed and U+2028 as line breaks ignored by the Python parser, causing numeric literals to be classified from shifted source text.
- CVE-2026-114115Low
Vyper 0.3.8 through 0.5.0b1 contains a compiler miscompilation vulnerability in parse_IfExp that reads nested arrays with narrower inner bounds using the wider result type's memory layout. When a ternary selects the narrower array, inner arrays after the first are read at wrong offsets, causing contracts to silently store corrupted values or revert.
- CVE-2026-114114Medium
Vyper 0.1.0b1 before 0.1.0b12, 0.1.0b14, and 0.4.1 through 0.5.0b1 mix character-based line offsets with Python's UTF-8 byte col_offset values in vyper/ast/parse.py, so multi-byte characters shift source slices used to reconstruct later numeric literals.
- CVE-2021-48020Medium
Vyper from 0.1.0b4 before 0.3.0 contains a memory corruption vulnerability caused by an incorrect stack tip pointer when internal function calls are performed inside arrays. Contracts placing internal calls in nested array elements, external call arguments, struct literals, or raw_log topics can have memory corrupted, producing incorrect contract behavior.
- CVE-2021-48019Medium
Vyper before 0.2.9 deploys forwarder proxies through the built-in create_forwarder_to function that report a fixed 4096-byte RETURNDATASIZE rather than the actual return data size. Calls through these proxies can yield corrupted data when a function returns more than 4096 bytes without return data sanitation, and fail strict return-size checks such as SafeERC20.safeTransfer.
- CVE-2021-48018High
Vyper from 0.2.13 before 0.2.15 allocates storage slots for @nonreentrant reentrancy locks at the same locations as contract storage variables. When a function using @nonreentrant is called, setting the lock overwrites the overlapping storage variable, corrupting contract state and breaking the contract's intended logic.
- CVE-2020-37289Low
Vyper before 0.3.1 lacks a uint8 type, allowing interface return values declared as uint8, such as ERC20.decimals(), to be stored in uint256 variables without bounds checking. Malicious contracts can return values greater than 255 to manipulate or bypass contract logic that relies on these values.
- CVE-2020-37287Medium
Vyper before 0.2.6 contains a call stack corruption vulnerability that causes incorrect function outputs when complex types with non-base members are passed as arguments. Contracts passing multi-dimensional arrays or structs to internal or external functions receive corrupted values because the compiler assumed each subtype size is 32.
Original NVD description (English source)
Vyper from 0.1.0b10 before 0.2.3 generates incorrect code for a return statement inside a for loop in an internal function called two or more internal calls deep, producing an invalid jump destination (stack underflow). Affected contracts revert such calls unnecessarily, which in limited circumstances could enable denial of service against public contracts.
Vulnerability data from NVD (NIST) · CISA KEV · EPSS

