Как 300 случайных людей украли 190 миллионов из Nomad за 4 часа
В августе 2022 года произошёл один из самых нелепых взломов в истории криптовалют. Чтобы вывести 190 миллионов долларов, не нужно было знать ассемблер, писать эксплойт или арендовать ботнет. Достаточно было открыть Etherscan, скопировать чужую транзакцию и подменить адрес кошелька на свой.
В этот момент кросс-чейн мост Nomad перестал быть инфраструктурным проектом и превратился в общественную кассу самообслуживания. За четыре часа из контракта вынесли 152 миллиона долларов, и сделали это 300 разных кошельков, многие из которых никогда раньше не взаимодействовали с протоколом.
Как это вообще стало возможно
Nomad устроен как классический lock-and-mint мост. Вы блокируете токены на одном блокчейне, а мост чеканит обёрнутые версии на другом. Чтобы получить оригиналы обратно, нужно сжечь обёрнутую версию, после чего смарт-контракт разблокирует залог.
Вся безопасность держалась на одном поле в контракте, trusted root. Каждый запрос на вывод сверялся с этим значением. Если хеш сообщения совпадал с trusted root, запрос проходил. Если нет, отклонялся.
21 июня 2022 года команда выкатила рутинный апдейт контракта и при инициализации записала trusted root в ноль. На первый взгляд безобидно: устанавливать значение в ноль при инициализации вполне нормальная практика. На деле эта строка превратила любое непроверенное сообщение в валидное. Хеш пустого, не сохранённого сообщения тоже равен нулю, а значит, любой кошелёк мог запросить любую сумму, и контракт её подтверждал.
Эта дыра жила в основной сети шесть недель. Никто не трогал код, никто не запускал внутренний аудит, никто не отследил, что флаг доверия стоит в положении on по умолчанию.
Транзакция за 2 300 долларов, которая принесла 2,3 миллиона
1 августа 2022 года Александр Гуревич отправил в мост 0,01 wrapped Bitcoin и забрал 100 WBTC на 2,3 миллиона долларов. Возврат 10 000x с одного клика, без флеш-займа и без сложной логики.
Транзакция появилась в Etherscan через несколько секунд и моментально разошлась по криптотвиттеру и Discord. Дальше начинается главное, ради чего этот кейс стоит изучать любому, кто пишет смарт-контракты или работает с публичной инфраструктурой.
Люди начали копировать транзакцию Гуревича прямо из блок-эксплорера. Они открывали её во вкладке raw input, меняли только адрес получателя на свой и нажимали submit. Никакого кода, никакого скрипта, никакого реверса байткода. Атака, исполняемая мышкой.
Исследователь samczsun позже назвал это a frenzied free for all, и термин прижился. За следующие четыре часа 300 разных кошельков повторили манёвр. 41 из них вынес 152 миллиона долларов, примерно 80% всей суммы. Часть участников оказалась white hat и потом вернула средства. Большинство просто оставили деньги себе.
Когда команда Nomad поставила контракт на паузу, мост был уже пуст. Mandiant в официальном отчёте назвал событие Decentralized Robbery, потому что классические признаки взлома здесь не работают. Это не один атакующий и не группа. Это толпа, синхронизированная публичным блок-эксплорером.
Что в итоге стало с Гуревичем
Из 190 миллионов в протокол вернулось около 36 миллионов. ФБР открыло дело и охотилось за Гуревичем с 2023 года. Триггером стало его собственное сообщение в Telegram, которое он отправил CTO Nomad сразу после эксплойта, оно и легло в основу обвинения.
В мае 2025 года израильская полиция задержала Гуревича в аэропорту Бен-Гурион. Он пытался улететь в Россию по поддельному паспорту, за два дня до этого официально сменив имя на Alexander Block.
Он признал факт эксплойта, извинился, попросил bug bounty в 500 000 долларов. Nomad предложил 10%. После этого Гуревич замолчал. Сейчас ему грозит до 20 лет в федеральной тюрьме США по восьми пунктам: мошенничество с использованием средств связи, отмывание денег и транспортировка похищенного имущества. Остальные 299 кошельков до сих пор помечены в Etherscan как участники атаки.
Какие уроки тут важны для разработчиков
Кейс Nomad полезен не тем, что в смарт-контракте была ошибка. Ошибки случаются у всех. Полезен он структурой инцидента.
Инициализация по умолчанию опаснее, чем кажется. Значение ноль для критичного поля доверия превращает контракт в открытую дверь, если логика проверки не делает явного исключения для нулевого хеша. Любая константа, которая означает доверяй этому, должна валидироваться отдельно, а не сравниваться через равенство.
Публичность блокчейна означает не только аудит, но и копипаст. Если эксплойт можно повторить, скопировав calldata и заменив один адрес, то после первой удачной транзакции у вас не один атакующий, а вся аудитория Etherscan.
Шесть недель без ревизии продакшен-контракта с миллионами долларов внутри это не редкость. Code freeze после деплоя не равен безопасности. Continuous monitoring и постдеплой-аудиты должны быть частью пайплайна, а не разовой активностью перед релизом.
Социальная динамика инцидента важна не меньше технической. Когда 300 человек одновременно решают «почему бы и нет», это уже не баг и не атака в классическом смысле. Это сигнал, что у инфраструктуры нет ни rate limiting, ни circuit breaker, ни механизма паузы по аномальному оттоку.
Источник: пост @0xSweep в X, https://x.com/0xSweep/status/2055785861141413958
