Анализ атаки повторного входа на проект Jarvis Network с использованием Срочных займов
Данные показывают, что 15 января 2023 года в 17:43:37 UTC проект Jarvis_Network был атакован, в результате чего было потеряно 663,101 MATIC.
Анализ стека вызовов транзакций показал, что в процессе удаления ликвидности присутствует логика повторного входа. Вызовы одной и той же функции одного и того же контракта до и после повторного входа имеют одинаковые передаваемые параметры, но возвращаемые значения значительно различаются:
Перед повторным входом: 1,002,157,321,772,769,944
После повторного входа: 10,091,002,696,492,234,934
Реинъекция происходит в функции remove_liquidity. Эта функция возвращает токены, добавленные пользователем, при удалении ликвидности. Поскольку Polygon и EVM являются однородными цепями, передача MATIC на контракт вызывает реинъекцию контракта.
Глубокий анализ показал, что проблема заключается в реализации функции getUnderlyingPrice. Эта функция включает в себя ряд внутренних вычислений и внешних вызовов, ключевым из которых является возвращаемое значение функции get_virtual_price.
Возвращаемое значение функции get_virtual_price зависит от переменной self.D. В функции remove_liquidity обновление self.D происходит после перевода токенов. Когда злоумышленник удаляет ликвидность, MATIC переводится на атакующий контракт, и при обратном вызове fallback сначала запрашивается цена токена. Поскольку self.D еще не обновлен, это приводит к ошибке получения цены.
процесс функции remove_liquidity:
Уничтожение пользовательского LP
Отправить средства пользователей на залог
Обновить self.D
Атакующий на втором шаге выполняет повторный вход, используя не обновленное значение self.D для займа, получая средства, в 10 раз превышающие нормальную цену.
Хотя функция remove_liquidity использует @nonreentrant('lock') для предотвращения повторных входов, злоумышленник обошел этот механизм защиты с помощью повторного входа через межконтракт.
Эта атака выявила несколько ключевых проблем:
Логика изменения переменных после внешнего вызова приводит к аномалиям в получении цены.
Кросс-контрактный реентрированный вызов делает замок реентрирования недействительным
Не следовал принципу "Проверка - Эффекты - Взаимодействия" (Checks-Effects-Interactions)
Для повышения безопасности, команде проекта следует:
Проведение строгого аудита безопасности
Переменные следует изменять перед внешним вызовом
Использование нескольких источников данных для получения цен
Соблюдайте кодовый стандарт "сначала оцените, затем запишите в переменную, а затем выполните внешний вызов".
С помощью этих мер можно значительно повысить безопасность и стабильность проекта, эффективно предотвращая подобные атаки.
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
11 Лайков
Награда
11
5
Поделиться
комментарий
0/400
DisillusiionOracle
· 07-25 05:19
Снова рыба была убита взрывом.
Посмотреть ОригиналОтветить0
FlatlineTrader
· 07-23 14:13
Еще одни неудачники получили коробку с обедом.
Посмотреть ОригиналОтветить0
MidnightGenesis
· 07-23 14:09
Степень обфускации кода недостаточна, это должно было произойти раньше.
Посмотреть ОригиналОтветить0
CryptoGoldmine
· 07-23 13:59
Еще одно подтверждение данных: смарт-контракты восстановили убытки в 65w
Jarvis Network подвергся атаке повторного входа через Срочные займы, убыток составил 663,101 MATIC
Анализ атаки повторного входа на проект Jarvis Network с использованием Срочных займов
Данные показывают, что 15 января 2023 года в 17:43:37 UTC проект Jarvis_Network был атакован, в результате чего было потеряно 663,101 MATIC.
Анализ стека вызовов транзакций показал, что в процессе удаления ликвидности присутствует логика повторного входа. Вызовы одной и той же функции одного и того же контракта до и после повторного входа имеют одинаковые передаваемые параметры, но возвращаемые значения значительно различаются:
Реинъекция происходит в функции remove_liquidity. Эта функция возвращает токены, добавленные пользователем, при удалении ликвидности. Поскольку Polygon и EVM являются однородными цепями, передача MATIC на контракт вызывает реинъекцию контракта.
Глубокий анализ показал, что проблема заключается в реализации функции getUnderlyingPrice. Эта функция включает в себя ряд внутренних вычислений и внешних вызовов, ключевым из которых является возвращаемое значение функции get_virtual_price.
Возвращаемое значение функции get_virtual_price зависит от переменной self.D. В функции remove_liquidity обновление self.D происходит после перевода токенов. Когда злоумышленник удаляет ликвидность, MATIC переводится на атакующий контракт, и при обратном вызове fallback сначала запрашивается цена токена. Поскольку self.D еще не обновлен, это приводит к ошибке получения цены.
процесс функции remove_liquidity:
Атакующий на втором шаге выполняет повторный вход, используя не обновленное значение self.D для займа, получая средства, в 10 раз превышающие нормальную цену.
Хотя функция remove_liquidity использует @nonreentrant('lock') для предотвращения повторных входов, злоумышленник обошел этот механизм защиты с помощью повторного входа через межконтракт.
Эта атака выявила несколько ключевых проблем:
Для повышения безопасности, команде проекта следует:
С помощью этих мер можно значительно повысить безопасность и стабильность проекта, эффективно предотвращая подобные атаки.