Аналіз атаки Sonne Finance

Середній6/11/2024, 6:38:14 AM
Суть цієї атаки полягає у створенні ринку (soToken), де зловмисник виконав першу операцію мінтинг застави з невеликою кількістю базового токена, в результаті чого для soToken вийшло дуже маленьке значення "totalSupply".

15 травня 2024 року Sonne Finance зазнала атаки на ланцюжок Optimism, що призвело до збитків у розмірі до $20 млн. Після атаки користувач Twitter @tonyke_bot написав у Твіттері, що вони захистили решту 6,5 мільйона доларів у пулі застави Sonne Finance (також відомому як ринок, подібно до cToken у Compound) приблизно 100 доларами.


(https://twitter.com/tonyke_bot/status/1790547461611860182)

Виявивши атаку, команда Sonne Finance швидко поставила на паузу всі ринки на Optimism і заявила, що ринки на Base безпечні.

(https://twitter.com/SonneFinance/status/1790535383005966554)

Короткий опис атаки

Sonne Finance — це децентралізований протокол кредитування, який відгалужує Compound V2 на Optimism, надаючи окремим особам, установам і протоколам доступ до фінансових послуг. Sonne Finance протокол об'єднує токен-активи користувачів, щоб сформувати кредитний пул ліквідності, надаючи користувачам кредитний бізнес, подібний до банківського. Як і Compound, протокол учасники можуть закласти свої токени в пул ліквідності кредитування Sonne Finance і отримати сертифікат soToken (те саме, що і cToken). SoToken - це сертифікат активу, що приносить відсотки, який буде приносити певну суму доходу в міру просування блоку, а також буде отримувати заохочення SONE token. Учасники також можуть позичати інші токени з пулу кредитних активів Sonne з soToken на руках. Наприклад, учасники можуть закласти певну суму USDC для отримання сертифікатів soUSDC, а потім позичити WETH для подальшого обігу. Іпотечне кредитування в протокол Sonne Finance може бути взаємозв'язком «багато-до-багатьох». У процесі іпотечного кредитування протокол автоматично розрахує коефіцієнт здоров'я (Health Factor) адреси учасника. Коли коефіцієнт здоров'я буде нижчим за 1, іпотека за адресою Продукти буде підтримка ліквідація, а ліквідатори також можуть отримати певні ліквідація винагороди.

Взаємозв'язок між кількістю базових токенів, внесених користувачами, і викарбуваними токенами soTokens в основному пов'язаний зі змінною, яка називається exchangeRate. Ця змінна може бути приблизно використана для того, щоб вказати, скільки базового токена коштує кожен soToken. Формула розрахунку валютного курсу виглядає наступним чином:

У наведеній вище формулі totalCash відноситься до кількості базових токенів, що утримуються soToken, totalBorrows відноситься до кількості базових токенів, позичених на певному ринку, totalReserves відноситься до загальної суми резерву (включаючи відсотки, сплачені позичальником), totalSupply відноситься до кількості викарбуваних soToken.

Під час викупу користувачі можуть вказати кількість базових токенів, які вони хочуть викупити, redeemAmount, щоб розрахувати кількість токенів, які потрібно знищити, redeemTokens. Метод розрахунку приблизно такий: "redeemTokens = redeemAmount / exchangeRat". Зауважимо, що тут немає втрати точності. розібратися з.

Суть цієї атаки полягає в тому, що коли ринок (soToken) був створений, зловмисник виконав першу операцію іпотечного лиття і викарбував дуже мало soTokens з невеликою кількістю базових токенів, в результаті чого значення "totalSupply" soToken виявилося занадто малим. Потім зловмисник скористався вразливістю втрати точності контракту Solidity, а потім відправив базовий токен безпосередньо до контракту soToken (soToken не буде викарбувано, що означає, що "totalSupply" залишиться незмінним, а "totalCash" стане більшим) замість методу стейкінгу + кастингу для депозит базового токена. Така операція призводить до того, що змінна "totalCash" в контракті стає більшою, але "totalSupply" залишається незмінною, в результаті чого обмінний курс стає більшим. Врешті-решт, коли зловмисник викуповує базовий токен, soToken, який потрібно знищити, буде меншим, ніж soToken, викарбуваний під час іпотеки. Зловмисник використовує зароблений soToken, щоб позичити базовий токен WETH і USDC іншим soTokens (таким як soWETH, soUSDC), і, нарешті, отримує прибуток у розмірі 20 мільйонів доларів США.

Ключові адреси, що беруть участь в атаці

Транзакції підготовки до атаки:

https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96

Атакуйте вигідні угоди:

https://optimistic.etherscan.io/tx/0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0

Адреси, пов'язані з атаками EOA:

0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

Адреса, пов'язана зі зловмисником (контрактом):

0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8

0x02fa2625825917e9b1f8346a465de1bbc150c5b9

базовий токен(VELO Токен V2):

0x9560e827af36c94d2ac33a39bce1fe78631088db

Контракт на вразливість (soVELO, схожий на cToken від Compound):

0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

@tonyke_bot Транзакція порятунку користувачів на X:

https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a94086c200c0470c6456603c967f82ab559a5931fd181c2

Аналіз процесу атаки

Підсумок

Команда проекту Sonne Finance нещодавно прийняла пропозицію додати ринок VELO до Sonne Finance (https://twitter.com/SonneFinance/status/1786871066075206044) і організувала п'ять транзакцій через гаманець з мультипідписом, які будуть виконані через два дні ( https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7), ці п'ять транзакцій використовуються для створення ринку VELO (контракту soVELO) і встановлення деяких ключових конфігурацій ринку, таких як встановлення моделі відсоткової ставки, встановлення цінового оракула, встановлення іпотечних факторів тощо. Після створення ринку VELO користувачі можуть депозит VELO токени для мінт токенів soVELO, які, у свою чергу, можуть бути використані для запозичення інших токенів soToken.

підготовка до атаки

Етап підготовки атаки в основному полягає в тому, що зловмисник створює ринок VELO (контракт soVELO) на основі інформації в пропозиції проекту Sonne Finance після закінчення дводенного періоду блокування пропозиції, налаштовує ключові конфігурації та мінт VELO токени в контракт soVELO, закладаючи їх. токени soVELO, а також відправляє VELO токени, які він тримає, безпосередньо контракту soVELO для підвищення обмінного курсу та підготовки для отримання прибутку від подальших атак.

Конкретні кроки такі:

  1. Після закінчення дводенного періоду блокування зловмисник спочатку упаковує операції перших чотирьох транзакцій, впорядкованих у пропозиції, в одну транзакцію (транзакцію 0x45c0cc), яка використовується для створення ринку VELO (контракт soVELO) та встановлення конфігурації ключа. Коли VELO ринок ініціалізовано, exchangeRate встановлюється на "

    200,000,000,000,000,000,000,000".
  2. Зловмисник викликає функцію «мінт» контракту soVELO для депозит VELO токенів та мінт токенів soVELO. Зловмисник вказує "mintAmount" як "400 000 001" (кількість VELO токенів). Як видно з функції "exchangeRateStoredInternal", оскільки "_totalSuppl" токена soVELO на даний момент дорівнює 0, exchangeRate - це значення, встановлене в кроці 1. За формулою " mintTokens = actualMintAmount / exchangeRate ", розрахована кількість токенів soVELO, які повинні бути викарбувані в цей час, дорівнює 2. У шорт році на цьому кроці зловмисник вносить VELO токени номіналом «400 000 001» у контракт soVELO, а зловмисник отримує токени soVELO зі значенням 2.

soVELO.мінт:

  1. Зловмисник відправив VELO токени вартістю «2 552 964 259 704 265 837 526» на контракт soVELO, безпосередньо відправивши VELO токени на контракт soVELO. У цей час кількість VELO токенів, що утримуються контрактом soVELO, збільшилася, але оскільки нових токенів soVELO не було, то монета карбується, тому totalSupply залишається незмінним, а це означає, що обмінний курс, розрахований за формулою розрахунку exchangeRate, стане в цей час більшим.

  2. Зловмисник кілька разів передавав токени soVELO, що зберігалися, і, нарешті, перевів їх на іншу атаку EOA 0xae4a.

Атака з метою отримання прибутку

Фаза прибутку атаки в основному полягає в тому, що зловмисник виконує п'яту транзакцію пропозиції та позичає VELO токени безпосередньо контракту soVELO через флеш-позики для подальшого підвищення обмінного курсу. Потім зловмисник використовує токен soVELO номіналом 2 у руці, щоб запозичити базові токени, такі як WETH та USDC, з інших контрактів soToken (таких як soWETH, soUSDC тощо), і ці частини стають прибутком зловмисника. Потім зловмисник викупив свій базовий токен у контракті soVELO. У зв'язку зі збільшенням обмінного курсу та втратою точності розрахунку токенів soVELO, які необхідно знищити для викупу, зловмисник зрештою використав лише токен soVELO зі значенням 1. Майже всі раніше депоновані токени VELO були викуплені, що можна зрозуміти як використання зловмисником додаткових токенів soVELO вартістю 1 для заробітку базових токенів, таких як WETH і USDC, шляхом запозичення в інших soToken. Зловмисник використовував одну і ту ж техніку, щоб повторити атаку багато разів і в кінцевому підсумку отримав величезний прибуток.

Конкретні кроки такі:

  1. Зловмисник виконує п'яту транзакцію в пропозиції та встановлює коефіцієнт кредитування, зазначений у пропозиції.

  2. Зловмисник надає флеш-позики VELO токени номіналом «35 469 150 965 253 049 864 450 449» з пулу VolatileV2 AMM - USDC/VELO, який запускає функцію хука зловмисника. У функції хука зловмисник продовжує виконувати операцію атаки.

  3. Зловмисник відправляє VELO токени, які він тримає, на контракт soVELO для подальшого підвищення обмінного курсу. На даний момент в контракті soVELO налічується всього VELO токенів номіналом «35 471 703 929 512 754 530 287 976» (сума VELO токенів, переданих зловмисником втричі).

  4. Зловмисник створює новий договір 0xa16388a6210545b27f669d5189648c1722300b8b. У конструкторі він передає 2 токени soVELO, які він тримає, новоствореному контрактному 0xa163 (далі – 0xa163 зловмисника).

  5. Зловмисник 0xa163 використав токени soVELO, які він тримав, щоб позичити WETH вартістю «265 842 857 910 985 546 929» у soWETH.

  6. Зловмисник 0xa163 викликає функцію "redeemUnderlying" soVELO, вказуючи вартість викуплених VELO токенів як "35 471 603 929 512 754 530 287 976" (майже кількість VELO токенів, які зловмисник раніше передав або заклав у контракт soVELO). У цей час необхідно Формула "redeemTokens = redeemAmountIn / exchangeRate" використовується для розрахунку кількості токенів soVELO, які необхідно знищити для викупу.

Як видно з функції "exchangeRateStoredInternal", оскільки _totalSupply дорівнює 2, а не 0, потрібно обчислити значення exchangeRate. Згідно з формулою "exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply", поточний exchangeRate дорівнює "17,735,851,964,756,377,265,143,988,000,00 00,000,000,000,000,000", це значення набагато більше початкового валютного курсу, встановленого "200,000,000,000,000,000,000,000,000,000

".

Вартість " redeemTokens ", розрахована на основі нового обмінного курсу, становить " 1,99 ". Завдяки характеристикам округлення Solidity у бік зменшення, вартість «redeemTokens» в кінцевому підсумку дорівнює 1. Це означає, що зловмисник 0xa163 використовував токени soVELO номіналом 1 для викупу майже всіх VELO токенів, внесених раніше. При цьому зловмисник також 0xa163 заробив WETH вартістю «265 842 857 910 985 546 929», позичених у soWETH.

soVELO.redeemОснова:

soVELO.exchangeRateStoredInternal:

  1. Зловмисник 0xa163 передав усі позичені WETH та викупив VELO токени зловмиснику верхнього рівня, а потім самознищився.

  2. Зловмисник викликає функцію "liquidateBorrow" soWETH для ліквідації частини активів, запозичених за новоствореним контрактом, 0xa163 в ордер отримати назад заблокований токен soVELO номіналом 1. Наразі зловмисник тримає лише токени soVELO зі значенням 1.

  3. Зловмисник викликає функцію «мінт» soVELO і знову закладає та карбує токени soVELO з метою зібрати достатню кількість токенів soVELO номіналом 2, а потім знову виконує кроки 3-8 вище, щоб отримати прибуток від інших токенів.

  4. Зловмисник кілька разів виконує операцію на кроці 9, погашає флеш-кредит і йде з ринку з прибутком.

Як 100 доларів США залучають 6,5 мільйонів

доларів Після атаки користувач @tonyke_bot на X викарбував 0,00000011 soVELO, застейкавши 1144 VELO токенів у контракт soVELO в транзакції 0x0a284cd. Причина, по якій ця операція може запобігти зловмиснику від подальших атак, полягає в тому, що ця транзакція змінює розмір totalSupply в soVELO і кількість VELO токенів totalCash hold, і вплив зростання totalSupply на розрахунок обмінного курсу більше, ніж вплив зростання totalCash. Таким чином, обмінний курс стає меншим, в результаті чого зловмисник не лонгуючий може скористатися втратою точності, щоб заробити soVELO при проведенні атаки, що робить атаку неможливою лонгуючий.

Відстеження грошей

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

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

Зловмисник перевів на цю адресу 198 WETH, а потім за допомогою цього ж методу атаки той же метод атаки отримав незаконну вигоду в наступних транзакціях:

Після нападу адреса передала вищезгадану незаконну вигоду 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb.

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

Зловмисник перевів на цю адресу 724277 USDC та 2353 VELO, а USDC обміняв на Етер. Тоді частина коштів одразу була переведена на крос-ланцюг міст «Зоряна брама». Більша частина незаконних коштів залишається за цією адресою:

3、0xbd18100a168321701955e348f03d0df4f517c13b

Зловмисник перевів на цю адресу 33 WETH та за допомогою ланцюжка намагався відмити гроші. Посилання на відмивання грошей виглядає наступним чином:

0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。

4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770

Зловмисник перевів 563 WETH на цю адресу, а згодом на 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68, без подальших дій.

Метод відмивання грошей зловмисником цього разу відносно професійний, а методи демонструють тенденцію різноманітності. Тому для нас, учасників Web3, ми повинні продовжувати вдосконалювати наші можливості боротьби з відмиванням грошей з точки зору безпеки, а також покращувати безпеку проєктів Defi за допомогою KYT, AML та інших пов'язаних продуктів безпеки блокчейн-транзакцій.

Поради з безпеки

1、Будьте в курсі аудиту та тестування контрактів. Проведіть комплексний аудит перед розгортанням смарт-контрактів, приділивши особливу увагу всім частинам, пов'язаним з фінансовими розрахунками. По-перше, використовуйте автоматизоване тестування та скористайтеся перевагами оновлень бібліотек вразливостей у режимі реального часу для проведення ефективного сканування безпеки контрактів (індустрія також поступово відкрила вихідний код деяких зрілих інструментів аудиту безпеки, включаючи ZAN AI SCAN), поєднуючи ручний аудит для усунення проблем, які вимагають глибоких галузевих знань

.

2、До втрати точності потрібно ставитися серйозно. Проблеми з безпекою, викликані втратою точності, нескінченні, особливо в проектах Defi, де втрата точності часто призводить до серйозних фінансових втрат. Сторонам проекту та аудиторам безпеки рекомендується уважно переглянути коди з втратою точності в проекті та провести тести, щоб максимально уникнути цієї вразливості.

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

  2. Коли в контракті є ключові змінні, які залежать від значення " this.balance " або " token.balanceOf() ", потрібно уважно розглянути умови зміни ключової змінної, наприклад, чи дозволено безпосередньо передавати нативну валюту або токени в контракт. для зміни значення змінної, або значення змінної може бути змінено тільки викликом певної функції.

Відмова від відповідальності:

  1. Ця стаття передрукована з [ZAN]. Всі авторські права належать оригінальному автору [ZAN]. Якщо є заперечення проти цього передруку, будь ласка, зв'яжіться з командою Gate Learn, і вони оперативно впораються з цим.
  2. Відмова від відповідальності: Погляди та думки, висловлені в цій статті, належать виключно автору і не є жодною інвестиційною порадою.
  3. Переклад статті на інші мови здійснює команда Gate Learn. Якщо не зазначено, копіювання, розповсюдження або плагіат перекладених статей заборонено.

Аналіз атаки Sonne Finance

Середній6/11/2024, 6:38:14 AM
Суть цієї атаки полягає у створенні ринку (soToken), де зловмисник виконав першу операцію мінтинг застави з невеликою кількістю базового токена, в результаті чого для soToken вийшло дуже маленьке значення "totalSupply".

15 травня 2024 року Sonne Finance зазнала атаки на ланцюжок Optimism, що призвело до збитків у розмірі до $20 млн. Після атаки користувач Twitter @tonyke_bot написав у Твіттері, що вони захистили решту 6,5 мільйона доларів у пулі застави Sonne Finance (також відомому як ринок, подібно до cToken у Compound) приблизно 100 доларами.


(https://twitter.com/tonyke_bot/status/1790547461611860182)

Виявивши атаку, команда Sonne Finance швидко поставила на паузу всі ринки на Optimism і заявила, що ринки на Base безпечні.

(https://twitter.com/SonneFinance/status/1790535383005966554)

Короткий опис атаки

Sonne Finance — це децентралізований протокол кредитування, який відгалужує Compound V2 на Optimism, надаючи окремим особам, установам і протоколам доступ до фінансових послуг. Sonne Finance протокол об'єднує токен-активи користувачів, щоб сформувати кредитний пул ліквідності, надаючи користувачам кредитний бізнес, подібний до банківського. Як і Compound, протокол учасники можуть закласти свої токени в пул ліквідності кредитування Sonne Finance і отримати сертифікат soToken (те саме, що і cToken). SoToken - це сертифікат активу, що приносить відсотки, який буде приносити певну суму доходу в міру просування блоку, а також буде отримувати заохочення SONE token. Учасники також можуть позичати інші токени з пулу кредитних активів Sonne з soToken на руках. Наприклад, учасники можуть закласти певну суму USDC для отримання сертифікатів soUSDC, а потім позичити WETH для подальшого обігу. Іпотечне кредитування в протокол Sonne Finance може бути взаємозв'язком «багато-до-багатьох». У процесі іпотечного кредитування протокол автоматично розрахує коефіцієнт здоров'я (Health Factor) адреси учасника. Коли коефіцієнт здоров'я буде нижчим за 1, іпотека за адресою Продукти буде підтримка ліквідація, а ліквідатори також можуть отримати певні ліквідація винагороди.

Взаємозв'язок між кількістю базових токенів, внесених користувачами, і викарбуваними токенами soTokens в основному пов'язаний зі змінною, яка називається exchangeRate. Ця змінна може бути приблизно використана для того, щоб вказати, скільки базового токена коштує кожен soToken. Формула розрахунку валютного курсу виглядає наступним чином:

У наведеній вище формулі totalCash відноситься до кількості базових токенів, що утримуються soToken, totalBorrows відноситься до кількості базових токенів, позичених на певному ринку, totalReserves відноситься до загальної суми резерву (включаючи відсотки, сплачені позичальником), totalSupply відноситься до кількості викарбуваних soToken.

Під час викупу користувачі можуть вказати кількість базових токенів, які вони хочуть викупити, redeemAmount, щоб розрахувати кількість токенів, які потрібно знищити, redeemTokens. Метод розрахунку приблизно такий: "redeemTokens = redeemAmount / exchangeRat". Зауважимо, що тут немає втрати точності. розібратися з.

Суть цієї атаки полягає в тому, що коли ринок (soToken) був створений, зловмисник виконав першу операцію іпотечного лиття і викарбував дуже мало soTokens з невеликою кількістю базових токенів, в результаті чого значення "totalSupply" soToken виявилося занадто малим. Потім зловмисник скористався вразливістю втрати точності контракту Solidity, а потім відправив базовий токен безпосередньо до контракту soToken (soToken не буде викарбувано, що означає, що "totalSupply" залишиться незмінним, а "totalCash" стане більшим) замість методу стейкінгу + кастингу для депозит базового токена. Така операція призводить до того, що змінна "totalCash" в контракті стає більшою, але "totalSupply" залишається незмінною, в результаті чого обмінний курс стає більшим. Врешті-решт, коли зловмисник викуповує базовий токен, soToken, який потрібно знищити, буде меншим, ніж soToken, викарбуваний під час іпотеки. Зловмисник використовує зароблений soToken, щоб позичити базовий токен WETH і USDC іншим soTokens (таким як soWETH, soUSDC), і, нарешті, отримує прибуток у розмірі 20 мільйонів доларів США.

Ключові адреси, що беруть участь в атаці

Транзакції підготовки до атаки:

https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96

Атакуйте вигідні угоди:

https://optimistic.etherscan.io/tx/0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0

Адреси, пов'язані з атаками EOA:

0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

Адреса, пов'язана зі зловмисником (контрактом):

0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8

0x02fa2625825917e9b1f8346a465de1bbc150c5b9

базовий токен(VELO Токен V2):

0x9560e827af36c94d2ac33a39bce1fe78631088db

Контракт на вразливість (soVELO, схожий на cToken від Compound):

0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

@tonyke_bot Транзакція порятунку користувачів на X:

https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a94086c200c0470c6456603c967f82ab559a5931fd181c2

Аналіз процесу атаки

Підсумок

Команда проекту Sonne Finance нещодавно прийняла пропозицію додати ринок VELO до Sonne Finance (https://twitter.com/SonneFinance/status/1786871066075206044) і організувала п'ять транзакцій через гаманець з мультипідписом, які будуть виконані через два дні ( https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7), ці п'ять транзакцій використовуються для створення ринку VELO (контракту soVELO) і встановлення деяких ключових конфігурацій ринку, таких як встановлення моделі відсоткової ставки, встановлення цінового оракула, встановлення іпотечних факторів тощо. Після створення ринку VELO користувачі можуть депозит VELO токени для мінт токенів soVELO, які, у свою чергу, можуть бути використані для запозичення інших токенів soToken.

підготовка до атаки

Етап підготовки атаки в основному полягає в тому, що зловмисник створює ринок VELO (контракт soVELO) на основі інформації в пропозиції проекту Sonne Finance після закінчення дводенного періоду блокування пропозиції, налаштовує ключові конфігурації та мінт VELO токени в контракт soVELO, закладаючи їх. токени soVELO, а також відправляє VELO токени, які він тримає, безпосередньо контракту soVELO для підвищення обмінного курсу та підготовки для отримання прибутку від подальших атак.

Конкретні кроки такі:

  1. Після закінчення дводенного періоду блокування зловмисник спочатку упаковує операції перших чотирьох транзакцій, впорядкованих у пропозиції, в одну транзакцію (транзакцію 0x45c0cc), яка використовується для створення ринку VELO (контракт soVELO) та встановлення конфігурації ключа. Коли VELO ринок ініціалізовано, exchangeRate встановлюється на "

    200,000,000,000,000,000,000,000".
  2. Зловмисник викликає функцію «мінт» контракту soVELO для депозит VELO токенів та мінт токенів soVELO. Зловмисник вказує "mintAmount" як "400 000 001" (кількість VELO токенів). Як видно з функції "exchangeRateStoredInternal", оскільки "_totalSuppl" токена soVELO на даний момент дорівнює 0, exchangeRate - це значення, встановлене в кроці 1. За формулою " mintTokens = actualMintAmount / exchangeRate ", розрахована кількість токенів soVELO, які повинні бути викарбувані в цей час, дорівнює 2. У шорт році на цьому кроці зловмисник вносить VELO токени номіналом «400 000 001» у контракт soVELO, а зловмисник отримує токени soVELO зі значенням 2.

soVELO.мінт:

  1. Зловмисник відправив VELO токени вартістю «2 552 964 259 704 265 837 526» на контракт soVELO, безпосередньо відправивши VELO токени на контракт soVELO. У цей час кількість VELO токенів, що утримуються контрактом soVELO, збільшилася, але оскільки нових токенів soVELO не було, то монета карбується, тому totalSupply залишається незмінним, а це означає, що обмінний курс, розрахований за формулою розрахунку exchangeRate, стане в цей час більшим.

  2. Зловмисник кілька разів передавав токени soVELO, що зберігалися, і, нарешті, перевів їх на іншу атаку EOA 0xae4a.

Атака з метою отримання прибутку

Фаза прибутку атаки в основному полягає в тому, що зловмисник виконує п'яту транзакцію пропозиції та позичає VELO токени безпосередньо контракту soVELO через флеш-позики для подальшого підвищення обмінного курсу. Потім зловмисник використовує токен soVELO номіналом 2 у руці, щоб запозичити базові токени, такі як WETH та USDC, з інших контрактів soToken (таких як soWETH, soUSDC тощо), і ці частини стають прибутком зловмисника. Потім зловмисник викупив свій базовий токен у контракті soVELO. У зв'язку зі збільшенням обмінного курсу та втратою точності розрахунку токенів soVELO, які необхідно знищити для викупу, зловмисник зрештою використав лише токен soVELO зі значенням 1. Майже всі раніше депоновані токени VELO були викуплені, що можна зрозуміти як використання зловмисником додаткових токенів soVELO вартістю 1 для заробітку базових токенів, таких як WETH і USDC, шляхом запозичення в інших soToken. Зловмисник використовував одну і ту ж техніку, щоб повторити атаку багато разів і в кінцевому підсумку отримав величезний прибуток.

Конкретні кроки такі:

  1. Зловмисник виконує п'яту транзакцію в пропозиції та встановлює коефіцієнт кредитування, зазначений у пропозиції.

  2. Зловмисник надає флеш-позики VELO токени номіналом «35 469 150 965 253 049 864 450 449» з пулу VolatileV2 AMM - USDC/VELO, який запускає функцію хука зловмисника. У функції хука зловмисник продовжує виконувати операцію атаки.

  3. Зловмисник відправляє VELO токени, які він тримає, на контракт soVELO для подальшого підвищення обмінного курсу. На даний момент в контракті soVELO налічується всього VELO токенів номіналом «35 471 703 929 512 754 530 287 976» (сума VELO токенів, переданих зловмисником втричі).

  4. Зловмисник створює новий договір 0xa16388a6210545b27f669d5189648c1722300b8b. У конструкторі він передає 2 токени soVELO, які він тримає, новоствореному контрактному 0xa163 (далі – 0xa163 зловмисника).

  5. Зловмисник 0xa163 використав токени soVELO, які він тримав, щоб позичити WETH вартістю «265 842 857 910 985 546 929» у soWETH.

  6. Зловмисник 0xa163 викликає функцію "redeemUnderlying" soVELO, вказуючи вартість викуплених VELO токенів як "35 471 603 929 512 754 530 287 976" (майже кількість VELO токенів, які зловмисник раніше передав або заклав у контракт soVELO). У цей час необхідно Формула "redeemTokens = redeemAmountIn / exchangeRate" використовується для розрахунку кількості токенів soVELO, які необхідно знищити для викупу.

Як видно з функції "exchangeRateStoredInternal", оскільки _totalSupply дорівнює 2, а не 0, потрібно обчислити значення exchangeRate. Згідно з формулою "exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply", поточний exchangeRate дорівнює "17,735,851,964,756,377,265,143,988,000,00 00,000,000,000,000,000", це значення набагато більше початкового валютного курсу, встановленого "200,000,000,000,000,000,000,000,000,000

".

Вартість " redeemTokens ", розрахована на основі нового обмінного курсу, становить " 1,99 ". Завдяки характеристикам округлення Solidity у бік зменшення, вартість «redeemTokens» в кінцевому підсумку дорівнює 1. Це означає, що зловмисник 0xa163 використовував токени soVELO номіналом 1 для викупу майже всіх VELO токенів, внесених раніше. При цьому зловмисник також 0xa163 заробив WETH вартістю «265 842 857 910 985 546 929», позичених у soWETH.

soVELO.redeemОснова:

soVELO.exchangeRateStoredInternal:

  1. Зловмисник 0xa163 передав усі позичені WETH та викупив VELO токени зловмиснику верхнього рівня, а потім самознищився.

  2. Зловмисник викликає функцію "liquidateBorrow" soWETH для ліквідації частини активів, запозичених за новоствореним контрактом, 0xa163 в ордер отримати назад заблокований токен soVELO номіналом 1. Наразі зловмисник тримає лише токени soVELO зі значенням 1.

  3. Зловмисник викликає функцію «мінт» soVELO і знову закладає та карбує токени soVELO з метою зібрати достатню кількість токенів soVELO номіналом 2, а потім знову виконує кроки 3-8 вище, щоб отримати прибуток від інших токенів.

  4. Зловмисник кілька разів виконує операцію на кроці 9, погашає флеш-кредит і йде з ринку з прибутком.

Як 100 доларів США залучають 6,5 мільйонів

доларів Після атаки користувач @tonyke_bot на X викарбував 0,00000011 soVELO, застейкавши 1144 VELO токенів у контракт soVELO в транзакції 0x0a284cd. Причина, по якій ця операція може запобігти зловмиснику від подальших атак, полягає в тому, що ця транзакція змінює розмір totalSupply в soVELO і кількість VELO токенів totalCash hold, і вплив зростання totalSupply на розрахунок обмінного курсу більше, ніж вплив зростання totalCash. Таким чином, обмінний курс стає меншим, в результаті чого зловмисник не лонгуючий може скористатися втратою точності, щоб заробити soVELO при проведенні атаки, що робить атаку неможливою лонгуючий.

Відстеження грошей

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

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

Зловмисник перевів на цю адресу 198 WETH, а потім за допомогою цього ж методу атаки той же метод атаки отримав незаконну вигоду в наступних транзакціях:

Після нападу адреса передала вищезгадану незаконну вигоду 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb.

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

Зловмисник перевів на цю адресу 724277 USDC та 2353 VELO, а USDC обміняв на Етер. Тоді частина коштів одразу була переведена на крос-ланцюг міст «Зоряна брама». Більша частина незаконних коштів залишається за цією адресою:

3、0xbd18100a168321701955e348f03d0df4f517c13b

Зловмисник перевів на цю адресу 33 WETH та за допомогою ланцюжка намагався відмити гроші. Посилання на відмивання грошей виглядає наступним чином:

0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。

4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770

Зловмисник перевів 563 WETH на цю адресу, а згодом на 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68, без подальших дій.

Метод відмивання грошей зловмисником цього разу відносно професійний, а методи демонструють тенденцію різноманітності. Тому для нас, учасників Web3, ми повинні продовжувати вдосконалювати наші можливості боротьби з відмиванням грошей з точки зору безпеки, а також покращувати безпеку проєктів Defi за допомогою KYT, AML та інших пов'язаних продуктів безпеки блокчейн-транзакцій.

Поради з безпеки

1、Будьте в курсі аудиту та тестування контрактів. Проведіть комплексний аудит перед розгортанням смарт-контрактів, приділивши особливу увагу всім частинам, пов'язаним з фінансовими розрахунками. По-перше, використовуйте автоматизоване тестування та скористайтеся перевагами оновлень бібліотек вразливостей у режимі реального часу для проведення ефективного сканування безпеки контрактів (індустрія також поступово відкрила вихідний код деяких зрілих інструментів аудиту безпеки, включаючи ZAN AI SCAN), поєднуючи ручний аудит для усунення проблем, які вимагають глибоких галузевих знань

.

2、До втрати точності потрібно ставитися серйозно. Проблеми з безпекою, викликані втратою точності, нескінченні, особливо в проектах Defi, де втрата точності часто призводить до серйозних фінансових втрат. Сторонам проекту та аудиторам безпеки рекомендується уважно переглянути коди з втратою точності в проекті та провести тести, щоб максимально уникнути цієї вразливості.

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

  2. Коли в контракті є ключові змінні, які залежать від значення " this.balance " або " token.balanceOf() ", потрібно уважно розглянути умови зміни ключової змінної, наприклад, чи дозволено безпосередньо передавати нативну валюту або токени в контракт. для зміни значення змінної, або значення змінної може бути змінено тільки викликом певної функції.

Відмова від відповідальності:

  1. Ця стаття передрукована з [ZAN]. Всі авторські права належать оригінальному автору [ZAN]. Якщо є заперечення проти цього передруку, будь ласка, зв'яжіться з командою Gate Learn, і вони оперативно впораються з цим.
  2. Відмова від відповідальності: Погляди та думки, висловлені в цій статті, належать виключно автору і не є жодною інвестиційною порадою.
  3. Переклад статті на інші мови здійснює команда Gate Learn. Якщо не зазначено, копіювання, розповсюдження або плагіат перекладених статей заборонено.
Розпочати зараз
Зареєструйтеся та отримайте ваучер на
$100
!