Автор BlockSec

8 ноября 2022 года мы обнаружили, что в результате некоторых атак были успешно истощены ресурсы из пулов, созданных на основе официального контракта Sushi KashiPairMediumRiskV1 (или некоторых ответвлений от него). После расследования мы обнаружили, что основная причина связана с логической ошибкой, которая приводит к неправильному расчету цен токенов.

Мы немедленно связались со службой безопасности Sushi, и они подтвердили наши выводы. Хорошо, что они приняли меры для защиты некоторых ценных, но уязвимых пулов от атак. Кроме того, они также предоставили процедуры для компенсации тем, кто потерял средства в результате эксплойта. Таким образом, теперь мы считаем, что можно безопасно раскрывать подробности об уязвимости и атаках. В этом отчете мы хотели бы предоставить подробный анализ.

Анализ уязвимостей

Проанализировав исходный код контракта KashiPairMediumRiskV1, мы пришли к выводу, что эта ошибка заключается в функции заимствования, которая использует устаревший обменный курс для проверки заимствованной доли в модификаторе платежеспособности. В частности, проверка будет выполняться на основе текущего значения exchangeRate в _isSolvent функции.

В функции ликвидации функция updateExchangeRate вызывается в самом начале. Следовательно, проверка и расчет будут выполняться на основе обновленного значения.

Очевидно, что эту ошибку можно использовать, чтобы привести к (огромной) разнице в цене.

Анализ атак

Мы наблюдали две атаки:

  1. https://etherscan.io/tx/0xcf8f242ea83100b6d43e659f7f53a698d304fc6ac2ca6fe79e3e07ee05fefe58: жертва использует контракт KashiPairMediumRiskV1, и потери составляют около 9 466 долларов США.

  2. https://etherscan.io/tx/0x3d163bfbec5686d428a6d43e45e2626a220cc4fcfac7620c620b82c1f2537c78: жертва – стратегический контракт, использующий CauldronMediumRiskV1 (форк KashiPairMediumRiskV1), и убыток составляет около 110,91 1 МИМ.

Обратите внимание, что первая транзакция атаки была запущена ботом, который выполняет исходную транзакцию атаки: https://etherscan.io/tx/0x7a845d8d2af7919f5b9e22dd5571305cb5347d17986a8402715c1463d515fc18, а исходный адрес злоумышленника 0xb7ea0f0f8c6df. 7a61bf024db21bbe85ac5688005.

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

  1. Получение кредита на сумму 40 900 BADGER и 121 904 USDC у Balancer.

  2. Внесение 40 900 BADGER и 113 599 долларов США в BentoBox.

  3. Вызов функции addCollate kmBADGER/USDC-LINK для внесения 40 900 000 000 000 000 000 000 акций BADGER.

  4. Вызов функции addAsset kmBADGER/USDC-LINK для внесения 112 529 000 000 акций USDC.

  5. Вызов функции заимствования для заимствования 120 755 095 093 акций USDC.

  6. Вызов функции UpdateExchangeRate.

  7. Вызов функции ликвидации для самоликвидации.

  8. Выведите 40 899 BADGER и 123 006 USDC из BentoBox.

  9. Погашение флеш-кредита и получение прибыли в размере около 9466 долларов США.

Обратите внимание, что шаг 6 не является обязательным, поскольку функция заимствования вызовет функцию UpdateExchangeRate.

Ключевые шаги заключаются в следующем:Нетрудно догадаться, что значение ExchangeRate, используемое в функции заимствования, отличается от значения, используемого в функции ликвидации:

  • В функции займа: 250 997 938 545 109 237 740 214 705 193

  • В функции ликвидации: 328 266 883 541 864 569 505 752 156 794

Влияние

Эта ошибка может затронуть десятки пулов (как на Ethereum, так и на BSC). Временный метод решения этой проблемы — уменьшить или устранить отклонение, периодически (или периодически) вызывая функцию UpdateExchangeRate . Этот метод уже используется во многих пострадавших проектах, и соответствующие транзакции можно наблюдать в реальных условиях.