CVE-2020-37286
MediumCVSS 6.5Summary
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 appear inside tuples or nested calls. Contracts using such calls as tuple elements, call arguments, or builtin arguments like concat or ecrecover can return corrupted values or pass wrong arguments to external calls.
Risk Assessment
Corrupted values and wrong arguments can lead to incorrect contract behavior, including faulty cryptographic operations and transfers. Organizations using Vyper with nested calls are exposed to integrity errors and potential losses.
Recommendation
Upgrade the Vyper compiler to version 0.3.0 or later and redeploy affected contracts. Re-audit contracts using internal calls inside tuples and builtin arguments.
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-37288Low
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.
Original NVD description (English source)
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 appear inside tuples or nested calls. Contracts using such calls as tuple elements, call arguments, or builtin arguments like concat or ecrecover can return corrupted values or pass wrong arguments to external calls.
Vulnerability data from NVD (NIST) · CISA KEV · EPSS

