Skip to content
yieldo. Крипто-аналитика

CREAM Lending

$130.0M
Украдено средств
27.10.2021
Дата инцидента
Техника
Spot Price Manipulation
Классификация
Манипуляция источником цены
Тип цели
DeFi-протокол
Затронутые сети
Ethereum
Источник
Cream Rekt #2 ↗

27 октября 2021 года кредитный протокол Cream Finance на Ethereum потерял около $130 млн за одну последовательность транзакций — атакующий манипулировал внутренней ценой, по которой протокол оценивал доходный токен-залог. Это был уже третий крупный взлом Cream за 2021 год: до этого были потери $37,5 млн в феврале и около $18,8 млн в августе (Decrypt).

Как устроена атака

Целью атаки был не внешний прайс-фид вроде Chainlink, а собственный учётный оракул Cream для токена yUSDVault — доли в хранилище Yearn, принимавшейся в качестве залога. Этот оракул считал цену одной доли как общую стоимость активов в хранилище, делённую на общее количество выпущенных долей. Обе части этой дроби мог сдвинуть один и тот же участник в рамках одной транзакции — именно эту брешь и использовал атакующий (Halborn).

С помощью двух скоординированных адресов и флеш-кредитов от MakerDAO и Aave атакующий провёл заёмный капитал через пул yPool на Curve в yUSD, затем — в стратегию yUSDVault на Yearn, а полученные доли хранилища внёс на Cream в качестве залога, чтобы выпустить crYUSD и занять ещё. Повторив цикл несколько раз, он собрал на двух адресах реальную залоговую позицию примерно на $1,5 млрд в crYUSD (Rekt).

Финальным шагом стала сама манипуляция: одной транзакцией атакующий погасил доли yUSDVault примерно на $500 млн, обменяв их обратно на yUSD. Это резко сократило общее число долей хранилища, тогда как его суммарная стоимость почти не изменилась — а по формуле Cream это означало, что цена каждой оставшейся доли выросла примерно вдвое. Реальные ~$1,5 млрд залога протокол внезапно увидел как ~$3 млрд, и под этот фиктивный баланс атакующий занял практически всю доступную ликвидность Cream — около $130 млн чистыми.

Вся цепочка — получение флеш-кредитов, циклы через Curve и Yearn, манипулятивное погашение долей, заём и возврат флеш-кредитов — выполнилась атомарно, в рамках одного пакета транзакций, так что ни у кипера, ни у мультисига, ни у обновления прайс-фида не было шанса вмешаться.

Что было дальше

Разработчик Cream публично предложил атакующему 10% «вознаграждение» (около $13 млн) за возврат оставшихся средств. Предложение осталось без ответа: похищенные активы атакующий провёл через Tornado Cash и RenBridge, конвертировав часть в биткоин, а также сбросил крупную позицию CRETH2 на Uniswap (Rekt). Средства так и не были возвращены.

Cream Finance не закрылся. Протокол продолжил работу, но октябрьский взлом — третий за год — оставил его без резервов, достаточных для сколько-нибудь заметной компенсации вкладчикам. К середине 2020-х независимые обзоры описывают Cream как legacy-протокол с заблокированной стоимостью в единицы миллионов долларов — прямое следствие доверия, утраченного за серию взломов 2021 года (CryptoAdventure).

Что из этого следует

  • Любой кредитный рынок, принимающий доходный «обёрточный» токен в качестве залога (доли хранилища, LP-токены, деривативы застейканных активов), наследует ценовой риск всего, что вложено внутрь — глядя на строку «залог: yUSD», пользователь не может увидеть эту вложенность.
  • Внутренний оракул цены доли, устроенный как стоимость, делённая на количество долей, манипулируем всегда, когда один участник может в одной транзакции сдвинуть и числитель, и знаменатель — паттерн, который встречается далеко не только в этой схеме хранилища.
  • Флеш-кредиты снимают ограничение по капиталу целиком: атакующему не требовался собственный капитал — только атомарная последовательность вызовов, поэтому безопасность протокола должна закладываться исходя из того, что у атакующего временно есть неограниченные средства в рамках одного блока.
  • История инцидентов самого протокола — это видимая информация о риске: это был третий взлом Cream за восемь месяцев, а TVL после первых двух не сократился настолько, чтобы ограничить ущерб от третьего.