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