Зловмисник, який вивів 46 мільйонів доларів із KyberSwap, покладався на «складний і ретельно розроблений експлойт смарт-контракту», щоб здійснити атаку, згідно з ланцюжком соціальних мереж засновника біржі Ambient Дуга Колкітта.
Колкітт назвав експлойт «збоєм нескінченних грошей». За його словами, зловмисник скористався унікальною реалізацією функції концентрованої ліквідності KyberSwap, щоб «обдурити» контракт, переконавши його в більшій ліквідності, ніж насправді.
1/ Finished a preliminary deep dive into the Kyber exploit, and think I now have a pretty good understanding of what happened.
This is easily the most complex and carefully engineered smart contract exploit I've ever seen…
— Doug Colkitt (@0xdoug) November 23, 2023
Більшість децентралізованих бірж (DEX) забезпечують функцію «концентрованої ліквідності», яка дозволяє постачальникам ліквідності встановлювати мінімальну та максимальну ціну, за якою вони пропонуватимуть купувати чи продавати криптовалюту. За словами Колкітта, цю функцію використовував зловмисник KyberSwap для виведення коштів. Однак експлойт «специфічний для впровадження концентрованої ліквідності Kyber і, ймовірно, не працюватиме на інших DEX», — сказав він.
За словами Колкітта, атака KyberSwap складалася з кількох експлойтів проти окремих пулів, причому кожна атака була майже ідентичною. Щоб проілюструвати, як це працює, Колкітт розглянув експлойт пулу ETH/wstETH на Ethereum. Цей пул містив Ether (ETH) і Lido Wrapped Staked Ether (wstETH).
Зловмисник почав із запозичення 10 000 wstETH (вартістю 23 мільйони доларів на той час) у платформи флеш-кредитів Aave, як показано в даних блокчейну. За словами Колкітта, потім зловмисник скинув ці токени на 6,7 мільйона доларів у пул, у результаті чого їх ціна впала до 0,0000152 ETH за 1 wstETH. За цієї ціни не було постачальників ліквідності, які бажали купувати чи продавати, тому ліквідність мала бути нульовою.
Потім зловмисник вніс 3,4 wstETH і запропонував купити або продати між цінами від 0,0000146 до 0,0000153, знявши 0,56 wstETH відразу після депозиту. Колкітт припустив, що зловмисник міг вилучити 0,56 wstETH, щоб «зробити наступні чисельні розрахунки ідеальними».
Після внесення та зняття зловмисник здійснив другий і третій обмін. Другий своп підняв ціну до 0,0157 ETH, що повинно було дезактивувати ліквідність зловмисника. Третій своп підштовхнув ціну до 0,00001637. Це також було за межами цінового діапазону, встановленого власним порогом ліквідності зловмисника, оскільки тепер воно було вище їх максимальної ціни.
Теоретично, останні два свопи не повинні були досягти нічого, оскільки зловмисник купував і продавав власну ліквідність, оскільки для кожного іншого користувача була встановлена мінімальна ціна набагато нижча за ці значення. «За відсутності числової помилки хтось, хто це робить, просто торгував би туди-сюди з власною ліквідністю, — заявив Колкітт, додавши, — і всі потоки зведені до нуля (мінус комісії)».
Однак через особливість арифметики, яка використовується для розрахунку верхньої та нижньої меж цінових діапазонів, протокол не зміг видалити ліквідність в одному з перших двох свопів, але також додав її назад під час остаточного свопу. У результаті пул закінчився «подвійним підрахунком ліквідності з початкової позиції LP», що дозволило зловмиснику отримати 3911 wstETH за мінімальну суму ETH. Хоча зловмиснику довелося скинути 1052 wstETH під час першого свопу, щоб здійснити атаку, це все одно дозволило йому отримати прибуток у розмірі 2859 wstETH (6,7 мільйона доларів за сьогоднішньою ціною) після погашення термінової позики.
Очевидно, зловмисник повторив цей експлойт проти інших пулів KyberSwap у кількох мережах, врешті-решт зібравши криптовалюту на загальну суму 46 мільйонів доларів.
За темою: біржа HTX втрачає 13,6 млн доларів через гарячий злом гаманця: звіт
За словами Колкітта, KyberSwap містив механізм безпеки у функції computeSwapStep, який був призначений для запобігання цьому експлойту. Однак зловмиснику вдалося зберегти числові значення, використані в обміні, за межами діапазону, який спричинив би спрацьовування захисту від відмов, як заявив Колкітт:
«Кількість охоплення» була верхньою межею для досягнення межі тиків, яка була розрахована як …22080000, тоді як експлуататор встановив кількість обміну на …220799999[.] Це показує, наскільки ретельно розроблений цей експлойт. Перевірка не виконана на <0,00000000001%».
Колкітт назвав атаку «найскладнішим і ретельно спроектованим експлойтом смарт-контракту, який я коли-небудь бачив».
Як повідомляв Cointelegraph, 22 листопада KyberSwap було використано на 46 мільйонів доларів. Команда виявила вразливість 17 квітня, але в результаті цього інциденту не було втрачено жодних коштів. Інтерфейс користувача біржі також був зламаний у вересні минулого року, хоча всі користувачі отримали компенсацію в цьому інциденті. Зловмисник 22 листопада повідомив команду, що готовий вести переговори про повернення частини коштів.