vyper
Pythonic Smart Contract Language for the EVM
Activity
- Latest release
- 1w ago
- Total releases
- 78
- Cadence
- ~16 days
- Last 12 months
- 4
Reach
- Stars
- 5.2k
Details
- License
- Apache-2.0
- First release
- Aug 22, 2018
| Version | Released | |
|---|---|---|
0.5.0b1
pre
| ||
0.5.0a3
pre
| ||
0.5.0a2
pre
| ||
0.5.0a1
pre
| ||
0.4.3
patch
| ||
0.4.3rc1
pre
| ||
0.4.2
patch
| ||
0.4.2rc1
pre
2 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev | ||
0.4.1
patch
2 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev | ||
0.4.1rc3
pre
6 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev | ||
0.4.1rc2
pre
6 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev | ||
0.4.1rc1
pre
6 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev | ||
0.4.1b4
pre
6 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev | ||
0.4.1b3
pre
6 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev | ||
0.4.1b2
pre
6 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev | ||
0.4.1b1
pre
6 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev | ||
0.4.0
minor
6 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev | ||
0.4.0rc6
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.4.0rc5
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.4.0rc4
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.4.0rc3
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.4.0rc2
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.4.0rc1
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.4.0b6
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.4.0b5
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.4.0b4
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.4.0b3
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.4.0b2
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.4.0b1
pre
16 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.10
patch
19 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.10rc5
pre
22 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.10rc4
pre
22 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.10rc3
pre
22 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.10rc2
pre
22 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.10rc1
pre
22 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.9
patch
24 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.8
patch
25 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32481
GHSA-ppx5-q359-pvwj
PYSEC-2024-246
Apr 25, 2024
vyper's range(start, start + N) reverts for negative numbers
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryWhen looping over a DetailsThis issue is caused by an incorrect assertion inserted by the code generation of the range ( https://github.com/vyperlang/vyper/blob/9136169468f317a53b4e7448389aa315f90b95ba/vyper/codegen/stmt.py#L286-L287 This assertion was introduced in https://github.com/vyperlang/vyper/commit/3de1415ee77a9244eb04bdb695e249d3ec9ed868 to fix https://github.com/advisories/GHSA-6r8q-pfpv-7cgj. The issue arises when PoC
Patchespatched in v0.4.0, specifically, https://github.com/vyperlang/vyper/pull/3679 disallows this form of ImpactAny contract having a Affected versions
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
+ 8 more Show less
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.7
patch
31 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.6
patch
31 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.5
patch
31 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.4
patch
31 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.3
patch
30 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.2
patch
30 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.1
patch
33 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.3.0
minor
33 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.2.16
patch
35 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32648
GHSA-m2v9-w374-5hj9
PYSEC-2024-163
Apr 25, 2024
vyper default functions don't respect nonreentrancy keys
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryPrior to v0.3.0, A contract search was additionally performed and no vulnerable contracts were found in production. PoC
after codegen:
ImpactNo vulnerable production contracts were found. Additionally, using a lock on a Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 21 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
Fixed in
0.3.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.2.15
patch
35 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32648
GHSA-m2v9-w374-5hj9
PYSEC-2024-163
Apr 25, 2024
vyper default functions don't respect nonreentrancy keys
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryPrior to v0.3.0, A contract search was additionally performed and no vulnerable contracts were found in production. PoC
after codegen:
ImpactNo vulnerable production contracts were found. Additionally, using a lock on a Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 21 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
Fixed in
0.3.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.2.14
patch
35 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32648
GHSA-m2v9-w374-5hj9
PYSEC-2024-163
Apr 25, 2024
vyper default functions don't respect nonreentrancy keys
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryPrior to v0.3.0, A contract search was additionally performed and no vulnerable contracts were found in production. PoC
after codegen:
ImpactNo vulnerable production contracts were found. Additionally, using a lock on a Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 21 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
Fixed in
0.3.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.2.13
patch
35 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32648
GHSA-m2v9-w374-5hj9
PYSEC-2024-163
Apr 25, 2024
vyper default functions don't respect nonreentrancy keys
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryPrior to v0.3.0, A contract search was additionally performed and no vulnerable contracts were found in production. PoC
after codegen:
ImpactNo vulnerable production contracts were found. Additionally, using a lock on a Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 21 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
Fixed in
0.3.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
| ||
0.2.12
patch
34 CVEs
CVE-2025-47774
PYSEC-2026-2028
GHSA-3vcg-j39x-cwfm
Jul 07, 2026
Vyper's `slice()` may elide side-effects when output length is 0
Medium
Network
Low
None
None
Impactthe the result is that a 0-length bytestring constructed with slice can be passed to the impact is that side effects in the the following example illustrates how the issue would look in user code
the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code. Patchesthe fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of WorkaroundsIs there a way for users to fix or remediate the vulnerability without upgrading? ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-47285
PYSEC-2026-2029
GHSA-qhr6-mgqr-mchm
Jul 07, 2026
Vyper's `concat()` builtin may elide side-effects for zero-length arguments
Medium
Network
Low
None
None
Impact
in practice, it would be very unusual in user code to construct zero-length bytestrings using an expression with side-effects, since zero-length bytestrings are typically constructed with the empty literal the following example demonstrates how the issue would look in user code
the severity assigned is low, since, as mentioned, this would be a very unusual pattern in user-code. Patchesfix is tracked in https://github.com/vyperlang/vyper/pull/4644 Workaroundsdon't have side effects in expressions which construct zero-length bytestrings. ReferencesAre there any links users can visit to find out more? Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 59 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
0.4.2rc1
References
Updated Jul 07, 2026 · Source: OSV.dev
CVE-2025-27104
GHSA-h33q-mhmp-8p67
PYSEC-2025-30
Feb 21, 2025
Vyper has a double eval in For List Iter
Low
Network
Low
Low
None
Multiple evaluation of a single expression is possible in the iterator target of a for loop. While the iterator expression cannot produce multiple writes, it can consume side effects produced in the loop body (e.g. read a storage variable updated in the loop body) and thus lead to unexpected program behavior. Specifically, reads in iterators which contain an ifexp (e.g. The fix is tracked in https://github.com/vyperlang/vyper/pull/4488. Vulnerability DetailsVyper for loops allow two kinds of iterator targets, namely the During codegen, iterable lists are required to not produce any side-effects (in the following code,
However, this does not prevent the iterator from consuming side effects provided by the body of the loop. For dynamic arrays, the compiler simply panics:
For SArrays on the other hand, Here are three illustrating examples. In the first example, the following test case pre-evaluates the iter list and stores the result to a temporary list in memory. So the list is only evaluated once, before entry into the loop body, and the log output will be 0, 0, 0.
However, in the next two examples, because the iterator target is not a list literal, it will be evaluated in the loop body. In the second example,
In the third example,
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-27105
GHSA-4w26-8p97-f4jp
PYSEC-2025-31
Feb 21, 2025
AugAssign evaluation order causing OOB write within the object in Vyper
Low
Network
Low
Low
None
Vyper handles AugAssign statements by first caching the target location to avoid double evaluation. However, in the case when target is an access to a DynArray and the rhs modifies the array, the cached target will evaluate first, and the bounds check will not be re-evaluated during the write portion of the statement. In other words, the following code
is equivalent to:
rather than:
Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-26622
GHSA-2p94-8669-xg86
PYSEC-2025-29
Feb 21, 2025
Vyper's sqrt doesn't define rounding behavior
Low
Network
High
Low
None
Vyper's the fix is tracked in https://github.com/vyperlang/vyper/pull/4486 Vulnerability DetailsVyper injects the following code to handle calculation of decimal sqrt. x is the input provided by user.
Notably, the terminal condition of the algorithm is either However, for certain inputs, The example snippet here returns 0.9999999999, the rounded up result for sqrt(0.9999999998). This is due to the oscillation ending in N + epsilon instead of N.
Note that Impact DetailsSince Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Apr 09, 2025 · Source: OSV.dev
CVE-2025-21607
PYSEC-2025-33
GHSA-vgf2-gvx8-xwc3
Jan 14, 2025
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
High
None
Vyper is a Pythonic Smart Contract Language for the EVM. When the Vyper Compiler uses the precompiles EcRecover (0x1) and Identity (0x4), the success flag of the call is not checked. As a consequence an attacker can provide a specific amount of gas to make these calls fail but let the overall execution continue. Then the execution result can be incorrect. Based on EVM's rules, after the failed precompile the remaining code has only 1/64 of the pre-call-gas left (as 63/64 were forwarded and spent). Hence, only fairly simple executions can follow the failed precompile calls. Therefore, we found no significantly impacted real-world contracts. None the less an advisory has been made out of an abundance of caution. There are no actions for users to take. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 57 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
0.4.1b1
0.4.1b2
0.4.1b3
0.4.1b4
0.4.1rc1
0.4.1rc2
0.4.1rc3
Fixed in
0.4.1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32645
GHSA-xchq-w5r3-4wg3
PYSEC-2024-206
Apr 25, 2024
vyper performs incorrect topic logging in raw_log
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryIncorrect values can be logged when A contract search was performed and no vulnerable contracts were found in production. In particular, no uses of DetailsThe PoC
PatchesFixed in https://github.com/vyperlang/vyper/pull/3977. ImpactIncorrect values can be logged which may result in unexpected behavior in client-side applications relying on these logs. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32646
GHSA-r56x-j438-vw5m
PYSEC-2024-207
Apr 25, 2024
vyper performs double eval of the slice start/length args in certain cases
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. Having side-effects in the start and length patterns is also an unusual pattern which is not that likely to show up in user code. It is also much harder (but not impossible!) to trigger the bug since DetailsIt can be seen that the As such, they can be evaluated multiple times (instead of retrieving the value from the stack). PoCwith Vyper version
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32647
GHSA-3whq-64q2-qfj6
PYSEC-2024-208
Apr 25, 2024
vyper performs double eval of raw_args in create_from_blueprint
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. In particular, the DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCThe vulnerability is demonstrated in the following
The output of PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Additionally, double evaluation of side-effects should be easily discoverable in client tests. As such, the impact is Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32648
GHSA-m2v9-w374-5hj9
PYSEC-2024-163
Apr 25, 2024
vyper default functions don't respect nonreentrancy keys
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryPrior to v0.3.0, A contract search was additionally performed and no vulnerable contracts were found in production. PoC
after codegen:
ImpactNo vulnerable production contracts were found. Additionally, using a lock on a Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 21 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
Fixed in
0.3.0
References
Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-32649
GHSA-5jrj-52x8-m64h
PYSEC-2024-209
Apr 25, 2024
vyper performs multiple eval of `sqrt()` argument built in
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
None
Low
None
SummaryUsing the A contract search was performed and no vulnerable contracts were found in production. DetailsIt can be seen that the As such, it can be evaluated multiple times (instead of retrieving the value from the stack). PoCWith at least Vyper version
passes the following test:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3976. ImpactNo vulnerable production contracts were found. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-26149
PYSEC-2024-164
GHSA-9p8r-4xp4-gw5w
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. If an excessively large value is specified as the starting index for an array in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24564
PYSEC-2024-205
GHSA-4hwq-4cpm-8vmx
Feb 26, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. When using the built-in Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 112 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
v0.4.0rc6
v0.4.0rc5
v0.4.0rc4
v0.4.0rc3
v0.4.0rc2
v0.4.0rc1
v0.4.0b6
v0.4.0b5
v0.4.0b4
v0.4.0b3
v0.4.0b2
v0.4.0b1
v0.3.10
v0.3.10rc5
v0.3.10rc4
v0.3.10rc3
v0.3.10rc2
v0.3.10rc1
v0.3.9
v0.3.8
v0.3.7
v0.3.6
v0.3.5
v0.3.4
pre-release
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.16
v0.2.15
v0.2.14
v0.2.13
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0-beta.17
v0.1.0-beta.16
v0.1.0-beta.15
v0.1.0-beta.14
v0.1.0-beta.13
v0.1.0-beta.12
v0.1.0-beta.11
v0.1.0-beta.10
v0.1.0-beta.9
v0.1.0-beta.8
v0.1.0-beta.7
v0.1.0-beta.6
v0.1.0-beta.5
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.0.4
Fixed in
0.4.0
References Updated Jun 10, 2026 · Source: OSV.dev
CVE-2024-24563
GHSA-52xq-j7v9-v4v2
PYSEC-2024-150
Feb 07, 2024
Vyper negative array index bounds checks
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryArrays can be keyed by a signed integer, while they are defined for unsigned integers only. The typechecker doesn't throw when spotting the usage of an A contract search was performed, and no production contracts were found to be impacted. DetailsThe typechecker allows the usage of signed integers to be used as indexes to arrays. The vulnerability is present in different forms in all versions. Here is an example from As can be seen, the validation is performed against PoCIf the array is sufficiently large, it can be indexed with a negative value:
For signed integers, the 2's complement representation is used. Because the array was declared very large, the bounds checking will pass (negative values will simply be represented as very large numbers): https://github.com/vyperlang/vyper/blob/a1fd228cb9936c3e4bbca6f3ee3fb4426ef45490/vyper/codegen/core.py#L534-L541 PatchesPatched in https://github.com/vyperlang/vyper/pull/3817. ImpactThere are two potential vulnerability classes: unpredictable behavior and accessing inaccessible elements.
The contract search found no production contracts impacted by these two classes of issues. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24559
PYSEC-2024-147
GHSA-6845-xw22-ffxv
Feb 05, 2024
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Vyper is a Pythonic Smart Contract Language for the EVM. There is an error in the stack management when compiling the Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 37 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
Fixed in
0.4.0b1
References Updated Nov 21, 2024 · Source: OSV.dev
CVE-2024-24560
GHSA-gp3w-2v2m-p686
PYSEC-2024-148
Feb 02, 2024
Vyper's external calls can overflow return data to return input buffer
3.7
/ 10
Low
Network
High
None
None
Unchanged
Low
None
None
SummaryWhen calls to external contracts are made, we write the input buffer starting at byte 28, and allocate the return buffer to start at byte 0 (overlapping with the input buffer). When checking This advisory is given a severity of "Low" because when the called contract returns invalid ABIv2 encoded data, the calling contract can read different invalid data (from the dirty buffer) than the called contract returned. DetailsWhen arguments are packed for an external call, we create a buffer of size
When data is returned, we unpack the return data by starting at byte 0. We check that
This check ensures that any dynamic types returned will have a size of at least 64. However, it does not verify that As a result, if a contract expects a dynamic type to be returned, and the part of the return data that is read as Proof of ConceptThis contract calls an external contract with two arguments. As the call is made, the buffer includes:
The return data buffer begins at byte 0, and will return the returned bytestring, up to a maximum length of 96 bytes.
On the other side, imagine a simple contract that does not, in fact, return a bytestring, but instead returns two uint256s. I've implemented it in Solidity for ease of use with Foundry:
The return data will be parsed as a bytestring. The first 32 will point us to byte 32 to read the length. The second 32 will be perceived as the length. It will then read the next 32 bytes from the return data buffer, even though those weren't a part of the return data. Since these bytes will come from byte 64, we can see above that the hash was placed there in the input buffer. If we run the following Foundry test, we can see that this does in fact happen:
PatchesPatched in https://github.com/vyperlang/vyper/pull/3925, https://github.com/vyperlang/vyper/pull/4091, https://github.com/vyperlang/vyper/pull/4144, https://github.com/vyperlang/vyper/pull/4060. ImpactMalicious or mistaken contracts returning the malformed data can result in overrunning the returned data and reading return data from the input buffer. Affected versions
0.1.0b1
0.1.0b10
0.1.0b11
0.1.0b12
0.1.0b13
0.1.0b14
0.1.0b15
0.1.0b16
0.1.0b17
0.1.0b2
0.1.0b3
0.1.0b4
+ 49 more Show less
0.1.0b5
0.1.0b6
0.1.0b7
0.1.0b8
0.1.0b9
0.2.1
0.2.10
0.2.11
0.2.12
0.2.13
0.2.14
0.2.15
0.2.16
0.2.2
0.2.3
0.2.4
0.2.5
0.2.6
0.2.7
0.2.8
0.2.9
0.3.0
0.3.1
0.3.10
0.3.10rc1
0.3.10rc2
0.3.10rc3
0.3.10rc4
0.3.10rc5
0.3.2
0.3.3
0.3.4
0.3.5
0.3.6
0.3.7
0.3.8
0.3.9
0.4.0b1
0.4.0b2
0.4.0b3
0.4.0b4
0.4.0b5
0.4.0b6
0.4.0rc1
0.4.0rc2
0.4.0rc3
0.4.0rc4
0.4.0rc5
0.4.0rc6
Fixed in
0.4.0
References Updated Sep 10, 2026 · Source: OSV.dev
CVE-2024-24561
GHSA-9x7f-gwxq-6f2c
PYSEC-2024-149
Feb 01, 2024
Vyper's bounds check on built-in `slice()` function can be overflowed
9.8
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
High
SummaryThe bounds check for slices does not account for the ability for If a This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the A contract search was performed and no vulnerable contracts were found in production. tracking in issue https://github.com/vyperlang/vyper/issues/3756. patched in https://github.com/vyperlang/vyper/pull/3818. DetailsHere the flow for When calling
At runtime, we perform the following equivalent check, but the runtime check does not account for overflows:
The storage In most cases, this will mean they have the ability to forcibly return POC: OOB accessFor simplicity, take the following Vyper contract, which takes an argument to determine where in a
We can use the following manual storage to demonstrate the vulnerability:
If we run the following test, passing
The result is that we return the secret value from storage:
POC:
|