Мережа Jarvis зазнала атаки повторного входу через Термінові позики, втративши 66.3 тисячі MATIC.

Аналіз атаки повторного входу на Jarvis Network за допомогою термінових позик

Нещодавно проект під назвою Jarvis_Network зазнав термінового позики повторного нападу, що призвело до втрат приблизно 663 тисяч токенів MATIC. Ця подія сталася ввечері 15 січня 2023 року.

Аналіз події атаки повторного входу на термінові позики Jarvis Network

Провівши глибокий аналіз стеку викликів транзакцій, ми виявили, що зловмисник скористався вразливістю повторного виклику. Під час повторного виклику функція одного й того ж контракту викликалася кілька разів, але значення, що поверталися в кожному виклику, мали величезні відмінності. Ця різниця в основному проявляється у функції remove_liquidity.

Аналіз події атаки повторного входу на Термінові позики Jarvis Network

Атака повторного входу відбувається під час процесу видалення ліквідності. Оскільки Polygon і EVM є однорідними ланцюгами, коли MATIC передається контракту, спрацьовує логіка повторного входу контракту. Провівши детальний аналіз стеку викликів, ми виявили, що проблема полягає у функції getUnderlyingPrice.

Аналіз події атаки повторного входу на Термінові позики Jarvis Network

Подальше розслідування виявило, що зловмисники під час видалення ліквідності скористалися вразливістю в моменті оновлення змінної self.D. У нормальних умовах процес методу remove_liquidity має бути таким: 1) знищити LP користувача; 2) надіслати заставні кошти користувачу; 3) оновити self.D. Однак зловмисники виконали повторний вхід на другому етапі, що призвело до серйозних помилок у розрахунку ціни.

Аналіз події атаки повторного входу термінових позик Jarvis Network

Хоча функція remove_liquidity використовує декоратор @nonreentrant('lock') для запобігання повторному входу, через те, що зловмисник може повторно увійти в інші контракти для запозичення коштів, цей замок повторного входу не спрацював.

Аналіз події атаки повторного входу на термінові позики Jarvis Network

Ця атака в основному виявила дві проблеми:

  1. Логіка зміни змінної знаходиться після зовнішнього виклику, що призводить до аномалії отримання ціни.
  2. Крос-контрактний повторний вхід робить замок повторного входу неефективним.

Аналіз події атаки повторного входу на термінові позики Jarvis Network

Щоб запобігти подібним атакам, рекомендується, щоб проектна команда вжила наступні заходи:

  1. Переконайтеся, що код пройшов суворий аудит безпеки.
  2. Перемістіть зміни змінних перед зовнішнім викликом.
  3. Використання кількох джерел даних для отримання цін.
  4. Дотримуйтесь кодувального стандарту "спочатку перевіряйте, потім записуйте у змінну, а потім викликайте зовнішні функції" (Checks-Effects-Interactions).

Аналіз інциденту з повторним нападом термінових позик Jarvis Network

Завдяки вжиттю цих заходів, проект може значно підвищити свою безпеку та стабільність, надаючи користувачам більш надійні послуги.

Аналіз інциденту з повторним атакою термінових позик Jarvis Network

Аналіз події атаки повторного входу на Термінові позики Jarvis Network

Аналіз події атаки повторного входу на термінові позики Jarvis Network

! Аналіз інцидентів атаки повторного входу флеш-позики Jarvis Network

Аналіз інциденту атаки повторного входу на термінові позики Jarvis Network

Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 2
  • Поділіться
Прокоментувати
0/400
WalletAnxietyPatientvip
· 22год тому
Зелені та люблять грати роздрібні інвестори, пам’ятайте про регулярне резервне копіювання Закритого ключа

Мова вмісту: китайська

Залишений коментар:

Якщо не проводити аудит контрактів, будуть такі втрати~
Переглянути оригіналвідповісти на0
LiquidatedNotStirredvip
· 22год тому
Знову повторний вхід, ха-ха. Треба було давно заблокувати.
Переглянути оригіналвідповісти на0
  • Закріпити