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

СреднийJun 11, 2024
Суть этой атаки заключается в создании рынка (soToken), где злоумышленник выполнил первую операцию минтинга залога с небольшим количеством базового токена, в результате чего значение soToken было очень маленьким.
Анализ атаки на Sonne Finance

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. Участники также могут заимствовать другие токены из пула кредитных активов Sonne с soToken на руках. Например, участники могут заложить определенное количество USDC для получения сертификатов soUSDC, а затем одолжить WETH для дальнейшего обращения. Ипотечное кредитование в Протоколе Sonne Finance может быть отношением активов «многие ко многим». В процессе ипотечного кредитования Протокол автоматически рассчитает фактор здоровья (Health Factor) адреса участника. Когда фактор здоровья ниже 1, ипотека адресных Продуктов будет поддержка ликвидация, а ликвидаторы также могут получить определенные ликвидация вознаграждения.

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

В приведенной выше формуле totalCash относится к количеству базовых токенов, принадлежащих soToken, totalBorrows относится к количеству базовых токенов, выданных в кредит на определенном рынке, totalReserve относится к общей сумме резервов (включая проценты, выплачиваемые заемщиком), totalSupply относится к количеству отчеканенных soToken

.

При погашении пользователи могут указать количество базовых токенов, которые они хотят погасить, redeemAmount, чтобы рассчитать количество soTokens, которые необходимо уничтожить, redeemTokens. Метод расчета примерно такой: "redeemTokens = redeemAmount / exchangeRat". Обратите внимание, что здесь нет потери точности. разобраться с.

Суть этой атаки заключается в том, что при создании рынка (soToken) злоумышленник выполнил первую операцию литья ипотеки и отчеканил очень мало soToken с небольшим количеством базовых токенов, в результате чего значение «totalSupply» soToken оказалось слишком маленьким. Затем злоумышленник воспользовался уязвимостью, связанной с потерей точности контракта Solidity, а затем отправил базовый токен непосредственно в контракт soToken (soToken не будет отчеканен, что означает, что «totalSupply» остается неизменным, а «totalCash» становится больше) вместо того, чтобы делать ставки + метод кастинга для депозита базового токена. Такая операция приводит к тому, что переменная "totalCash" в контракте становится больше, но "totalSupply" остается неизменной, в результате чего exchangeRate становится больше. В итоге, когда злоумышленник выкупает базовый токен, 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

Attack process analysis

Recap

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

подготовка

к

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

Конкретные шаги следующие:

  1. По истечении двухдневного периода блокировки злоумышленник сначала упаковывает операции первых четырех транзакций, организованных в предложении, в одну транзакцию (транзакцию 0x45c0cc), которая используется для создания рынка VELO (контракт soVELO) и установки конфигурации ключа. Когда рынок VELO инициализирован, exchangeRate устанавливается в "200,000,000,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. Из-за роста exchangeRate и потери точности в расчете токенов soVELO, которые необходимо уничтожить для выкупа, злоумышленник в конечном итоге использовал только токен soVELO со значением 1. Почти все ранее депонированные токены VELO были выкуплены, что можно понимать как использование злоумышленником дополнительных токенов soVELO стоимостью 1 для заработка базовых токенов, таких как WETH и USDC, путем заимствования у других soTokens. Злоумышленник использовал одну и ту же технику, чтобы повторить атаку много раз и в конечном итоге получил огромную прибыль.

Конкретные шаги следующие:

  1. Злоумышленник выполняет пятую транзакцию в предложении и устанавливает коэффициент кредитования, указанный в предложении.

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

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

  4. Злоумышленник создает новый контракт 0xa16388a6210545b27f669d5189648c1722300b8b. В конструкторе он передает 2 токена soVELO, которыми он владеет, во вновь созданную контрактную 0xa163 (далее – 0xa163 злоумышленника).

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

  6. Злоумышленник 0xa163 вызывает функцию soVELO «redeemUnderlying», указывая стоимость выкупленных токенов 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", текущий обменный курс равен "17,735,851,964,756,377,265,143,988,000,000,0 00,000,000,000 ", это значение намного больше, чем исходный exchangeRate, установленный "200,000,000,000,000,000,000,000,00".

Значение " 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. Злоумышленник вызывает функцию soWETH «liquidateBorrow» для ликвидации части активов, заимствованных из вновь созданного контракта, 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, и влияние роста totalSupply на расчет exchangeRate больше, чем влияние роста totalCash. Таким образом, exchangeRate становится меньше, в результате чего злоумышленник не лонгующий иметь возможности использовать потерю точности, чтобы заработать soVELO при проведении атаки, что делает атаку невозможной лонгующий.

Отслеживание денег

Злоумышленник перевел средства вскоре после того, как завладел незаконными доходами. Большая часть средств была переведена на следующие четыре адреса. Кто-то должен был сменить адрес, чтобы продолжить атаку, а кто-то — для отмывания денег:

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

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

После нападения адрес перевел вышеупомянутые незаконные доходы 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb.

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

Злоумышленник перевел на этот адрес 724277 USDC и 2353 VELO и обменял USDC на Эфир. Затем некоторые средства были немедленно переведены в кросс-чейн мост Звездных врат. Большая часть незаконных средств остается по этому адресу:

3、0xbd18100a168321701955e348f03d0df4f517c13b

Злоумышленник перевел на этот адрес 33 WETH и использовал peel chain, чтобы попытаться отмыть деньги. Ссылка на отмывание денег выглядит следующим образом:

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

СреднийJun 11, 2024
Суть этой атаки заключается в создании рынка (soToken), где злоумышленник выполнил первую операцию минтинга залога с небольшим количеством базового токена, в результате чего значение soToken было очень маленьким.
Анализ атаки на Sonne Finance

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. Участники также могут заимствовать другие токены из пула кредитных активов Sonne с soToken на руках. Например, участники могут заложить определенное количество USDC для получения сертификатов soUSDC, а затем одолжить WETH для дальнейшего обращения. Ипотечное кредитование в Протоколе Sonne Finance может быть отношением активов «многие ко многим». В процессе ипотечного кредитования Протокол автоматически рассчитает фактор здоровья (Health Factor) адреса участника. Когда фактор здоровья ниже 1, ипотека адресных Продуктов будет поддержка ликвидация, а ликвидаторы также могут получить определенные ликвидация вознаграждения.

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

В приведенной выше формуле totalCash относится к количеству базовых токенов, принадлежащих soToken, totalBorrows относится к количеству базовых токенов, выданных в кредит на определенном рынке, totalReserve относится к общей сумме резервов (включая проценты, выплачиваемые заемщиком), totalSupply относится к количеству отчеканенных soToken

.

При погашении пользователи могут указать количество базовых токенов, которые они хотят погасить, redeemAmount, чтобы рассчитать количество soTokens, которые необходимо уничтожить, redeemTokens. Метод расчета примерно такой: "redeemTokens = redeemAmount / exchangeRat". Обратите внимание, что здесь нет потери точности. разобраться с.

Суть этой атаки заключается в том, что при создании рынка (soToken) злоумышленник выполнил первую операцию литья ипотеки и отчеканил очень мало soToken с небольшим количеством базовых токенов, в результате чего значение «totalSupply» soToken оказалось слишком маленьким. Затем злоумышленник воспользовался уязвимостью, связанной с потерей точности контракта Solidity, а затем отправил базовый токен непосредственно в контракт soToken (soToken не будет отчеканен, что означает, что «totalSupply» остается неизменным, а «totalCash» становится больше) вместо того, чтобы делать ставки + метод кастинга для депозита базового токена. Такая операция приводит к тому, что переменная "totalCash" в контракте становится больше, но "totalSupply" остается неизменной, в результате чего exchangeRate становится больше. В итоге, когда злоумышленник выкупает базовый токен, 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

Attack process analysis

Recap

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

подготовка

к

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

Конкретные шаги следующие:

  1. По истечении двухдневного периода блокировки злоумышленник сначала упаковывает операции первых четырех транзакций, организованных в предложении, в одну транзакцию (транзакцию 0x45c0cc), которая используется для создания рынка VELO (контракт soVELO) и установки конфигурации ключа. Когда рынок VELO инициализирован, exchangeRate устанавливается в "200,000,000,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. Из-за роста exchangeRate и потери точности в расчете токенов soVELO, которые необходимо уничтожить для выкупа, злоумышленник в конечном итоге использовал только токен soVELO со значением 1. Почти все ранее депонированные токены VELO были выкуплены, что можно понимать как использование злоумышленником дополнительных токенов soVELO стоимостью 1 для заработка базовых токенов, таких как WETH и USDC, путем заимствования у других soTokens. Злоумышленник использовал одну и ту же технику, чтобы повторить атаку много раз и в конечном итоге получил огромную прибыль.

Конкретные шаги следующие:

  1. Злоумышленник выполняет пятую транзакцию в предложении и устанавливает коэффициент кредитования, указанный в предложении.

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

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

  4. Злоумышленник создает новый контракт 0xa16388a6210545b27f669d5189648c1722300b8b. В конструкторе он передает 2 токена soVELO, которыми он владеет, во вновь созданную контрактную 0xa163 (далее – 0xa163 злоумышленника).

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

  6. Злоумышленник 0xa163 вызывает функцию soVELO «redeemUnderlying», указывая стоимость выкупленных токенов 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", текущий обменный курс равен "17,735,851,964,756,377,265,143,988,000,000,0 00,000,000,000 ", это значение намного больше, чем исходный exchangeRate, установленный "200,000,000,000,000,000,000,000,00".

Значение " 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. Злоумышленник вызывает функцию soWETH «liquidateBorrow» для ликвидации части активов, заимствованных из вновь созданного контракта, 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, и влияние роста totalSupply на расчет exchangeRate больше, чем влияние роста totalCash. Таким образом, exchangeRate становится меньше, в результате чего злоумышленник не лонгующий иметь возможности использовать потерю точности, чтобы заработать soVELO при проведении атаки, что делает атаку невозможной лонгующий.

Отслеживание денег

Злоумышленник перевел средства вскоре после того, как завладел незаконными доходами. Большая часть средств была переведена на следующие четыре адреса. Кто-то должен был сменить адрес, чтобы продолжить атаку, а кто-то — для отмывания денег:

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

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

После нападения адрес перевел вышеупомянутые незаконные доходы 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb.

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

Злоумышленник перевел на этот адрес 724277 USDC и 2353 VELO и обменял USDC на Эфир. Затем некоторые средства были немедленно переведены в кросс-чейн мост Звездных врат. Большая часть незаконных средств остается по этому адресу:

3、0xbd18100a168321701955e348f03d0df4f517c13b

Злоумышленник перевел на этот адрес 33 WETH и использовал peel chain, чтобы попытаться отмыть деньги. Ссылка на отмывание денег выглядит следующим образом:

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
!