Ошибка в 1 сатоши и искусственный взлёт цены: ущерб превысил $75 млн

Введение
Tectonic Finance — манипуляция ценой собственного токена
Ход инцидента
1. Злоумышленник начал скупать токен TONIC — собственную криптовалюту протокола Tectonic. Этот токен обладал крайне низкой ликвидностью: на рынке было доступно всего около $1,34 млн для покупки, а суточный объём торгов составлял примерно $11 тыс. На таком «тонком» рынке даже небольшие сделки способны резко двигать цену.
2. За 20 минут цена TONIC выросла примерно в 100 раз. Это была не естественная динамика, а искусственный взлёт от контролируемых покупок.
3. Злоумышленник внёс разогнанные TONIC в протокол в качестве залога. Tectonic оценил эту позицию по новой завышенной цене — примерно в $375 млн.
4. Протокол разрешал занимать активы на сумму до 20% от стоимости залога. По завышенной оценке это давало доступ к ~$75 млн в ликвидных активах — прежде всего в стейблкоинах (криптовалютах, привязанных к доллару).
5. Злоумышленник занял эти активы. Реальная стоимость его залога была значительно ниже, чем считал протокол, поэтому займ не был обеспечен по-настоящему.
6. Когда атака была обнаружена, валидаторы сети Cronos — те, кто подтверждает транзакции — полностью остановили сеть. Это не позволило злоумышленнику вывести всё похищенное. В Ethereum через сервис Relay.Link успели перевести только около $6,3 млн.
Почему это стало возможным
Tectonic принимал в качестве залога актив с недостаточной ликвидностью. Когда рыночная глубина токена измеряется миллионами, а суточные обороты — тысячами, цену легко манипулировать. Протокол использовал отображаемую рыночную цену для расчёта залога, не учитывая, реальна ли эта цена при попытке продать актив. Коэффициент залога в 20% от «бумажной» стоимости открыл доступ к десяткам миллионов реальных стейблкоинов.
Детали расследования: движение средств
До остановки сети злоумышленник перевёл в Ethereum через Relay.Link стейблкоины USDT и USDC.e, обменяв их преимущественно на USDC на общую сумму ~$6,3 млн. После этого все USDC были обменяны на 2 592 ETH. Средства остаются на адресе:
Остальные активы, оценивавшиеся примерно в $68,7 млн, остались заблокированы в сети Cronos на двух адресах:
0x7d4e7e5dcb0ccc66b4f0f8b0f30da5078ad4f2dc — ~$60 млн
0x215adfc84332d8dfdd5afc77af69cceec0bcd3fc — ~$8 млн
Balancer V1 — округление при почти пустом резерве
Ход инцидента
1. Злоумышленник развернул несколько вспомогательных контрактов. С помощью мгновенных кредитов (flash-loans) из протоколов Spark, Aave, Morpho и Uniswap V3 он провёл серию обменов в старых пулах Balancer V1. Цель — выкачать из пула почти весь WBTC (это «обёрнутый» биткоин — токен-версия BTC в сети Ethereum).
2. Когда резерв WBTC в пуле стал крайне маленьким — почти нулевым — злоумышленник запросил выпуск BPT, то есть токенов доли пула.
3. Функция
joinswapPoolAmountOut работала так: пользователь говорит, сколько BPT он хочет получить, а контракт рассчитывает, сколько WBTC для этого нужно внести. Из-за почти нулевого резерва и разницы в точности между WBTC (8 знаков после запятой) и внутренней арифметикой Balancer (18 знаков) расчёт округлился до минимальной единицы — 1 сатоши (0,00000001 WBTC).4. Контракт проверил только три условия: сумма не равна нулю, не превышает лимит пользователя и не превышает максимальную долю входа. Минимальный эффективный вклад, минимальный остаток в пуле или допустимая ошибка расчёта — не проверялись.
5. За 1 сатоши контракт выпустил 4 408,8 BPT. Злоумышленник использовал эти токены для выхода из пула и получения реальных активов: DPI, USDC, WETH и WBTC.
Почему это стало возможным
В старой версии Balancer V1 путь обычного входа в пул не содержал проверки на разумность расчёта. Административная функция
rebind имела защиту минимального баланса, но пользовательский путь — нет. Комбинация исчерпанного резерва, разницы в точности и отсутствия проверки минимального вклада позволила получить долю пула за бесконечно малую цену.Детали расследования: движение средств
После атаки токены были выведены с трёх вспомогательных контрактов на промежуточные адреса. Там основную часть активов обменяли на WETH, затем на обычный ETH. Все средства были собраны на адресе:
Заключение
Инциденты в Tectonic Finance и Balancer V1 показали две разные, но одинаково опасные слабости: доверие к рыночной цене низколиквидного актива и отсутствие проверки разумности математического расчёта при крайних значениях.
В Tectonic протокол принял завышенную цену манипулируемого токена за реальную стоимость залога и выдал займ, не обеспеченный реальными активами. В Balancer округление при почти пустом резерве превратило 1 сатоши в полноценную долю пула.


