Манипуляция ценой в Flamincome: ущерб $346 тыс

Расследование КоинКит анализирует, как именно сработала атака и куда ушли средства.
Введение
Flamincome — это протокол, который помогает пользователям получать доход от криптовалюты. Пользователь вкладывает стейблкоины, например USDT, и получает взамен токен доли — VaultYUSDT. Протокол сам инвестирует эти средства в различные стратегии, чтобы заработать проценты.
Curve — это децентрализованная биржа, специализирующаяся на обмене стейблкоинов. В ней есть пулы ликвидности, куда пользователи вкладывают пары токенов, чтобы другие могли их обменивать.
LP-токены (Liquidity Provider tokens) — это токены, которые выдаются за вклад в пул ликвидности. Они подтверждают, что у вас есть доля в этом пуле. Позже LP-токены можно вернуть и забрать свои токены обратно.
Convex — это сервис, который помогает владельцам LP-токенов получать максимальные награды за предоставление ликвидности.
Ход инцидента
-
Злоумышленник взял мгновенный кредит (flash-loan) примерно на $18 млн в USDT. Эти деньги нужны были не для прямой кражи, а для временного влияния на расчёты протокола.
-
На заёмные USDT он купил токен USDP и вложил его в пул Curve USDP/3CRV вместе с другими стейблкоинами. За это он получил большое количество LP-токенов этого пула.
-
Эти LP-токены он разместил в Convex и застейкал (заблокировал) в пользу стратегии Flamincome. Формально эти токены стали числиться за стратегией, хотя Flamincome не вкладывала в них своих денег.
-
Баланс LP-токенов, который стратегия Flamincome считала своим, резко вырос. Протокол использовал этот баланс при расчёте стоимости своих активов.
-
Для оценки LP-токенов использовался внутренний показатель пула Curve — get_virtual_price(). Это расчётная цена одного LP-токена. Но из-за того, что злоумышленник сильно сдвинул баланс пула своей крупной покупкой, этот показатель оказался выше реальной цены, по которой можно было вывести ликвидность.
-
Расчётная стоимость активов стратегии и цена доли VaultYUSDT искусственно выросли.
-
Злоумышленник инициировал вывод своих YUSDT. Контракт посчитал, что его доля стоит гораздо дороже, чем на самом деле, и начал выводить реальные средства стратегии.
-
Стратегия вывела из протокола Aave около 544 тыс. aUSDT — это токенизированные депозиты в Aave, подтверждающие право на получение реальных USDT.
-
Злоумышленник вернул мгновенный кредит. Чистый ущерб для протокола составил примерно $346 тыс.
Почему это стало возможным
Главная проблема заключалась в том, как Flamincome определял количество и стоимость принадлежащих стратегии активов. Стратегия ориентировалась на количество LP-токенов, находившихся за ней в Convex. Но любой сторонний пользователь мог застейкать LP-токены в пользу стратегии. Поэтому рост баланса не означал, что Flamincome действительно купила эти токены за собственные средства.
Злоумышленник сначала искусственно увеличил количество LP-токенов, учитываемых Flamincome, а затем стратегия сама оценила эти активы по завышенной расчётной стоимости. Из-за этого выросла цена доли VaultYUSDT, и атакующий смог обменять завышенную расчётную стоимость своих долей на реальные активы стратегии.
Детали расследования: движение средств
Похищенные средства в размере ~$346 тыс. USDT поступили на адрес злоумышленника:
Затем они были обменяны через агрегатор Li.Fi на примерно 144 ETH. После этого средства были отправлены транзитом через адрес:
Заключение
Инцидент в Flamincome показал, что учёт чужих вложений как собственных активов и использование внутренней расчётной цены без проверки реальной ликвидности могут привести к краже. Протокол не проверял, кто и за чей счёт застейкал LP-токены, и доверился показателю, который легко манипулировать крупной покупкой.


