CVE-2025-47774: Vyper's `slice()` may elide side-effects when output length is 0

Published May 15, 2025
·
Updated

Impact the slice() builtin can elide side effects when the output length is 0, and the source bytestring is a builtin (msg.data or <address>.code). the reason is that for these source locations, the check that length >= 1 is skipped: https://github.com/vyperlang/vyper/blob/68b68c4b30c5ef2f312b4674676170b8a6eaa316/vyper/builtins/functions.py#L315-L319

the result is that a 0-length bytestring constructed with slice can be passed to makebytearraycopier, which elides evaluation of its source argument when the max length is 0: https://github.com/vyperlang/vyper/blob/68b68c4b30c5ef2f312b4674676170b8a6eaa316/vyper/codegen/core.py#L189-L191

the impact is that side effects in the start argument may be elided when the length argument is 0, e.g. slice(msg.data, self.dosideeffect(), 0).

the following example illustrates how the issue would look in user code vyper counter: public(uint256)

@external def test() -> Bytes[10]: b: Bytes[10] = slice(msg.data, self.sideeffect(), 0) return b

def sideeffect() -> uint256: self.counter += 1 return 0

the severity assigned is low, since this is not a very useful pattern and unlikely to be found in user code.

Patches

the fix is tracked in https://github.com/vyperlang/vyper/pull/4645, which disallows any invocation of slice() with length 0, including for the ad hoc locations discussed in this advisory.

Workarounds Is there a way for users to fix or remediate the vulnerability without upgrading?

References Are there any links users can visit to find out more?

Other sources

Vyper is the Pythonic Programming Language for the Ethereum Virtual Machine. In versions up to and including 0.4.2rc1, the slice() builtin can elide side effects when the output length is 0, and the source bytestring is a builtin (msg.data or <address>.code). The reason is that for these source locations, the check that length >= 1 is skipped. The result is that a 0-length bytestring constructed with slice can be passed to makebytearraycopier, which elides evaluation of its source argument when the max length is 0. The impact is that side effects in the start argument may be elided when the length argument is 0, e.g. slice(msg.data, self.dosideeffect(), 0). The fix in pull request 4645 disallows any invocation of slice() with length 0, including for the ad hoc locations discussed in this advisory. The fix is expected to be part of version 0.4.2.

— MITRE

Affected Software

2 affected components
Vyper Vyper<=0.4.2rc1
pip/vyper<=0.4.2rc1

Event History

May 15, 2025
CVE Published
via MITRE·05:38 PM
Data Sourced
via MITRE·05:38 PM
DescriptionWeakness
Data Sourced
via NVD·06:15 PM
DescriptionSeverityWeakness
May 16, 2025
Advisory Published
via GitHub·02:13 PM
Sep 19, 57356
Event
via FIRST·02:39 AM

Frequently Asked Questions

1

What is the severity of CVE-2025-47774?

The severity of CVE-2025-47774 is considered high due to the potential elision of side effects in smart contracts.

2

How do I fix CVE-2025-47774?

To fix CVE-2025-47774, upgrade to Vyper version 0.4.2rc2 or later where this issue has been addressed.

3

What are the affected versions in CVE-2025-47774?

CVE-2025-47774 affects Vyper versions up to and including 0.4.2rc1.

4

What is the main issue caused by CVE-2025-47774?

The main issue caused by CVE-2025-47774 is that the `slice()` builtin can unintentionally elide side effects when the output length is 0.

5

Who is impacted by CVE-2025-47774?

Developers using Vyper versions up to 0.4.2rc1 for Ethereum smart contracts are impacted by CVE-2025-47774.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203