8 ноября 2022 года мы обнаружили, что в результате серии атак активы были успешно выведены из пулов, построенных на базе официального контракта Sushi KashiPairMediumRiskV1 (или контрактов, являющихся его форками). После расследования мы выяснили, что первопричиной является логическая ошибка, приводящая к неверному расчету цен токенов.
Мы немедленно связались с командой безопасности Sushi, и они подтвердили наши выводы. Хорошей новостью стало то, что они приняли меры по защите некоторых ценных, но уязвимых пулов от атак. Кроме того, они предоставили процедуры для компенсации средств тем, кто потерял их из-за эксплойта. В связи с этим мы считаем, что теперь безопасно раскрыть детали уязвимости и атак. В этом отчете мы хотели бы предоставить подробный анализ.
Анализ уязвимости
После анализа исходного кода контракта KashiPairMediumRiskV1 мы пришли к выводу, что ошибка находится в функции borrow, которая использует устаревший exchangeRate для проверки доли заимствования в модификаторе solvent. В частности, проверка выполняется на основе текущего значения exchangeRate в функции _isSolvent.


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


Очевидно, что эта ошибка может быть использована для создания (огромной) разницы в ценах.
Анализ атаки
Мы наблюдали две атаки:
- 0xcf8f242ea83100b6d43e659f7f53a698d304fc6ac2ca6fe79e3e07ee05fefe58: жертва использует контракт KashiPairMediumRiskV1, потери составляют около 9 466 USDC.
- 0x3d163bfbec5686d428a6d43e45e2626a220cc4fcfac7620c620b82c1f2537c78: жертва — это контракт стратегии, использующий CauldronMediumRiskV1 (форк KashiPairMediumRiskV1), потери составляют около 110 911 MIM.
Обратите внимание, что первая транзакция атаки была запущена ботом, который опередил (front-run) исходную атаку: 0x7a845d8d2af7919f5b9e22dd5571305cb5347d17986a8402715c1463d515fc18, а адрес исходного атакующего — 0xb7ea0f0f8c6df7a61bf024db21bbe85ac5688005.
Возьмем первую транзакцию атаки в качестве примера, которая состоит из следующих шагов:
- Получение флеш-кредита (flashloan) на 40 900 BADGER и 121 904 USDC от
Balancer. - Депонирование 40 900 BADGER и 113 599 USDC в
BentoBox. - Вызов функции
addCollateralв контракте kmBADGER/USDC-LINK для внесения 40 900 000 000 000 000 000 000 долей (shares) BADGER. - Вызов функции
addAssetв контракте kmBADGER/USDC-LINK для внесения 112 529 000 000 долей USDC. - Вызов функции
borrowдля заимствования 120 755 095 093 долей USDC. - Вызов функции
UpdateExchangeRate. - Вызов функции
liquidateдля ликвидации самого себя. - Вывод 40 899 BADGER и 123 006 USDC из
BentoBox. - Погашение флеш-кредита и получение прибыли в размере около 9 466 USDC.
Обратите внимание, что шаг 6 не является обязательным, так как функция
borrowсама вызывает функциюUpdateExchangeRate.
Ключевые этапы выглядят следующим образом:
Нетрудно заметить, что значение exchangeRate, используемое в функции borrow, отклоняется от значения, используемого в функции liquidate:
- В функции
borrow: 250 997 938 545 109 237 740 214 705 193 - В функции
liquidate: 328 266 883 541 864 569 505 752 156 794
Последствия
Существуют десятки пулов (как в сети Ethereum, так и в BSC), которые могут быть затронуты этой ошибкой. Временный способ смягчения этой проблемы заключается в уменьшении или устранении отклонения путем периодического вызова функции UpdateExchangeRate. Этот метод уже был принят многими затронутыми проектами, и соответствующие транзакции можно наблюдать в сети.
Выводы
Обеспечение безопасности DeFi-проекта — непростая задача. Помимо аудита кода, мы считаем, что сообществу следует придерживаться проактивного метода мониторинга состояния проекта и предотвращать атаку еще до того, как она произойдет.
О компании BlockSec
BlockSec — это передовая компания в области блокчейн-безопасности, основанная в 2021 году группой всемирно признанных экспертов по безопасности. Компания стремится повысить уровень безопасности и удобства использования развивающегося мира Web3, чтобы способствовать его массовому внедрению. С этой целью BlockSec предоставляет услуги по аудиту смарт-контрактов и EVM-сетей, платформу Phalcon для разработки систем безопасности и проактивной блокировки угроз, платформу MetaSleuth для отслеживания и расследования движения средств, а также расширение MetaDock для эффективного взаимодействия разработчиков Web3 с криптомиром.
На сегодняшний день компания обслужила более 300 уважаемых клиентов, таких как MetaMask, Uniswap Foundation, Compound, Forta и PancakeSwap, и привлекла десятки миллионов долларов США в двух раундах финансирования от ведущих инвесторов, включая Matrix Partners, Vitalbridge Capital и Fenbushi Capital.
Официальный сайт: https://blocksec.com/
Официальный аккаунт в Twitter: https://twitter.com/BlockSecTeam



