24 октября в 10:11 утра по восточному времени США проект X100 на Ethereum лишился контроля над управлением в результате одной транзакции. Злоумышленник взял в флеш-кредит около 1,94 млн USDT, купил примерно 38 200 токенов X и распределил их между двумя недавно развёрнутыми вспомогательными контрактами, заморозив в каждом более 19 000 токенов. Это позволило ему вытеснить прежних участников и занять два из трёх мест в сенате. Получив большинство, он в рамках одной транзакции выдвинул предложение, провёл голосование и исполнил его: 400 000 токенов X из казначейства продали в пуле, который злоумышленник только что создал и где почти не было USDT, выручив всего около 36 долларов. После возврата флеш-кредита у злоумышленника осталось около 4,75 млн USDT. Компания Blockaid учла и последующие транзакции и оценила общий ущерб примерно в 4,85 млн долларов.
Это стало возможным из-за сочетания трёх особенностей дизайна. Во-первых, достаточно внести 100 X, чтобы сразу вступить в сенат — минимального срока владения нет. Во-вторых, места распределяются по текущему замороженному балансу: чем больше заморозил, тем выше шанс получить место. Предварительного снимка балансов нет, поэтому право голоса можно одолжить всего на несколько секунд. В-третьих, у предложений нет временной блокировки: предложение можно исполнить сразу после внесения, без периода ожидания. По отдельности каждый пункт может показаться удобным, но вместе они означают, что ключи от казны лежат прямо у входа: любой может занять деньги, открыть дверь, а затем вернуть их.
На одной транзакции всё не закончилось. Примерно через 24 минуты после первой второй атакующий тем же способом получил ещё два места и вывел позицию ликвидности, которую контракт Freezer разместил в Uniswap V3. Ещё примерно через 5 минут третий кошелёк напрямую воспользовался вспомогательным контрактом, оставленным вторым атакующим, и без каких-либо ограничений снова внёс предложение, переведя себе около 550 тысяч X. Одну и ту же дверь за полчаса распахнули три разные группы. По данным DexScreener на раннее утро 25 октября, за 24 часа объём торгов в основном пуле упал на 96,6%, цена X составляла около 1,75 доллара, а ликвидности в пуле осталось всего примерно на 340 долларов. Деньги не вытащили напрямую из кошельков пользователей — забрали средства из казны проекта и ликвидность. Но у владельцев токенов внезапно не осталось места, где их можно продать.
Розничным инвесторам перед тем, как связываться с проектом с управлением через голосование, стоит проверить три вещи. Учитывается ли право голоса по снимку баланса и можно ли голосовать за счёт одолженных токенов. Есть ли период ожидания после принятия предложения и можно ли остановить его до исполнения. Управляются ли казна и ликвидность одним контрактом и может ли одна уязвимость привести к потере всего. В случае X100 ответ на все три вопроса — отрицательный. На момент публикации команда проекта не выпустила публичного заявления, не сообщила о заморозке средств, не объявила вознаграждение за информацию и не представила разбор случившегося. О произошедшем сообщили внешние компании: Blockaid, Chainalysis и Panda Security. Первую добычу быстро обменяли на ETH и распределили по нескольким кошелькам. На момент публикации сообщений об использовании миксера, заморозке или возврате средств не было.
Моё мнение простое: при таком устройстве управления правила фактически говорят, что достаточно занять деньги — и ты уже у руля. Перед тем как входить в проект, розничным инвесторам полезнее прочитать правила голосования, чем изучать обещания из белой книги.
Вы когда-нибудь голосовали токенами управления, которые у вас есть? Читали правила голосования перед тем, как голосовать?
#X100 #链上安全 #被黑复盘 #治理攻击 #Флеш-кредит
—— Сяокай, крипто-хомяк из Web3
Этот пост — лишь разбор произошедшего и личное мнение, а не инвестиционная рекомендация. Указанные суммы основаны на публичных публикациях и сообщениях компаний, занимающихся безопасностью; окончательный размер ущерба определяется по официально подтверждённым данным.