Анализ атаки повторного входа на Jarvis Network с использованием Срочных займов
15 января 2023 года проект Jarvis_Network подвергся серьезной атаке, в результате которой было потеряно 663,101 MATIC. Эта атака использовала комбинацию срочных займов и повторных атак, что выявило серьезные уязвимости в контракте проекта.
Атакующий ловко использовал уязвимость в функции remove_liquidity. Эта функция возвращает пользователю добавленные токены при удалении ликвидности. Поскольку цепочка Polygon совместима с EVM, при переводе MATIC на контракт срабатывает логика повторного входа контракта.
Анализ показал, что ключевой момент атаки заключается в вызове функции getUnderlyingPrice. Эта функция возвращает значительно разные цены до и после повторного входа: до повторного входа цена составляет 1002157321772769944, а после она достигает 10091002696492234934, что почти в 10 раз больше.
Корень проблемы заключается в неправильном времени обновления переменной self.D в контракте. Последовательность выполнения функции remove_liquidity: 1) уничтожение LP токенов пользователя; 2) отправка заложенных средств пользователю; 3) обновление self.D. Нападающий произвел повторный вход на втором шаге, используя еще не обновленное значение self.D для получения ошибочной информации о цене, что позволило ему провести выгодные операции по заимствованию.
Хотя функция remove_liquidity использует декоратор @nonreentrant('lock') для предотвращения повторного входа, эта мера защиты не сработала, поскольку атака включает в себя межконтрактные операции.
Этот инцидент подчеркивает несколько ключевых принципов безопасности:
Изменения переменных должны быть завершены до внешнего вызова, чтобы предотвратить несоответствие состояния.
Механизм получения цен должен использовать многодатные источники для повышения надежности.
Логика кода должна следовать модели "Проверка-Эффекты-Взаимодействия"(Checks-Effects-Interactions), то есть сначала проводить проверку условий, затем изменять переменные состояния, и только потом осуществлять внешние вызовы.
Эта атака снова подтвердила, что безопасность аудита смарт-контрактов имеет решающее значение. Проектные команды должны уделять больше внимания безопасности контрактов, чтобы обеспечить тщательную и всестороннюю проверку кода, чтобы предотвратить подобные уязвимости.
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
Jarvis Network подвергся атаке повторного входа через Срочные займы, убыток составил 66 тысяч MATIC.
Анализ атаки повторного входа на Jarvis Network с использованием Срочных займов
15 января 2023 года проект Jarvis_Network подвергся серьезной атаке, в результате которой было потеряно 663,101 MATIC. Эта атака использовала комбинацию срочных займов и повторных атак, что выявило серьезные уязвимости в контракте проекта.
Атакующий ловко использовал уязвимость в функции remove_liquidity. Эта функция возвращает пользователю добавленные токены при удалении ликвидности. Поскольку цепочка Polygon совместима с EVM, при переводе MATIC на контракт срабатывает логика повторного входа контракта.
Анализ показал, что ключевой момент атаки заключается в вызове функции getUnderlyingPrice. Эта функция возвращает значительно разные цены до и после повторного входа: до повторного входа цена составляет 1002157321772769944, а после она достигает 10091002696492234934, что почти в 10 раз больше.
Корень проблемы заключается в неправильном времени обновления переменной self.D в контракте. Последовательность выполнения функции remove_liquidity: 1) уничтожение LP токенов пользователя; 2) отправка заложенных средств пользователю; 3) обновление self.D. Нападающий произвел повторный вход на втором шаге, используя еще не обновленное значение self.D для получения ошибочной информации о цене, что позволило ему провести выгодные операции по заимствованию.
Хотя функция remove_liquidity использует декоратор @nonreentrant('lock') для предотвращения повторного входа, эта мера защиты не сработала, поскольку атака включает в себя межконтрактные операции.
Этот инцидент подчеркивает несколько ключевых принципов безопасности:
Эта атака снова подтвердила, что безопасность аудита смарт-контрактов имеет решающее значение. Проектные команды должны уделять больше внимания безопасности контрактов, чтобы обеспечить тщательную и всестороннюю проверку кода, чтобы предотвратить подобные уязвимости.