W języku Vyper w wersji 0.3.10 i wcześniejszych funkcja slice() nie sprawdza poprawnie przepełnienia sumy start + length, gdy argumenty nie są literałami. Luka umożliwia atakującemu wyjście poza dozwolony zakres pamięci w smart kontraktach działających na Ethereum Virtual Machine.
▸ Pokaż oryginał (EN)
Vyper is a pythonic Smart Contract Language for the ethereum virtual machine. In versions 0.3.10 and earlier, the bounds check for slices does not account for the ability for start + length to overflow when the values aren't literals. If a slice() function uses a non-literal argument for the start or length variable, this creates the ability for an attacker to overflow the bounds check. This issue can be used to do OOB access to storage, memory or calldata addresses. It can also be used to corrupt the length slot of the respective array.
Funkcja slice() stosuje mechanizm sprawdzania granic (bounds check), jednak nie uwzględnia sytuacji, w której suma argumentów start i length może ulec arytmetycznemu przepełnieniu (integer overflow), jeśli nie są one wartościami literalnymi. Atakujący może przekazać odpowiednio dobrane wartości dynamiczne, które spowodują przepełnienie i ominięcie weryfikacji zakresów. Skutkuje to możliwością dokonania odczytu lub zapisu poza przydzielonym obszarem pamięci (OOB — Out-of-Bounds) w przestrzeni storage, memory lub calldata.
Atakujący może uzyskać nieautoryzowany dostęp do danych spoza dozwolonego zakresu (OOB read/write) w obszarach storage, memory lub calldata kontraktu, a także nadpisać slot przechowujący długość tablicy, co może prowadzić do uszkodzenia stanu kontraktu lub eskalacji uprawnień w jego logice.
Należy zaktualizować kompilator Vyper do wersji nowszej niż 0.3.10. Szczegółowe informacje o dostępnych patchach dostępne są w repozytorium projektu oraz w security advisory GHSA-9x7f-gwxq-6f2c. Kontrakty skompilowane podatną wersją kompilatora powinny zostać ponownie skompilowane i wdrożone po aktualizacji.
Vyperlang Vyper w wersji 0.3.10 i wcześniejszych — dotyczy smart kontraktów skompilowanych tym kompilatorem, które używają funkcji slice() z nieiteralnymi argumentami start lub length.
Podatność dotyczy etapu kompilacji smart kontraktów — luka znajduje się w kompilatorze Vyper, nie w środowisku uruchomieniowym EVM. Kontrakty już wdrożone na blockchainie pozostają narażone do czasu ich ponownego wdrożenia z użyciem poprawionej wersji kompilatora.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HVyperlang Vyper
APPVyperlang≤ 0.3.10
Powiązane podatności
Vyper: nieprawidłowa walidacja indeksu tablicy — dostęp przez liczby ujemne
Vyper is a Pythonic Smart Contract Language for the Ethereum Virtual Machine (EVM). In versions 0.2.15, 0.2.16...
Vyper is a Pythonic Smart Contract Language for the Ethereum Virtual Machine. The `concat` built-in can write ...
Vyper is a Pythonic Smart Contract Language for the Ethereum Virtual Machine (EVM). Contracts containing large...
Vyper is a Pythonic Smart Contract Language for the Ethereum Virtual Machine (EVM). In version 0.3.9 and prior...