CVE-2020-37287
ŚrednieCVSS 5.9Streszczenie
Vyper w wersji przed 0.2.6 zawiera podatność na uszkodzenie stosu wywołań, która powoduje nieprawidłowe wyniki funkcji, gdy złożone typy z elementami niebazowymi są przekazywane jako argumenty. Kontrakty przekazujące wielowymiarowe tablice lub struktury do funkcji wewnętrznych lub zewnętrznych otrzymują uszkodzone wartości, ponieważ kompilator zakładał, że rozmiar każdego podtypu wynosi 32.
Ocena ryzyka
Kontrakty inteligentne mogą zwracać błędne wartości lub przekazywać nieprawidłowe argumenty, co prowadzi do błędów logiki i potencjalnych strat. Organizacje korzystające z Vyper z złożonymi typami danych są narażone na nieprzewidywalne zachowanie kontraktów.
Rekomendacja
Zaktualizuj kompilator Vyper do wersji 0.2.6 lub nowszej i ponownie wdróż dotknięte kontrakty. Przetestuj kontrakty przekazujące wielowymiarowe tablice i struktury pod kątem poprawności wyników.
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 before 0.2.6 contains a call stack corruption vulnerability that causes incorrect function outputs when complex types with non-base members are passed as arguments. Contracts passing multi-dimensional arrays or structs to internal or external functions receive corrupted values because the compiler assumed each subtype size is 32.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

