Манипуляция ценой в собственном пуле лишила протокол 10,7 ETH

Введение
Spiral — это протокол кредитования в сети Ethereum. Пользователи могут вносить токены в качестве залога и получать взаймы другие активы. Размер займа зависит от стоимости залога.
Пул ликвидности — это хранилище, где токены торгуются автоматически по формуле. Цена в пуле меняется в зависимости от соотношения активов: чем больше купить одного токена, тем выше его цена.
Залог — это актив, который пользователь оставляет в протоколе как гарантию возврата займа.
Ход инцидента
1️⃣ Злоумышленник потратил 54 ETH на покупку 141 059 токенов SPIRAL через пул ликвидности. Эта крупная покупка резко подняла текущую цену токена в пуле.
2️⃣ Он передал купленные токены в протокол Spiral как залог. Система оценила их стоимость по новой, завышенной цене.
3️⃣ Протокол выдавал займ в размере 40% от оценки залога. Из-за искусственно раздутой цены злоумышленник получил право занять значительно больше ETH, чем реальная стоимость его токенов.
4️⃣ Чтобы обойти защиту, он использовал шесть разных кошельков. Защита проверяла, не совершал ли конкретный кошелёк обмен или заём в текущем блоке. Новый кошелёк проходил проверку, хотя цена в пуле уже была сдвинута предыдущей покупкой.
5️⃣ В результате было получено около 64,7 ETH. Вычтем затраты на покупку токенов (54 ETH) — чистый ущерб для протокола составил примерно 10,7 ETH.
Почему это стало возможным
Протокол оценивал залог только по текущей цене в собственном пуле, полученной напрямую из системы управления пулом. Не использовалось усреднение цены по времени (TWAP) — это механизм, который берёт среднюю цену за определённый период, чтобы сгладить кратковременные манипуляции.
Также не было независимой проверки цены из внешних источников. Поэтому одна крупная покупка в пуле сразу повысила оценку залога.
Защита noSameBlockSwap проверяла только конкретный адрес отправителя: совершал ли этот кошелёк операции в текущем блоке. Она не отслеживала общее состояние пула и не блокировала операции с завышенной ценой. Использование нескольких кошельков позволило обойти эту проверку.
Детали расследования: движение средств
Полученные ~64,7 ETH поступили на адрес злоумышленника:
Оттуда средства были переведены на адрес:
-
40 ETH отправлены в миксер Tornado Cash — сервис, который скрывает источник средств;
-
28,7 ETH направлены на депозитный адрес Fixed Float — криптовалютного обменника, после чего ушли на горячий адрес сервиса.
Заключение
Инцидент в Spiral показал, что оценка залога по текущей цене внутреннего пула без усреднения по времени делает протокол уязвимым для манипуляций. Защита, направленная только на проверку конкретного адреса, не спасла от атаки с нескольких кошельков.


