Анализ атаки повторного входа на Jarvis Network с использованием Срочные займы
Недавно проект под названием Jarvis_Network подвергся атаке реинжекции срочных займов, в результате чего было потеряно около 663000 токенов MATIC. Это событие произошло вечером 15 января 2023 года.
Путем глубокого анализа стека вызовов транзакций мы обнаружили, что злоумышленник использовал уязвимость повторного входа. В процессе повторного входа было сделано несколько вызовов одной и той же функции одного и того же контракта, но возвращаемые значения при каждом вызове имели огромные различия. Эти различия в основном проявляются в функции remove_liquidity.
Атака повторного входа происходит в процессе удаления ликвидности. Поскольку Polygon и EVM являются однородными цепями, когда MATIC переводится на контракт, срабатывает логика повторного входа контракта. Проведя детальный анализ стека вызовов, мы обнаружили, что проблема заключается в функции getUnderlyingPrice.
Дальнейшее расследование показало, что злоумышленники использовали уязвимость в момент обновления переменной self.D при удалении ликвидности. В нормальных условиях процесс метода remove_liquidity должен быть следующим: 1) уничтожение LP пользователя; 2) отправка залоговых средств пользователю; 3) обновление self.D. Однако злоумышленники выполнили повторный вызов на втором этапе, что привело к серьезным ошибкам в расчетах цен.
Несмотря на то, что функция remove_liquidity использует декоратор @nonreentrant('lock') для предотвращения повторных входов, этот замок на повторный вход не сработал, так как атакующий повторно вошел в другие контракты, чтобы занять средства.
Эта атака в основном выявила две проблемы:
Логика изменения переменной находится после внешнего вызова, что приводит к аномалии получения цены.
Кросс-контрактный повторный вход делает блокировку повторного входа неэффективной.
Чтобы предотвратить подобные атаки, рекомендуется, чтобы команда проекта приняла следующие меры:
Убедитесь, что код прошел строгую безопасность аудита.
Поместите изменение переменной перед внешним вызовом.
Используйте несколько источников данных для получения цен.
Следуйте кодировочной норме "Сначала проверка, затем запись в переменную, затем внешние вызовы" (Checks-Effects-Interactions).
Принятие этих мер может значительно повысить безопасность и стабильность проекта, предоставляя пользователям более надежные услуги.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
9 Лайков
Награда
9
2
Поделиться
комментарий
0/400
WalletAnxietyPatient
· 23ч назад
Опытный и любящий играть розничный инвестор, не забудьте вовремя сделать резервную копию Закрытого ключа
Язык контента: китайский
Данный комментарий:
Если не проводить аудит контрактов, будете страдать от таких убытков~
Посмотреть ОригиналОтветить0
LiquidatedNotStirred
· 23ч назад
Снова реентри, ха-ха, давно следовало заблокировать.
Сеть Jarvis подверглась атаке повторного входа через срочные займы, убыток составил 66,3 тысячи MATIC.
Анализ атаки повторного входа на Jarvis Network с использованием Срочные займы
Недавно проект под названием Jarvis_Network подвергся атаке реинжекции срочных займов, в результате чего было потеряно около 663000 токенов MATIC. Это событие произошло вечером 15 января 2023 года.
Путем глубокого анализа стека вызовов транзакций мы обнаружили, что злоумышленник использовал уязвимость повторного входа. В процессе повторного входа было сделано несколько вызовов одной и той же функции одного и того же контракта, но возвращаемые значения при каждом вызове имели огромные различия. Эти различия в основном проявляются в функции remove_liquidity.
Атака повторного входа происходит в процессе удаления ликвидности. Поскольку Polygon и EVM являются однородными цепями, когда MATIC переводится на контракт, срабатывает логика повторного входа контракта. Проведя детальный анализ стека вызовов, мы обнаружили, что проблема заключается в функции getUnderlyingPrice.
Дальнейшее расследование показало, что злоумышленники использовали уязвимость в момент обновления переменной self.D при удалении ликвидности. В нормальных условиях процесс метода remove_liquidity должен быть следующим: 1) уничтожение LP пользователя; 2) отправка залоговых средств пользователю; 3) обновление self.D. Однако злоумышленники выполнили повторный вызов на втором этапе, что привело к серьезным ошибкам в расчетах цен.
Несмотря на то, что функция remove_liquidity использует декоратор @nonreentrant('lock') для предотвращения повторных входов, этот замок на повторный вход не сработал, так как атакующий повторно вошел в другие контракты, чтобы занять средства.
Эта атака в основном выявила две проблемы:
Чтобы предотвратить подобные атаки, рекомендуется, чтобы команда проекта приняла следующие меры:
Принятие этих мер может значительно повысить безопасность и стабильность проекта, предоставляя пользователям более надежные услуги.
! Анализ инцидентов атаки на повторный вход в сеть Jarvis
Язык контента: китайский
Данный комментарий:
Если не проводить аудит контрактов, будете страдать от таких убытков~