Аналіз вразливості балансира

фон

22 серпня Balancer офіційно оголосив, що отримав серйозні звіти про вразливості кількох пулів V2 Boost. Було вражено лише 1,4% TVL. Кілька пулів було призупинено, а користувачів було повідомлено про необхідність якнайшвидше зняти LP ліквідності. [1] [2]

27 серпня система SlowMist MistEye виявила транзакцію атаки, підозрювану в використанні вразливості Balancer. [3]

Оскільки пул неможливо призупинити, а деякі кошти все ще постраждали від атаки, представники Balancer ще раз нагадують користувачам отримати LP у постраждалому пулі. [4] Згодом Balancer офіційно оприлюднив подробиці вразливості, розкритої в серпні на Medium. [5] , команда безпеки SlowMist перевірила його, деталі такі:

Вступ

Представники Balancer просто вказали у своєму розкритті, що цього разу проблема полягає в тому, що округлення вниз лінійного пулу та віртуальна пропозиція комбінованого пулу призвели до того, що bptSupply дорівнює 0. Спочатку давайте коротко розберемося зі змістом протоколу Balancer, пов’язаного з цією вразливістю.

Balancer V2 Vault

Балансир V2 [6] Протокол є децентралізованим автоматизованим протоколом маркет-мейкера (AMM), заснованим на Ethereum, який являє собою гнучкий будівельний блок для програмованої ліквідності. Його основним компонентом є контракт Vault, який зберігає записи про всі пули та керує обліком і передачею токенів, навіть включаючи пакування та розпакування рідного ETH. Іншими словами, Vault реалізовано для того, щоб відокремити облік і керування маркерами від логіки пулу.

У Vault є чотири інтерфейси, а саме joinPool, exitPool, swap і batchSwap (приєднання, вихід і обмін — це окремі виклики, і в одному виклику немає комбінації). Однією з видатних особливостей є batchSwap, який може реалізувати кілька атомарних обмінів між декількома пулами та з’єднати вихід одного пулу обміну з входом іншого пулу (GiveIn і GiveOut). Система також вводить блискавичну заміну [7] , подібно до внутрішньої флеш-кредиту.

Лінійні пули Лінійний пул

Щоб покращити капітальну ефективність LP і вирішити проблему великих накладних витрат на деформацію та розгортання, Balancer запустив лінійний пул як рішення у V2, таким чином представивши токен BPT (ERC20 Balancer Pool Token).

лінійний басейн [8] Включно з основним токеном (базовим активом), загорнутим токеном (загорнутим токеном) і токеном BPT, активи та їх загорнуті аналоги з прибутком обмінюються за відомими обмінними курсами. Чим вища частка загорнутих токенів, тим вищий прибуток і ефективність капіталу пулу. Під час процесу деформації зазвичай використовуються коефіцієнти масштабування, щоб гарантувати, що різні токени обчислюються з однаковою точністю.

Composable Pools Composable Pool

Усі пули Balancer є складними пулами, які містять інші токени, а сам пул також має власні токени. Серед них валюта BPT відноситься до токена збалансованого пулу ERC20, який є основою всіх пулів. Користувачі можуть вільно комбінувати токени BPT в інших пулах для викупу. Погашення завжди передбачає один пул і два токени: GiveIn і GiveOut. In означає надсилання токенів компонента та отримання BPT, тоді як Out означає надсилання BPT та отримання токенів компонента. Якби сам BPT був складовим токеном, його можна було б обміняти, як і інші токени. Така реалізація являє собою простий пакетний шлях обміну між базовими активами та токенами у зовнішньому пулі. Користувачі можуть використовувати BPT для обміну на базові активи лінійного пулу. Це також Balancer Boosted Pool. [9] фундамент.

Завдяки наведеній вище комбінації формується комбінований пул Balancer. Складений стабільний пул bb-a-USD складається з трьох лінійних пулів, які надсилають неактивну ліквідність до зовнішнього протоколу (Aave). Наприклад, bb-a-DAI — це лінійний пул, що містить DAI і waDAI (загорнутий aDAI). Коли користувачеві потрібно виконати batchSwap (наприклад, змінити USDT на DAI), приклад шляху обміну такий:

  1. У лінійному пулі USDT обміняйте USDT на bb-a-USDT (введіть лінійний пул USDT);

  2. У bb-a-USD bb-a-USDT обмінюється на bb-a-DAI (обмін між лінійними BPT);

  3. У лінійному пулі DAI bb-a-DAI обмінюється на DAI (вихід з лінійного пулу DAI).

Після короткого розуміння наведених вище необхідних знань ми переходимо за посиланням аналізу вразливостей.

аналізувати

27 серпня команда безпеки SlowMist отримала інформацію від системи MistEye про те, що передбачувана вразливість Balancer була використана в дикій природі. торгівля [3] наступним чином:

Спочатку зловмисник позичив 300 000 USDC у AAVE через швидку позику. Потім викликається операція batchSwap Vault, щоб виконати обчислення обміну токенів BPT через об’єднаний стабільний пул bb-a-USD Нарешті, 94 508 USDC обмінюються на 59 964 bb-a-USDC, 68 201 bb-a-DAI і 74 280 bb-a-USDT. Нарешті, отримані токени BPT вийдуть з пулу через exitPool контракту Vault в обмін на базові активи, погасять флеш-кредит і залишать ринок із прибутком у розмірі приблизно 108 843,7 доларів США.

Можна побачити, що ключ до цієї атаки лежить у batchSwap, і що саме сталося в batchSwap? Давайте подивимося ближче.

Протягом усього процесу batchSwap зловмисник спочатку викупив USDC у пулі bb-a-USDC, а потім обміняв токени BPT, обмінявши bb-a-USDC на bb-a-DAI, bb-a-USDT і USDC. Нарешті, базовий основний токен USDC обмінюється на bb-a-USDT. Іншими словами, bb-a-USDC, як ключовий токен BPT, служить маркером компонента GiveOut і GiveIn.

На першому кроці зловмисник обмінює токени BPT на основні токени USDC у лінійному пулі bb-a-USDC із фіксованим коефіцієнтом масштабування, а збільшена сума записується в bptBalance у пулі. Але після другого обміну onSwap ми виявили, що сума USDC, обміняна під час того самого процесу обміну, дорівнює 0. Чому це?

Заглиблюючись у функцію onSwap, ми виявили, що в цьому процесі точність буде оброблено до номінальної та буде обчислено коефіцієнт масштабування відповідного токена. Під час наступного виклику функції _downscaleDown сума Out округлюється в меншу сторону. Якщо сумаOut і scalingFactors [indexOut] Різниця між значеннями велика, а обчислене значення _downscaleDown дорівнює нулю.

Тобто, коли ми використовуємо токени BPT для викупу основних токенів, якщо сума Out замала, повернене значення буде округлено до нуля, і це значення буде меншим за 1e12, обчислене за допомогою scalingFactors. Однак сума bb-a-USDC, що надходить із сумаIn, усе одно буде додана до віртуальної суми bptBalance, і ця операція збільшить баланс у пулі bb-a-USDC, що можна розглядати як одностороннє додавання bb -a-ліквідність USDC.

Потім, використовуючи характеристики об’єднаного стабільного пулу, шляхом взаємної конвертації між токенами BPT, спочатку обміняйте bb-a-USDC на інші токени BPT. Щоб слідувати цьому процесу обміну, ви можете поєднати такий шлях виклику стабільного пулу: bb-a-DAI onSwap -> _swapGivenIn -> _onSwapGivenIn. Спочатку замініть bb-a-USDC на bb-a-DAI і bb- a-USDT у послідовності. На відміну від онлайн-лінійних пулів, складані стабільні пули потребують оновлення кешу обмінного курсу перед операціями onSwap. З коду ми бачимо, що в пулі комбінацій onSwap спочатку визначить, чи потрібно оновлювати обмінний курс кешованого токена.

Після попереднього обміну кількість bb-a-USDC змінилася, і реальна загальна сума після номіналізації через _toNominal становить totalBalance 994 010 000 000, а віртуальна пропозиція токенів BPT становить 20 000 000 000. Можна підрахувати, що оновлений курс обміну майже в 45 разів перевищує вихідний курс обміну кешу лінійного пулу в 1 100 443 876 587 504 549, що становить 49 700 500 000 000 000 000.

Згодом bb-a-USDC обмінюється на USDC у лінійному пулі. Однак цей обмін такий самий, як другий обмін, що знову спричиняє округлення сумаOut до 0, а шлях обміну такий самий, як і раніше.

Наступним обміном є розворот USDC на bb-a-USDC, а шлях обміну: onSwap -> onSwapGivenIn -> _swapGivenMainIn. Під час цього процесу ми виявили, що під час розрахунку суми Out, яку потрібно викупити, розрахунок віртуальної пропозиції базується на різниці між загальною пропозицією викупленого токена BPT і сумою, що залишилася в пулі, яка дорівнює 0 .

Це пояснюється тим, що bptSupply дорівнює 0, а функція _toNominal викликається безпосередньо під час обчислення BPT Out, і виклик цього шляху робить співвідношення обміну USDC до bb-a-USDC близьким до 1:1.

Підсумуйте

batchSwap з’єднує вихід обміну одного пулу з входом іншого пулу (tokenIn і tokenOut) за допомогою кількох атомарних свопів між кількома пулами та перетворює USDC на токени BPT. У цьому batchSwap фактичної передачі токенів не відбувається, але остаточна сума обміну підтверджується шляхом запису суми, переданої вхід і вихід. І оскільки лінійний пул обмінюється через токен базового активу, метод обміну полягає в обчисленні ставки за допомогою віртуальної пропозиції та фіксованого алгоритму. Тому в batchSwap є дві дірки в безпеці:

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

По-друге, завдяки характеристикам віртуальної пропозиції комбінованого пулу, віртуальна пропозиція обчислюється шляхом віднімання балансу в пулі з токена BPT. Якщо GiveIn є токеном BPT на момент викупу, ця частина буде вирахована з наступного токена постачання. , зловмиснику потрібно лише обміняти BPT як GiveIn і спочатку маніпулювати його поставкою до 0, а потім виконати зворотний своп, тобто BPT потім використовувати як сторону GiveOut. На цей час, оскільки поставка дорівнює 0, алгоритм буде близьким до 1: коефіцієнт 1 нижчий, ніж коефіцієнт погашення лінійного пулу для фактичного погашення, через що кількість токенів BPT GiveOut опосередковано маніпулюється.

Ми можемо виявити, що вразливість один підвищує курс обміну, а вразливість 2 знижує курс у зворотному напрямку.Зловмисник скористався перевагою подвійного бафа, щоб отримати прибуток і піти.

Довідкове посилання:

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

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