Hoch

Incorrect success value returned in vyper

  • Veröffentlicht: 24.04.2023
  • Aktualisiert: 11.10.2026 15:17

Background

During the audit of Lido's Gate Seals code statemind team identified a weird behavior of the code that uses raw_call: https://github.com/lidofinance/gate-seals/blob/051593e74df01a4131c485b4fda52e691cd4b7d8/contracts/GateSeal.vy#L164 .

Construction like this:

vyper
success = raw_call(
    sealable,
    _abi_encode(SEAL_DURATION_SECONDS, method_id=method_id("pauseFor(uint256)")),
    revert_on_failure=False
)

was not fully documented: https://docs.vyperlang.org/en/v0.3.7/built-in-functions.html#raw_call .

The documentation says that: if max_outsize=0 it should return nothing and then it says that if revert_on_failure=False it should return a success flag in the tuple of response, but what if max_outsize=0 and revert_on_failure=False.

<img width="715" alt="image" src="https://user-images.githubusercontent.com/22330612/232125364-d2b3bbac-0b4f-40cb-80ff-f55d8eafef44.png">

So the team started researching what exactly happened in that case, after some research we found that the Vyper compiler generates the wrong bytecode in that case, it generates the sequence:

CALL // call
MLOAD // MLOAD is wrong since the CALL result is already stored in the stack

Impact

Example of buggy code:

vyper
@external
def returnSome(calling: address, a: uint256) -> bool:
    success: bool = false
    success = raw_call(
        calling,
        _abi_encode(a, method_id=method_id("a(uint256)")),
        revert_on_failure=False
        )

any contract that uses the raw_call with revert_on_failure=False and max_outsize=0 receives the wrong response from raw_call. Depending on the memory garbage, the result can be either True or False.

Patches

Fix by @charles-cooper https://github.com/vyperlang/vyper/commit/851f7a1b3aa2a36fd041e3d0ed38f9355a58c8ae

Workarounds

The simple workaround is always to put max_outsize>0. Workaround example https://github.com/lidofinance/gate-seals/pull/5/files

References

Lido's fix: https://github.com/lidofinance/gate-seals/pull/5/files

Betroffene Software

Klicken Sie auf eine Technologie, um alle zugehörigen Schwachstellen anzuzeigen.

PlattformPaketAnfällige VersionenBehoben in
Python (PyPI) vyper >= 0.3.1, < 0.3.8 0.3.8

Verweise

CVSS-Wert 7.5/10
CVSS-Vektor
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N
Schwäche (CWE)
CWE-670
Plattform
Python (PyPI)
Paket
vyper
Veröffentlicht
24.04.2023
Aktualisiert
11.10.2026 15:17

Quellen und Lizenzen

OSV / GitHub Advisory Database - PYSEC-2023-131 - PyPA Advisory Database; CC BY 4.0

OSV / GitHub Advisory Database - GHSA-w9g2-3w7p-72g9 - CC BY 4.0

Schwachstellenhistorie: vyper

Alle veröffentlichten Schwachstellen dieses Pakets (Python (PyPI)), neueste zuerst. Zeigt, ob es ein einmaliger Ausrutscher ist oder ein Paket, das man im Auge behalten muss.

Alle (47) im Archiv
Einträge insgesamt
47
Erste → letzte
03.2020 10.2026
Ohne Fix
5
In Angriffen ausgenutzt
0

Verteilung nach Schweregrad

  • Kritisch 3
  • Hoch 14
  • Mittel 20
  • Niedrig 10

Veröffentlichungen pro Jahr

  1. 2020: 1
  2. 2021: 5
  3. 2022: 4
  4. 2023: 14
  5. 2024: 14
  6. 2025: 6
  7. 2026: 3
Schweregrad:
  1. Kritisch · 9.8 CVE-2024-24563 < 0.4.0 0.4.0
  2. Kritisch · 9.8 CVE-2024-24561 < 0.4.0 0.4.0
  3. Hoch · 7.3 CVE-2024-22419 >= 0.3.0, < 0.4.0 0.4.0
  4. Hoch · 7.5 CVE-2023-46247 < 0.3.8 0.3.8
  5. Hoch · 8.1 CVE-2023-42443 >= 0.3.4, < 0.3.10 0.3.10
  6. Kritisch · 8.7 CVE-2023-39363 >= 0.2.15, < 0.3.1 0.3.1
  7. Hoch · 7.5 CVE-2023-32058 < 0.3.8 0.3.8
  8. Hoch · 7.5 CVE-2023-30837 < 0.3.8 0.3.8
  9. Incorrect success value returned in vyper dieser Eintrag
    Hoch · 7.5 CVE-2023-30629 >= 0.3.1, < 0.3.8 0.3.8
  10. Hoch · 7.5 CVE-2022-29255 < 0.3.4 0.3.4
  11. Hoch · 7.1 CVE-2022-24788 < 0.3.2 0.3.2
  12. Hoch · 7.5 CVE-2022-24787 < 0.3.2 0.3.2
  13. Hoch ghsa-7f92-rr6w-cq64 >= 0.2.13, < 0.2.15 0.2.15

Erkennen Sie Schwachstellen in Ihrer Anwendung

Mit der DockRay-Integration und aktivierter Softwareinventarisierung prüft DockRay gemeldete Komponentenversionen auf bekannte Schwachstellen und benachrichtigt Sie über bestätigte Treffer. Die Abdeckung hängt von der unterstützten Technologie und den verfügbaren Meldungen ab.

Anwendung verbinden
DockRay Newsletter

Anwendungssicherheit in Ihrem Postfach

Wichtige Schwachstellen, konkrete Empfehlungen und praktische Tipps für Ihre Anwendungen. Wählen Sie Ihre Technologien und verfolgen Sie, was für Ihr Projekt relevant ist.

  • Eine tägliche Zusammenfassung neuer Schwachstellen, auch kritischer.
  • Benachrichtigungen über wichtige Updates.
  • Praktische Tipps zur Sicherheit und Überwachung von Anwendungen.

Leer lassen, um Meldungen zu allen Technologien zu erhalten.

Kostenlos anmelden. In jeder E-Mail mit einem Klick abmelden.