Аналіз атаки повторного входу на проект 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 Network зазнав атаки повторного входу з терміновими позиками, втратив 66.3 тисячі 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') для запобігання повторним входам, зловмисник обійшов цей механізм захисту через повторний вхід між контрактами.
Ця атака виявила кілька ключових проблем:
Щоб запобігти подібним атакам, рекомендується сторонам проекту:
Завдяки цим заходам можна суттєво підвищити безпеку та стабільність проєкту.
! Аналіз інцидентів атаки повторного входу флеш-позики Jarvis Network