COMPILER SECURITY
Vyper has published 54 security advisories in the GitHub security advisories of the vyperlang/vyper repository. Each one names the compiler range that it affects. 47 of them give a patched version for each range. 7 of them have at least one range with no patched version as of 2026-10-20. That mapping matters when you verify a deployed contract: Etherscan records the compiler version a contract was built with, and this page tells you which published bugs that build carries. The sibling page covers Solidity compiler bugs by version.
On this page Version lookup Severity and the one critical All versions All advisories Method and limits
Type a Vyper stable release, for example 0.3.10. You can also paste the Etherscan form, for example vyper:0.3.10. The lookup recomputes the affected advisory set from the embedded data on your device; nothing is sent anywhere.
In the ratings of the vyperlang/vyper repository advisories, exactly one advisory is critical: GHSA-5824-cm3x-3c38 (CVE-2023-39363), "Incorrectly allocated named re-entrancy locks", published 2023-08-05. It affects Vyper 0.2.15 through 0.3.0 and was fixed in the 0.3.1 release. On 30 July 2023 attackers used this bug to drain several Curve.Fi liquidity pools (Vyper post-mortem). The advisory says that a contract is at risk only when a function with a named lock makes an external call before it updates storage, and a second function uses the same key.
Severity source. Every severity label and count on this page, in the lookup and in the tables, is the rating in the vyperlang/vyper repository advisories. Other databases rate many of the same bugs differently. On 2026-10-20 the GitHub Advisory Database (the reviewed records that Dependabot uses) listed 47 of the 54 advisories, rated 3 of them critical (GHSA-5824-cm3x-3c38, GHSA-52xq-j7v9-v4v2 and GHSA-9x7f-gwxq-6f2c), and gave a different rating than the repository for 20 of the 47. NVD shows a CVSS 3.1 base score of 9.8 CRITICAL for CVE-2024-24561 and CVE-2024-24563, which the repository rates high and medium. Check the advisory and the CVE record before you rank the risk of a bug.
Etherscan shows the compiler of a verified Vyper contract in the form vyper:0.2.15. Paste that into the lookup. The result for 0.2.15 is 38 known published advisories (repository ratings: 1 critical, 6 high, 15 medium, 16 low), and the critical one is GHSA-5824-cm3x-3c38. The Vyper post-mortem says: "All Vyper contracts that have been compiled with versions v0.2.15, v0.2.16, and v0.3.0 are vulnerable to the malfunctioning re-entrancy guard". A listed advisory does not prove that a contract is exploitable. Read each advisory and check whether the contract uses the affected feature, as the critical example above shows.
Source: GitHub security advisories of the vyperlang/vyper repository, fetched 2026-10-20; release list from PyPI. Counts recomputed independently, see method.
6 of the 31 stable releases are yanked on PyPI: 0.2.6, 0.2.9, 0.2.10, 0.2.13, 0.2.14 and 0.3.5. They stay in the table because contracts compiled with them can still exist.
| Version | Advisories | High+ | Med | Low |
|---|---|---|---|---|
| 0.4.3 (latest) | 7 | 0 | 4 | 3 |
| 0.4.2 | 7 | 0 | 4 | 3 |
| 0.4.1 | 9 | 0 | 4 | 5 |
| 0.4.0 | 11 | 0 | 6 | 5 |
| 0.3.10 | 23 | 2 | 7 | 14 |
| 0.3.9 | 28 | 2 | 10 | 16 |
| 0.3.8 | 28 | 2 | 10 | 16 |
| 0.3.7 | 32 | 5 | 11 | 16 |
| 0.3.6 | 32 | 5 | 11 | 16 |
| 0.3.5 | 32 | 5 | 11 | 16 |
| 0.3.4 | 32 | 5 | 11 | 16 |
| 0.3.3 | 31 | 5 | 11 | 15 |
| 0.3.2 | 31 | 5 | 11 | 15 |
| 0.3.1 | 33 | 6 | 13 | 14 |
| 0.3.0 | 34 | 7 | 12 | 15 |
| 0.2.16 | 38 | 7 | 15 | 16 |
| 0.2.15 | 38 | 7 | 15 | 16 |
| 0.2.14 | 38 | 7 | 15 | 16 |
| 0.2.13 | 38 | 7 | 15 | 16 |
| 0.2.12 | 37 | 6 | 15 | 16 |
| 0.2.11 | 37 | 6 | 15 | 16 |
| 0.2.10 | 37 | 6 | 15 | 16 |
| 0.2.9 | 37 | 6 | 15 | 16 |
| 0.2.8 | 37 | 6 | 14 | 17 |
| 0.2.7 | 37 | 6 | 14 | 17 |
| 0.2.6 | 37 | 6 | 14 | 17 |
| 0.2.5 | 38 | 6 | 15 | 17 |
| 0.2.4 | 38 | 6 | 15 | 17 |
| 0.2.3 | 38 | 6 | 15 | 17 |
| 0.2.2 | 39 | 6 | 15 | 18 |
| 0.2.1 | 39 | 6 | 15 | 18 |
An advisory counts for a line when its range contains at least one stable release of that line. One advisory can count for more than one line.
| Line | Advisories | Critical | High | Medium | Low |
|---|---|---|---|---|---|
| 0.4.x | 13 | 0 | 0 | 6 | 7 |
| 0.3.x | 42 | 1 | 6 | 16 | 19 |
| 0.2.x | 42 | 1 | 7 | 16 | 18 |
Pre-releases. PyPI lists four 0.5.0 pre-releases: 0.5.0a1, 0.5.0a2, 0.5.0a3 and 0.5.0b1. Each one is in the range of 7 advisories (4 medium, 3 low). None of these 7 advisories has a patched version for the range that contains these pre-releases, as of 2026-10-20. The lookup accepts stable releases only.
| ID | CVE | Repo severity | Published | Summary | Affected | Fixed in |
|---|---|---|---|---|---|---|
| GHSA-2489-32vh-8rrc | - | medium | 2026-10-07 | Function variables can replace imported constant values and default arguments | >= 0.4.0b1 | unfixed as of 2026-10-20 |
| GHSA-r3c7-7xwm-6vfw | - | low | 2026-10-06 | Multi-byte identifier characters can silently change literal values | >= 0.1.0b1, < 0.1.0b12, = 0.1.0b14, >= 0.4.1 | 0.1.0b12, 0.1.0b15; unfixed as of 2026-10-20 |
| GHSA-wvx7-39qj-2g9v | - | low | 2026-10-06 | Line-separator characters can silently change literal values and types | >= 0.1.0b1, < 0.1.0b17, >= 0.4.1 | 0.1.0b17; unfixed as of 2026-10-20 |
| GHSA-fxg7-4wqg-c8gh | - | low | 2026-10-06 | `create_from_blueprint` offset validation bypass through unsigned wraparound | >= 0.3.4 | unfixed as of 2026-10-20 |
| GHSA-cw3h-xwxq-8cx2 | - | medium | 2026-10-05 | Ternary expressions misread nested arrays with different inner bounds | >= 0.3.8, <= 0.5.0b1 | unfixed as of 2026-10-20 |
| GHSA-6j9c-gvcw-74fj | - | medium | 2026-10-02 | Optimizer replaces `msg.value | K` and `len(msg.data) | K`with `1` in ternary branches | >= 0.3.8 | unfixed as of 2026-10-20 |
| GHSA-3vcg-j39x-cwfm | CVE-2025-47774 | low | 2025-05-15 | `slice()` may elide side-effects when output length is 0 | < 0.4.2 | 0.4.2 |
| GHSA-qhr6-mgqr-mchm | CVE-2025-47285 | low | 2025-05-15 | `concat()` builtin may elide side-effects for zero-length arguments | < 0.4.2 | 0.4.2 |
| GHSA-h33q-mhmp-8p67 | CVE-2025-27104 | low | 2025-02-21 | multiple eval in For List Iter | < 0.4.1 | 0.4.1 |
| GHSA-4w26-8p97-f4jp | CVE-2025-27105 | medium | 2025-02-21 | AugAssign evaluation order causing OOB write within the object | < 0.4.1 | 0.4.1 |
| GHSA-2p94-8669-xg86 | CVE-2025-26622 | low | 2025-02-21 | sqrt doesn't define rounding behavior | < 0.4.1 | 0.4.1 |
| GHSA-vgf2-gvx8-xwc3 | CVE-2025-21607 | medium | 2025-01-14 | Success of Certain Precompile Calls not Checked | < 0.4.1 | 0.4.1 |
| GHSA-r56x-j438-vw5m | CVE-2024-32646 | low | 2024-04-25 | double eval of the slice start/length args in certain cases | < 0.4.0 | 0.4.0 |
| GHSA-5jrj-52x8-m64h | CVE-2024-32649 | low | 2024-04-25 | multiple eval of `sqrt()` argument built in | < 0.4.0 | 0.4.0 |
| GHSA-3whq-64q2-qfj6 | CVE-2024-32647 | low | 2024-04-25 | double eval of raw_args in create_from_blueprint | < 0.4.0 | 0.4.0 |
| GHSA-m2v9-w374-5hj9 | CVE-2024-32648 | low | 2024-04-25 | default functions don't respect nonreentrancy keys | < 0.3.0 | 0.3.0 |
| GHSA-xchq-w5r3-4wg3 | CVE-2024-32645 | low | 2024-04-25 | incorrect topic logging in raw_log | < 0.4.0 | 0.4.0 |
| GHSA-ppx5-q359-pvwj | CVE-2024-32481 | low | 2024-04-25 | range(start, start + N) reverts for negative numbers | >= 0.3.8, < 0.4.0 | 0.4.0 |
| GHSA-9p8r-4xp4-gw5w | CVE-2024-26149 | low | 2024-02-26 | _abi_decode Memory Overflow | < 0.4.0 | 0.4.0 |
| GHSA-4hwq-4cpm-8vmx | CVE-2024-24564 | low | 2024-02-26 | extract32 can read dirty memory | < 0.4.0 | 0.4.0 |
| GHSA-52xq-j7v9-v4v2 | CVE-2024-24563 | medium | 2024-02-07 | negative array index bounds checks | < 0.4.0 | 0.4.0 |
| GHSA-6845-xw22-ffxv | CVE-2024-24559 | low | 2024-02-05 | sha3 codegen bug | < 0.4.0 | 0.4.0 |
| GHSA-gp3w-2v2m-p686 | CVE-2024-24560 | low | 2024-02-02 | External calls can overflow return data to return input buffer | < 0.4.0 | 0.4.0 |
| GHSA-9x7f-gwxq-6f2c | CVE-2024-24561 | high | 2024-01-31 | Bounds check on built-in `slice()` function can be overflowed | < 0.4.0 | 0.4.0 |
| GHSA-x2c2-q32w-4w6m | CVE-2024-24567 | medium | 2024-01-30 | raw_call `value=` kwargs not disabled for static and delegate calls | < 0.4.0 | 0.4.0 |
| GHSA-2q8v-3gqq-4f8p | CVE-2024-22419 | high | 2024-01-18 | concat built-in can corrupt memory | >= 0.3.0, < 0.4.0b1 | 0.4.0b1 |
| GHSA-6m97-7527-mh74 | CVE-2023-46247 | high | 2023-12-12 | incorrect storage layout for contracts containing large arrays | < 0.3.8 | 0.3.8 |
| GHSA-cx2q-hfxr-rj97 | CVE-2023-42460 | medium | 2023-09-26 | _abi_decode input not validated in certain complex expressions | >= 0.3.4, < 0.3.10 | 0.3.10 |
| GHSA-c647-pxm2-c52w | CVE-2023-42443 | low | 2023-09-18 | memory corruption in certain builtins utilizing `msize` | >= 0.3.4, < 0.3.10 | 0.3.10 |
| GHSA-3hg2-r75x-g69m | CVE-2023-42441 | medium | 2023-09-15 | incorrect re-entrancy lock when key is empty string | >= 0.2.9, < 0.3.10 | 0.3.10 |
| GHSA-4hg4-9mf5-wxxq | CVE-2023-41052 | low | 2023-09-02 | incorrect order of evaluation of side effects for some builtins | < 0.3.10 | 0.3.10 |
| GHSA-g2xh-c426-v8mf | CVE-2023-40015 | medium | 2023-09-02 | reversed order of side effects for some operations | >= 0 | unfixed as of 2026-10-20 |
| GHSA-5824-cm3x-3c38 | CVE-2023-39363 | critical | 2023-08-05 | Incorrectly allocated named re-entrancy locks | >= 0.2.15, < 0.3.1 | 0.3.1 |
| GHSA-f5x6-7qgp-jhf3 | CVE-2023-37902 | medium | 2023-07-25 | ecrecover can return stale memory data for invalid signatures (paraphrase of the GitHub title) | < 0.3.10 | 0.3.10 |
| GHSA-vxmm-cwh2-q762 | CVE-2023-32675 | low | 2023-05-19 | nonpayable default functions can sometimes be sent ether with calldatasize<4 | < 0.3.8 | 0.3.8 |
| GHSA-ph9x-4vc9-m39g | CVE-2023-32059 | high | 2023-05-11 | incorrect ordering of default arguments passed to internal calls | < 0.3.8 | 0.3.8 |
| GHSA-6r8q-pfpv-7cgj | CVE-2023-32058 | medium | 2023-05-11 | Integer overflow for loops of form `for i in range(x, x+N)` | < 0.3.8 | 0.3.8 |
| GHSA-3p37-3636-q8wv | CVE-2023-31146 | high | 2023-05-11 | OOB DynArray access when array is on both LHS and RHS of an assignment | < 0.3.8 | 0.3.8 |
| GHSA-mgv8-gggw-mrg6 | CVE-2023-30837 | medium | 2023-05-05 | Storage allocator overflow | < 0.3.8 | 0.3.8 |
| GHSA-w9g2-3w7p-72g9 | CVE-2023-30629 | medium | 2023-04-24 | raw_call with outsize=0 and revert_on_failure=False returns incorrect success value | >= 0.3.1, < 0.3.8 | 0.3.8 |
| GHSA-4v9q-cgpw-cf38 | CVE-2022-29255 | medium | 2022-06-06 | multiple evaluation of contract address in call | < 0.3.4 | 0.3.4 |
| GHSA-42j8-8cjv-j5r9 | CVE-2022-29175 | low | 2022-05-05 | safemath for decimals do not check for 256-bit overflow (the linked CVE-2022-29175 was rejected by CVE.org as not a security issue) | >= 0.3.2, < 0.3.4 | 0.3.4 |
| GHSA-j2x6-9323-fp7h | CVE-2022-24845 | high | 2022-04-13 | external calls are not clamped in certain complex expressions | < 0.3.2 | 0.3.2 |
| GHSA-4mrx-6fxm-8jpg | CVE-2022-24788 | medium | 2022-04-13 | No bytes clamps for interfaces imported via JSON | < 0.3.2 | 0.3.2 |
| GHSA-7vrm-3jc8-5wwm | CVE-2022-24787 | medium | 2022-04-02 | bytestring equality incorrect for Bytes[N<=32] | < 0.3.2 | 0.3.2 |
| GHSA-xv8x-pr4h-73jv | CVE-2021-41121 | high | 2021-10-06 | Memory corruption when returning a literal struct with a private call inside of it | < 0.3.0 | 0.3.0 |
| GHSA-c7pr-343r-5c46 | CVE-2021-41122 | medium | 2021-10-05 | missing clamps for decimal args in external functions | < 0.3.0 | 0.3.0 |
| GHSA-7f92-rr6w-cq64 | - | high | 2021-07-27 | VVE-2021-0003: Storage variables overwritten by re-entrancy locks | >= 0.2.13, < 0.2.15 | 0.2.15 |
| GHSA-22wc-c9wj-6q2v | - | medium | 2021-04-16 | Memory corruption using function calls within arrays | >= 0.1.0b4, < 0.3.0 | 0.3.0 |
| GHSA-375m-5fvv-xq23 | - | low | 2021-04-16 | VVE-2021-0002: Incorrect `returndatasize` when using simple forwarder proxies deployed prior to EIP-1167 adoption | < 0.2.9 | 0.2.9 |
| GHSA-2r3x-4mrv-mcxf | - | medium | 2020-10-10 | Memory corruption using function calls within tuples / nested calls | >= 0.1.0b4, < 0.3.0 | 0.3.0 |
| GHSA-4v7v-gqf9-ww2g | - | medium | 2020-10-10 | VVE-2020-0003: Call stack corruption when passing complex type containing non-base type members as argument | < 0.2.6 | 0.2.6 |
| GHSA-vg88-3v92-rjx2 | - | low | 2020-07-16 | VVE-2020-0002: Return inside for loop more than 1 level deep | >= 0.1.0b10, < 0.2.3 | 0.2.3 |
| GHSA-mr6r-mvw4-736g | - | low | 2020-03-09 | VVE-2020-0001: Interfaces returning integer types less than 256 bits can be manipulated if uint256 is used | < 0.3.1 | 0.3.1 |
The advisory numbers on this page come from the GitHub security advisories of vyperlang/vyper (54 advisories, fetched 2026-10-20; links point to the repository advisory pages, 7 of the 54 are repository-level advisories not mirrored in GitHub’s global advisory database, including one attached to a withdrawn CVE), cross-checked against the PyPI release list (31 stable releases). A version is counted as affected when it falls inside an advisory's published range, so every count can be recomputed from the GitHub and PyPI data linked here.
Limits worth stating honestly. The advisory database lists published, catalogued bugs; it is not a census of every compiler defect. The tables and the lookup show stable releases only. The 0.5.0 pre-releases are in the note above the advisory table. Ranges marked >= 0.3.8 with no upper bound mean "unfixed as of the fetch date". Severity ratings are the repository publisher's, not mine, and other databases rate many advisories differently (see the severity source note). As of 2026-10-20 each stable release, including 0.4.3, is in the range of at least 7 advisories. A count on this page is not a guarantee about a contract.