Глибокий аналіз інциденту з крадіжкою $9M активів Yearn: від вразливості протоколу до зникнення доларової вартості

1 грудня 2025 року протокол Earn зазнав добре спланованої багаторівневої атаки з використанням композицій в історії DeFi, що врешті-решт призвело до втрати приблизно $9 мільйонів користувацьких активів. Це не проста єдина точка експлуатації, а систематичне знищення зловмисниками, які використовують флеш-кредити для залучення коштів, прориву механізмів захисту протоколів шар за шаром, безкінечного створення токенів LP, пов’язаних із yETH, і зрештою виснаження пулу. Цей інцидент ще раз попереджає всю індустрію: ризик безпеки DeFi-протоколів полягає не в одній вразливості, а в накладанні численних недоліків — це найскладніший режим атаки в галузі для захисту.

Огляд події: Як флеш-кредити можуть стати здобиччю для багатоступеневих атак

Стратегія фінансування зловмисника може здаватися звичайною, але вона закладає основу для низки наступних ланцюгових операцій. Вони одночасно запускали флеш-кредити за протоколами Balancer і Aave, а також одночасно надавали велику кількість деривативів ETH, таких як wstETH, rETH, WETH, ETHx і cbETH. Ці активи не потрапляли безпосередньо в транзакцію, а були ретельно розподілені: 100 із 1 100 ETH було надіслано Tornado. Готівка для змішування — крок, справжня мета якого полягала в тому, щоб приховати джерело коштів і прокласти шлях для подальших операцій «відбілювання».

Після завершення змішування зловмисник вивів 100 ETH 0x3e8e7533dcf69c698Cf806C3DB22f7f10B9B0b97 адресу шкідливого контракту і активував функцію резерву. У цьому прихованому відскоку всі позичені активи конвертувалися на LP-токени для yETH зваженого стейблсвопу пулу – еквівалент купівлі «акційних сертифікатів» для цього пулу. На перший погляд це звичайна ін’єкція ліквідності, але насправді це фінальна підготовка до витонченої «техніки опорожнення басейну».

Три основні вразливості: фатальна комбінація втрати точності, скорочення доходу та нульової ініціалізації постачання

Вразливість першого рівня: втрата точності та безкоштовне втручання у стан

У технічному центрі всієї атаки лежить, здавалося б, незначна помилка в коді:remove_liquidity функція не призводить до короткого замикання нульової величини

Перший крок атакуючого — навмисно створити крайній дисбаланс ресурсів у пулі. Він неодноразово називав функцію add_liquidity (додавання ліквідності), але свідомо пропускав введення індексу 3 (rETH), індексу 6 (wOETH) та індексу 7 (mETH), штучно збільшуючи розрив у співвідношенні між цими трьома активами та іншими активами. Згодом він односторонньо ввів величезну кількість rETH, що ще більше розширило дисбаланс.

У цьому надзвичайно незбалансованому стані пулу атакуючий викликає remove_liquidity, але вводить параметр суми виведення 0. Згідно з традиційною логікою, виведення 0 токенів має повертатися безпосередньо і взагалі не змінювати стан. Але контракт pool.vy цього не робить — він все одно виконує повний цикл розрахунку vb_prod (віртуальний балансовий продукт).

У математичному середовищі екстремального дисбалансу ваги функція _pow_down (округлення вниз) призводить до значної втрати точності. Контракт неправильно обчислює мале значення vb_prod і записує це змінене значення у глобальний стан packed_pool_vb. По суті, зловмисник успішно втрутився у балансову вартість усього пулу за допомогою операції «нульова вартість» (жодних токен не було передано).

Лазівки другого рівня: продаж доходів і ерозія часток

Другий рівень вразливостей більш прихований. Коли зловмисник викликає update_rates функцію, це активує внутрішню _update_supply логіку. Оскільки vb_prod були зловісно придушені, система створила хибне уявлення, що загальна вартість пулу різко зменшилася. Щоб збалансувати баланс, контракт автоматично спалює велику кількість LP-токенів, які належать стейкінгу.

Зловмисник точно провів арбітражні операції до і після оновлення валютного курсу. Кожен дзвінок update_rates оновити курс конкретного активу (наприклад, wOETH, mETH), а потім одразу здійснити дзвінок remove_liquidity зняти актив. Оскільки велика кількість акцій контракту зі стейкінгу була знищена, відносно більша частка часток LP у руках зловмисника пасивно зросла. Повторюючи цикл «оновлення-вилучення-спалювання», зловмисник крок за кроком видавлював фактичний баланс wOETH і mETH у пулі, одночасно доводячи Total Supply пулу до небезпечної межі нульового значення.

Вразливість рівня 3: точка перелому необмеженого карбування нульового постачання

Після серії операцій на перших двох етапах пул було спорожнено: загальна пропозиція близька до 0, а залишок wOETH і mETH надзвичайно низький. У цей момент нападник завдає останнього фатального удару: викликає add_liquidity з введеними параметрами [1, 1, 1, 1, 1, 1, 1, 9] — тобто перші сім активів кожне вводять по 1 вей (найменшу одиницю), а восьму (mETH) — 9 вей.

Ця, здавалося б, абсурдна операція спричинила обчислювальний зрив контракту в критичний момент, коли пул мав бути знищений. Ітеративна формула _calc_supply не спрацювала при роботі з мінімальною вартістю, і контракт був неправильно викарбуваний235 443 токени LP на yETH。 Це еквівалентно створенню мільйонів доларів фейкових активів з повітря.

Детальне пояснення чотирьох стадій атаки: від крайнього дисбалансу до нескінченного карбування

Етап 1: Підготовка фонду та ініціалізація стану пулу

  • Позичати кілька похідних ETH у Balancer та Aave
  • Приховати джерело коштів за допомогою Tornado. Змішування готівки
  • Конвертація всіх змішаних фондів і позичених активів у токени yETH LP

Етап 2: Штучне виробництво крайнього дисбалансу

  • Повторні односторонні вливання ліквідності, пропускаючи конкретні токени (rETH, wOETH, mETH)
  • Одностороннє введення великих обсягів rETH ще більше поглиблює дисбаланс
  • Цей етап створює математичні умови для втрати точності

Етап 3: Вилучення доходів і захоплення акцій

  • Активувати втрату стану точності на remove_liquidity (0).
  • Колл update_rates оновлення курсу обміну, що призводить до знищення токенів LP контракту на стейкінг
  • Повторні арбітражні операції для зневантаження балансів wOETH і mETH
  • Загальна пропозиція пулу зведена до 0

Фаза 4: Нульовий запас, необмежене карбування

  • Викликати add_liquidity, коли пул ось-ось буде знищений ([1,1,1,1,1,1,1,1,9])
  • Розрахунок _calc_supply контракту збився, неправильно відкарбування 235 443 LP-токени
  • Зловмисник завершує обмін активами через Exchange and Redeem
  • Погашення швидких позик, обмін придбаних активів на ліквідні активи, такі як Bitcoin та долари США, для ліквідації

Шлях відстеження та ліквідації фонду: втрата вартості від yETH до USD

Найкраща чорна комедія цієї атаки полягає у ланцюжку втечі коштів. 235 443 LP-токени, отримані зловмисниками, поступово були обміняні на ETH і стейблкоїни через серію операцій обміну. Ці активи потім обмінюються на більш приховані форми активів, такі як біткоїн, через торгові пари DEX, а зрештою мільйони доларів активів обмінюються на готівку або біткоїн через позабіржові (OTC) платформи. Протягом усього процесу $9 мільйонів користувацьких коштів були явно переведені з протокольного балансу на гаманець зловмисника в ланцюжку, а потім поступово обміняні на долари США, біткоїни тощо, і зрештою втекли.

Наслідки для індустрії: як DeFi-протоколи можуть захистити від складних атак на склад

З цього інциденту є три ключові уроки:

Урок 1: Посилити перевірку краю сцени DeFi-протоколи повинні проводити суворі логічні перевірки крайових сценаріїв, таких як «нульова кількість» та «крайній дисбаланс». remove_liquidity має повертатися одразу після отримання параметра 0, а не виконувати повний обчислювальний цикл. Такий тип «короткого замикання» може здаватися простим, але він ефективно запобігає можливості втручання в стан.

Урок 2: Оптимізація логіки точних розрахунків _pow_down та інші функції, що передбачають екстремальні пропорційні розрахунки, повинні впроваджувати захисні механізми. Розгляньте використання більш складної чисельної бібліотеки обробки, додавання виявлення проміжного переповнення або використання різних гілок алгоритмів у екстремальних ситуаціях. Історично протокол Balancer зазнавав критики через схожі проблеми з точністю, що є уроком із минулого.

Урок 3: Встановити моніторинг багатовимірних аномалій Необхідно створити систему моніторингу в режимі реального часу для раннього попередження про такі операції:

  • Висока частота одностороннього вливання ліквідності призводить до значного дисбалансу в пулі
  • Аномальні коливання валютного курсу та автоматичні події вигоряння
  • Незвичайна частота операцій з нульовою сумою та операції з мінімальною вартістю
  • Загальна пропозиція пулу різко коливається за короткий проміжок часу

Для всієї екосистеми DeFi цей інцидент доводить глибоку істину:Безпека — це не виправлення вразливості, а систематичне запобігання поєднанню множинних недоліків。 Розробникам протоколів потрібно дивитися на логіку коду з точки зору повного процесу і не відпускати жодних, здавалося б, «нешкідливих» недоліків дизайну. Водночас індустрії потрібно посилити можливості відстеження та заморожування капіталу зловмисників у блокчейні, а також покращити загальні можливості захисту через чорні списки DEX і контроль ризиків на платформі OTC. Хак Yearn — це не кінець, але має стати каталізатором еволюції безпеки всієї індустрії.

BAL-2,19%
AAVE-6,64%
ETH-2,5%
BTC-1,62%
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • Прокоментувати
  • Репост
  • Поділіться
Прокоментувати
Додати коментар
Додати коментар
Немає коментарів
  • Закріпити