CVE-2020-37286
ŚrednieCVSS 6.5Streszczenie
Vyper od wersji 0.1.0b4 przed 0.3.0 zawiera podatność na uszkodzenie pamięci spowodowaną nieprawidłowym wskaźnikiem szczytu stosu, gdy wywołania funkcji wewnętrznych pojawiają się wewnątrz krotek lub zagnieżdżonych wywołań. Kontrakty używające takich wywołań jako elementów krotek, argumentów wywołań lub argumentów wbudowanych, takich jak concat lub ecrecover, mogą zwracać uszkodzone wartości lub przekazywać błędne argumenty do wywołań zewnętrznych.
Ocena ryzyka
Uszkodzone wartości i błędne argumenty mogą prowadzić do nieprawidłowego działania kontraktów, w tym błędnych operacji kryptograficznych i transferów. Organizacje korzystające z Vyper z zagnieżdżonymi wywołaniami są narażone na błędy integralności i potencjalne straty.
Rekomendacja
Zaktualizuj kompilator Vyper do wersji 0.3.0 lub nowszej i ponownie wdróż dotknięte kontrakty. Przeaudytuj kontrakty używające wywołań wewnętrznych w krotkach i argumentach wbudowanych.
Inne podatności w Vyper
Zobacz wszystkie- CVE-2026-114118Średnie
W kompilatorze Vyper w wersjach 0.3.4 do 0.5.0b1 funkcja create_from_blueprint oblicza pozostały rozmiar blueprintu przez odejmowanie uint256 bez sprawdzenia, czy code_offset jest mniejszy od rozmiaru kodu. Duży offset może zawinąć się do małej wartości dodatniej.
- CVE-2026-114117Średnie
W kompilatorze Vyper w wersjach 0.3.8 do 0.5.0b1 występuje błąd optymalizatora, w którym wyrażenie (msg.value | K) lub (len(msg.data) | K) dla niezerowego K jest kompilowane do stałej 1 w gałęzi wyrażenia trójargumentowego przy -O gas lub -O codesize. Kontrakty używają błędnej wartości bez ostrzeżenia.
- CVE-2026-114116Średnie
W kompilatorze Vyper w wersjach 0.1.0b1 przed 0.1.0b17 oraz 0.4.1 do 0.5.0b1 tabela linii źródłowych jest budowana za pomocą str.splitlines(), która traktuje znaki takie jak form feed i U+2028 jako podziały linii ignorowane przez parser Pythona. Powoduje to błędną klasyfikację literałów numerycznych.
- CVE-2026-114115Niskie
Kompilator Vyper w wersjach 0.3.8 do 0.5.0b1 zawiera błąd błędnej kompilacji w parse_IfExp, który odczytuje zagnieżdżone tablice o węższych granicach wewnętrznych przy użyciu układu pamięci szerszego typu wyniku. Gdy wyrażenie trójargumentowe wybiera węższą tablicę, wewnętrzne tablice po pierwszej są odczytywane z błędnych przesunięć, powodując ciche zapisywanie uszkodzonych wartości lub wycofanie transakcji w kontraktach.
- CVE-2026-114114Średnie
W kompilatorze Vyper w wersjach 0.1.0b1 przed 0.1.0b12, 0.1.0b14 oraz 0.4.1 do 0.5.0b1 w pliku vyper/ast/parse.py mieszane są przesunięcia linii oparte na znakach z bajtami UTF-8 col_offset Pythona. Znaki wielobajtowe przesuwają wycinki źródła używane do rekonstrukcji późniejszych literałów numerycznych.
- CVE-2021-48020Średnie
Vyper od wersji 0.1.0b4 przed 0.3.0 zawiera podatność polegającą na uszkodzeniu pamięci spowodowanym nieprawidłowym wskaźnikiem szczytu stosu podczas wywołań funkcji wewnętrznych wewnątrz tablic. Kontrakty umieszczające wywołania wewnętrzne w zagnieżdżonych elementach tablic, argumentach wywołań zewnętrznych, literałach struktur lub tematach raw_log mogą mieć uszkodzoną pamięć, co prowadzi do nieprawidłowego działania kontraktu.
- CVE-2021-48019Średnie
Vyper w wersji przed 0.2.9 wdraża proxy forwarderów przez wbudowaną funkcję create_forwarder_to, która zgłasza stały rozmiar RETURNDATASIZE wynoszący 4096 bajtów zamiast rzeczywistego rozmiaru zwracanych danych. Wywołania przez te proxy mogą zwracać uszkodzone dane, gdy funkcja zwraca więcej niż 4096 bajtów bez sanityzacji danych zwrotnych, i powodują niepowodzenie ścisłych kontroli rozmiaru zwrotu, takich jak SafeERC20.safeTransfer.
- CVE-2021-48018Wysokie
Vyper od wersji 0.2.13 przed 0.2.15 przydziela sloty pamięci dla blokad reentrancyjnych @nonreentrant w tych samych lokalizacjach co zmienne przechowywania kontraktu. Gdy wywoływana jest funkcja używająca @nonreentrant, ustawienie blokady nadpisuje nakładającą się zmienną przechowywania, uszkadzając stan kontraktu i łamiąc zamierzoną logikę kontraktu.
- CVE-2020-37289Niskie
Vyper przed wersją 0.3.1 nie posiada typu uint8, co pozwala na przechowywanie wartości zwracanych przez interfejsy zadeklarowane jako uint8, takie jak ERC20.decimals(), w zmiennych uint256 bez sprawdzania granic. Złośliwe kontrakty mogą zwracać wartości większe niż 255, aby manipulować lub obejść logikę kontraktu opierającą się na tych wartościach.
- CVE-2020-37288Niskie
Kompilator Vyper w wersjach od 0.1.0b10 do 0.2.3 generuje niepoprawny kod dla instrukcji return wewnątrz pętli for w funkcji wewnętrznej wywoływanej co najmniej dwa poziomy wywołań w głąb, co prowadzi do nieprawidłowego celu skoku (stack underflow). Dotknięte kontrakty niepotrzebnie odrzucają takie wywołania, co w ograniczonych przypadkach może umożliwić atak odmowy usługi na publiczne kontrakty.
Oryginalny opis (angielski, źródło NVD)
Vyper from 0.1.0b4 before 0.3.0 contains a memory corruption vulnerability caused by an incorrect stack tip pointer when internal function calls appear inside tuples or nested calls. Contracts using such calls as tuple elements, call arguments, or builtin arguments like concat or ecrecover can return corrupted values or pass wrong arguments to external calls.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

