Vyper
Уязвимости
40
Эксплуатируемые
0
Макс. CVSS
9.8
Макс. EPSS
0.01539
Распределение по критичности
Критический
7
Высокий
10
Средний
17
Низкий
6
Затронутые диапазоны версий
0.2.9–0.3.100.3.1–0.3.80.3.4–0.3.100.3.8–0.4.0b1< 0.3.0< 0.3.10< 0.3.2< 0.3.4< 0.3.8< 0.3.9< 0.4.1≤ 0.3.1≤ 0.3.10≤ 0.3.9≤ 0.4.0≤ 0.4.2rc1
Также сопоставлено как (исходные строки): vyper
Топ уязвимостей
CVE-2024-24563Vyper — это питонический язык смарт-контрактов для виртуальной машины Ethereum. Массивы могут быть индексированы целым числом со знаком, в то время как они определены только для целых чисел без знака. Typechecker не выдает ошибку при обнаружении использования `int` в качестве индекса для массива. Typechecker допускает использование целых чисел со знаком в качестве индексов для массивов. Уязвимость присутствует в различных формах во всех версиях, включая `0.3.10`. Для целых чисел используется представление дополнительного кода 2. Поскольку массив был объявлен очень большим, проверка границ пройдет. Отрицательные значения будут просто представлены как очень большие числа. На момент публикации фиксированной версии не существует.
Существует три потенциальных класса уязвимостей: непредсказуемое поведение, доступ к недоступным элементам и отказ в обслуживании. Класс 1: Если возможно индексировать массив отрицательным целым числом без отката, это, скорее всего, не предполагается разработчиком, и такие обращения могут вызвать непредсказуемое поведение контракта. Класс 2: Если контракт имеет инвариант в форме `assert index \u003c x`, разработчик будет предполагать, что никакие элементы по индексам `y | y \u003e= x` недоступны. Однако, используя отрицательные индексы, это можно обойти. Класс 3: Если индекс зависит от состояния контракта, это создает риск отказа в обслуживании. Если состояние контракта можно манипулировать таким образом, что индекс будет вынужден быть отрицательным, доступ к массиву всегда может быть отменен (потому что, скорее всего, массив не будет объявлен чрезвычайно большим). Однако все эти сценарии крайне маловероятны. Наиболее вероятным поведением является откат при проверке границ.
CVE-2024-24561Vyper — это питонический язык смарт-контрактов для виртуальной машины ethereum. В версиях 0.3.10 и более ранних проверка границ для срезов не учитывает возможность переполнения start + length, когда значения не являются литералами. Если функция slice() использует нелитеральный аргумент для переменной start или length, это создает возможность для злоумышленника переполнить проверку границ. Эту проблему можно использовать для выполнения OOB-доступа к адресам хранилища, памяти или calldata. Ее также можно использовать для повреждения слота длины соответствующего массива.
CVE-2024-22419Vyper - это Pythonic Smart Contract Language для виртуальной машины Ethereum. Встроенная функция `concat` может записывать за пределы буфера памяти, выделенного для нее, и, таким образом, перезаписывать существующие действительные данные. Основная причина в том, что `build_IR` для `concat` неправильно придерживается API функций копирования (для `\>=0.3.2` функция `copy_bytes`). Был выполнен поиск контрактов, и в производстве не было обнаружено уязвимых контрактов. Переполнение буфера может привести к изменению семантики контракта. Переполнение зависит от длины, и поэтому оно может остаться незамеченным во время тестирования контракта. Однако, конечно, не все случаи использования concat приведут к перезаписи действительных данных, поскольку мы требуем, чтобы они были во внутренней функции и находились близко к оператору return, где другие выделения памяти не происходят. Эта проблема была решена в версии 0.4.0.
CVE-2022-24845Vyper — это питонический язык смарт-контрактов для виртуальной машины ethereum. В уязвимых версиях возврат `<iface>.returns_int128()` не проверяется на соответствие границам `int128`. Эта проблема может привести к неправильной интерпретации целочисленного значения и привести к неправильному поведению. Начиная с версии v0.3.0, `<iface>.returns_int128()` проверяется в простых выражениях, но не в сложных выражениях. Пользователям рекомендуется обновиться. Известных обходных путей для этой проблемы нет.
CVE-2022-24788Vyper — это питонический язык смарт-контрактов для виртуальной машины ethereum. Версии vyper до 0.3.2 страдают от потенциального переполнения буфера. Импорт функции из интерфейса JSON, который возвращает `bytes`, генерирует байт-код, который не ограничивает длину байтов, что потенциально может привести к переполнению буфера. Пользователям рекомендуется выполнить обновление. Нет известных обходных путей для этой проблемы.
CVE-2023-39363Vyper - это Python-подобный язык смарт-контрактов для виртуальной машины Ethereum (EVM). В версиях 0.2.15, 0.2.16 и 0.3.0 именованные блокировки повторного входа выделяются некорректно. Каждая функция, использующая именованную блокировку повторного входа, получает уникальную блокировку независимо от ключа, что позволяет осуществлять повторный вход между функциями в контрактах, скомпилированных с использованием уязвимых версий. Для возникновения неправильного поведения затронутых контрактов требуется определенный набор условий, а именно: контракт `.vy`, скомпилированный с использованием версий `vyper` `0.2.15`, `0.2.16` или `0.3.0`; основная функция, использующая декоратор `@nonreentrant` с определенным `key` и не строго следующая шаблону check-effects-interaction (т.е. содержит внешний вызов к ненадежной стороне перед обновлениями хранилища); и вторичная функция, использующая тот же `key` и подверженная неправильному состоянию, вызванному основной функцией. Версия 0.3.1 содержит исправление для этой проблемы.
CVE-2023-31146Vyper — это Python-подобный язык смарт-контрактов для виртуальной машины Ethereum. До версии 0.3.8 во время генерации кода слово длины dynarray записывается перед данными, что может привести к выходу за границы массива в случае, когда dynarray находится как в левой, так и в правой части присваивания. Эта проблема может привести к повреждению данных во всех кадрах вызовов. Ожидаемое поведение — откат из-за выхода за границы массива. Версия 0.3.8 содержит исправление этой проблемы.
CVE-2021-41121Vyper - это язык смарт-контрактов Pythonic для EVM. В уязвимых версиях при выполнении вызова функции внутри литеральной структуры возникает проблема повреждения памяти из-за неправильного указателя на вершину стека. Эта проблема была решена в версии 0.3.0.
CVE-2023-42443Vyper — это Pythonic Smart Contract Language для виртуальной машины Ethereum (EVM). В версии 0.3.9 и более ранних версиях при определенных условиях память, используемая встроенными функциями `raw_call`, `create_from_blueprint` и `create_copy_of`, может быть повреждена. Для `raw_call` буфер аргументов вызова может быть поврежден, что приведет к неправильным `calldata` в подконтексте. Для `create_from_blueprint` и `create_copy_of` буфер для развертываемого байт-кода может быть поврежден, что приведет к развертыванию неправильного байт-кода.
Каждая встроенная функция имеет условия, которые должны быть выполнены для возникновения повреждения. Для `raw_call` аргумент `data` встроенной функции должен быть `msg.data`, а `value` или `gas`, передаваемые встроенной функции, должны быть каким-то сложным выражением, которое приводит к записи в память. Для `create_copy_of` `value` или `salt`, передаваемые встроенной функции, должны быть каким-то сложным выражением, которое приводит к записи в память. Для `create_from_blueprint` либо никакие параметры конструктора не должны передаваться встроенной функции, либо `raw_args` должно быть установлено значение True, а `value` или `salt`, передаваемые встроенной функции, должны быть каким-то сложным выражением, которое приводит к записи в память.
На момент публикации исправленной версии не существует. Проблема все еще исследуется, и могут быть другие случаи, когда может произойти повреждение. Когда встроенная функция вызывается из `internal` функции `F`, проблема отсутствует при условии, что функция, вызывающая `F`, записала в память до вызова `F`. В качестве обходного пути сложные выражения, которые передаются в качестве kwargs встроенной функции, следует кэшировать в памяти до вызова встроенной функции.
CVE-2023-46247Vyper - это Pythonic Smart Contract Language для виртуальной машины Ethereum (EVM). Контракты, содержащие большие массивы, могут недооценивать количество необходимых им слотов на 1. До версии v0.3.8 расчет для определения количества слотов, необходимых переменной хранилища, использовал `math.ceil(type_.size_in_bytes / 32)`. Промежуточный шаг с плавающей точкой может привести к ошибке округления, если в мантиссе IEEE-754 установлено достаточно битов. Грубо говоря, если `type_.size_in_bytes` велико (> 2**46) и немного меньше степени 2, вычисление может переоценить количество необходимых слотов на 1. Если `type_.size_in_bytes` немного больше степени 2, вычисление может недооценить количество необходимых слотов на 1. Эта проблема исправлена в версии 0.3.8.
CVE-2023-42460Vyper — это Pythonic Smart Contract Language для EVM. Функция `_abi_decode()` не проверяет входные данные, когда они вложены в выражение. Можно создать варианты использования `_abi_decode()`, которые позволяют обойти проверку границ, что приводит к неправильным результатам. Эта проблема еще не исправлена, но ожидается исправление в выпуске `0.3.10`. Пользователям рекомендуется ссылаться на запрос pull #3626.
CVE-2023-32059Vyper — это язык смарт-контрактов Python для виртуальной машины Ethereum. До версии 0.3.8 внутренние вызовы с аргументами по умолчанию компилируются неправильно. В зависимости от количества аргументов, предоставленных в вызове, значения по умолчанию добавляются не справа налево, а слева направо. Если типы несовместимы, проверка типов пропускается. Возможность передачи kwargs внутренним функциям — это неописанная функция, о которой мало кто знает. Проблема исправлена в версии 0.3.8.
CVE-2023-32058Vyper — это язык смарт-контрактов Python для виртуальной машины Ethereum. До версии 0.3.8 из-за отсутствия проверки переполнения для переменных цикла, присваивая итератор цикла переменной, можно переполнить тип последней. Похоже, проблема возникает только в циклах типа `for i in range(a, a + N)`, поскольку в циклах типа `for i in range(start, stop)` и `for i in range(stop)` компилятор может вызвать `TypeMismatch` при попытке переполнить переменную. Проблема была исправлена в версии 0.3.8.
CVE-2023-30837Vyper is a pythonic smart contract language for the EVM. The storage allocator does not guard against allocation overflows in versions prior to 0.3.8. An attacker can overwrite the owner variable. This issue was fixed in version 0.3.8.
CVE-2023-30629Vyper - это язык программирования смарт-контрактов для виртуальной машины Ethereum. В версиях 0.3.1 по 0.3.7 компилятор Vyper генерирует неправильный байт-код.
CVE-2022-29255Vyper — это Pythonic Smart Contract Language для виртуальной машины ethereum. В версиях до 0.3.4 при вызове внешнего контракта без возвращаемого значения адрес контракта (включая побочные эффекты) может быть вычислен дважды. Это может привести к неправильным результатам для контрактов. Эта проблема была решена в v0.3.4.
CVE-2022-24787Vyper — это питонический язык смарт-контрактов для виртуальной машины Ethereum. В версии 0.3.1 и более ранних bytestring могут содержать грязные байты, что приводит к тому, что сравнения слово в слово дают неверные результаты. Даже без грязных ненулевых байтов два bytestring могут быть равны, если один заканчивается на `"\x00"`, поскольку нет сравнения длины. Исправление доступно и, как ожидается, будет частью выпуска 0.3.2. В настоящее время нет известных обходных путей.
CVE-2024-32649Vyper - это питонический язык смарт-контрактов для виртуальной машины Ethereum. В версиях 0.3.10 и более ранних использование встроенной функции `sqrt` может привести к уязвимости двойной оценки, когда аргумент имеет побочные эффекты. Видно, что функция `build_IR` встроенной функции `sqrt` не кэширует аргумент в стеке. Таким образом, он может оцениваться несколько раз (вместо получения значения из стека). Не было найдено уязвимых производственных контрактов. Кроме того, двойную оценку побочных эффектов должно быть легко обнаружить в клиентских тестах. Таким образом, влияние невелико. На момент публикации исправленные версии отсутствуют.
CVE-2024-32648Vyper - это питонический язык смарт-контрактов для виртуальной машины Ethereum. До версии 0.3.0 функции по умолчанию не учитывают ключи не повторного входа, и блокировка не выдается. Не было найдено уязвимых производственных контрактов. Кроме того, использование блокировки в функции `default` является очень редко используемым шаблоном. Таким образом, влияние невелико. Версия 0.3.0 содержит исправление для этой проблемы.
CVE-2024-32647Vyper - это питонический язык смарт-контрактов для виртуальной машины Ethereum. В версиях 0.3.10 и более ранних использование встроенной функции `create_from_blueprint` может привести к уязвимости двойной оценки, когда `raw_args=True` и аргумент `args` имеет побочные эффекты. Видно, что функция `_build_create_IR` встроенной функции `create_from_blueprint` не кэширует упомянутый аргумент `args` в стеке. Таким образом, он может оцениваться несколько раз (вместо получения значения из стека). Не было найдено уязвимых производственных контрактов. Кроме того, двойную оценку побочных эффектов должно быть легко обнаружить в клиентских тестах. Таким образом, влияние невелико. На момент публикации исправленные версии отсутствуют.
CVE-2024-32646Vyper - это питонический язык смарт-контрактов для виртуальной машины Ethereum. В версиях 0.3.10 и более ранних использование встроенной функции `slice` может привести к уязвимости двойной оценки, когда аргумент буфера является либо `msg.data`, либо `self.code`, либо `<address>.code`, а аргументы `start` или `length` имеют побочные эффекты. Это может быть легко вызвано только с версиями `<0.3.4`, так как `0.3.4` ввел уникальный символ-ограждение. Не было найдено уязвимых производственных контрактов. Кроме того, двойную оценку побочных эффектов должно быть легко обнаружить в клиентских тестах. Таким образом, влияние невелико. На момент публикации исправленные версии отсутствуют.
CVE-2024-32645Vyper - это питонический язык смарт-контрактов для виртуальной машины Ethereum. В версиях 0.3.10 и более ранних могут регистрироваться неверные значения, когда встроенная функция `raw_log` вызывается с аргументами памяти или хранилища, которые будут использоваться в качестве тем. Был выполнен поиск контрактов, и не было обнаружено уязвимых контрактов в производстве. Функция `build_IR` класса `RawLog` не может правильно распаковать переменные, предоставленные в качестве тем. Следовательно, неверные значения регистрируются как темы. На момент публикации исправленная версия отсутствует.
CVE-2024-32481Vyper — это pythonic язык смарт-контрактов для виртуальной машины Ethereum. Начиная с версии 0.3.8 и до версии 0.4.0b1, при цикле по `range` формы `range(start, start + N)`, если `start` отрицательный, выполнение всегда будет возвращаться. Эта проблема вызвана некорректным утверждением, вставленным кодогенерацией диапазона `stmt.parse_For_range()`. Проблема возникает, когда `start` является знаковым, вместо использования `sle` используется `le`, и `start` интерпретируется как целое число без знака для сравнения. Если это отрицательное число, его 255-й бит установлен в `1` и, следовательно, интерпретируется как очень большое целое число без знака, что приводит к тому, что утверждение всегда завершается неудачей. Затронут любой контракт, имеющий `range(start, start + N)`, где `start` является целым числом со знаком с возможностью того, что `start` будет отрицательным. Если вызов проходит через цикл, предоставляя отрицательный `start`, выполнение будет возвращаться. Версия 0.4.0b1 исправляет эту проблему.
CVE-2024-26149Vyper — это питонический язык смарт-контрактов для виртуальной машины ethereum. Если в `_abi_decode` указано чрезмерно большое значение в качестве начального индекса для массива, это может привести к переполнению позиции чтения. Это приводит к декодированию значений за пределами предполагаемых границ массива, что может привести к эксплуатации в контрактах, которые используют массивы в `_abi_decode`. Эта уязвимость затрагивает версии 0.3.10 и более ранние.
CVE-2024-24567Vyper — это питонический язык смарт-контрактов для виртуальной машины ethereum. Компилятор Vyper позволяет передавать значение во встроенный raw_call, даже если вызов является delegatecall или staticcall. Но в контексте delegatecall и staticcall обработка значения невозможна из-за семантики соответствующих опкодов, и vyper будет молча игнорировать аргумент value=. Если семантика EVM неизвестна разработчику, он может подозревать, что, указав kwarg `value`, на цель будет отправлена именно данная сумма. Эта уязвимость затрагивает версии 0.3.10 и более ранние.