All vulnerabilities
GHSA-vg88-3v92-rjx2

Vyper: Return inside for loop more than 1 level deep

vyperpipLibraries & packages
CVSS
6.3Medium
ExploitationNo known exploitationNot in CISA KEV, which does not prove it is unexploitedCISA KEV
Exploit odds (EPSS)No scoreNo FIRST EPSS score in this snapshot yet
Fixed in0.2.3Fixed versionGitHub
Published6 Oct 2026Updated 6 Oct 2026GitHub

What fixes it

  • 0.2.3vyper, pipGitHub
  • 0.2.3vyper, PyPIOSVpip install "vyper>=0.2.3"

A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.

Description

VVE-2020-0002

Earlier today, we received a responsible disclosure of a potential issue from @michwill (developer of @curvefi) for Vyper users who use return statements inside for loops of nested internal calls. Returning inside a for loop causes an invalid jump dest, reverting the transaction unnecessarily.

MWE:

@internal
def _baz():
    for i in range(1):
        return  # Stack underflow happens here

@internal
def _bar():
    self._baz()

@external
def foo():
    self._bar()

Impact

Impact is minor, it is unlikely a user would encounter this problem unless they were working with nested calls, and return statements inside calls. Even in that scenario, you would encounter a revert which should be noticeable with adequate testing. In limited circumstances, this could cause a DoS attack for public contracts under certain conditions.

Patches

Fixed in https://github.com/vyperlang/vyper/pull/2110. Please upgrade to Vyper 0.2.3

Workarounds

Not returning inside a for loop nested 2+ internal calls deep works as is:

@internal
def _baz():
    for i in range(1):
        pass
    return  # This works fine

@internal
def _bar():
    self._baz()

@external
def foo():
    self._bar()

For more information

If you have any questions or comments about this advisory:

Text from GitHub Advisory Database

Affected versions 12

  • vyper, pip>= 0.1.0b10, < 0.2.3GitHub
  • vyper, PyPIfrom 0.1.0b10, fixed in 0.2.3OSV
  • vyper, PyPI0.1.0b10OSV
  • vyper, PyPI0.1.0b11OSV
  • vyper, PyPI0.1.0b12OSV
  • vyper, PyPI0.1.0b13OSV
  • vyper, PyPI0.1.0b14OSV
  • vyper, PyPI0.1.0b15OSV
  • vyper, PyPI0.1.0b16OSV
  • vyper, PyPI0.1.0b17OSV
  • vyper, PyPI0.2.1OSV
  • vyper, PyPI0.2.2OSV

References 5