Ravencoin: эксплойт консенсуса и восстановление цепочки
Это самый серьёзный инцидент на наших пулах за год, поэтому разберём всю историю по порядку.
В чём была уязвимость
Проблема сидела в проверке заголовка блока в алгоритме KAWPOW. Поле nHeight внутри заголовка никак не сверялось с реальной позицией блока в цепочке. То есть нода верила на слово тому числу, которое ей прислали.
Что это даёт атакующему. Подставив в это поле произвольное значение, он заставлял уязвимую ноду принять присланный mix hash без фактического выполнения работы ProgPoW. Никакого DAG, никаких memory-hard вычислений, никакой видеокарты. Подделать блок таким способом дешевле честного майнинга на порядки. Именно это и делает баг критическим: обычно защита сети держится на том, что подделка стоит дороже, чем честная работа, а здесь всё перевернулось.
У бага были и побочные эффекты помимо самих фальшивых блоков. Затронутые ноды могли падать при рестарте, а ноды, которые пытались синхронизироваться, натыкались на порванную последовательность заголовков и вставали.
Хронология
- 7 августа, 15:44:01 UTC — первый известный невалидный блок принят на высоте 4 487 776. Атаку продемонстрировал на основной сети человек, назвавший себя исследователем безопасности, после чего его приём скопировал второй атакующий.
- 10 августа — 2Miners выпускает экстренный патч 4.6.1.1-hf1. Он отклоняет любой блок, у которого заявленная в заголовке высота не совпадает с реальной позицией в цепочке, и фиксирует чекпойнт на блоке 4 487 775, последнем чистом.
- 10-12 августа — Upbit и Bitget приостанавливают ввод и вывод RVN в качестве меры предосторожности.
- 11 августа — Ravencoin публично раскрывает уязвимость и просит операторов нод, биржи и обозреватели блоков обновиться немедленно. Мейнтейнер Ханс Шмидт рекомендует использовать код 2Miners, пока не готов сводный релиз от проекта.
- 19 августа — Ravencoin публикует v4.8.0 на базе того же кода, что выпустили мы, добавив туда отдельный патч для переполнения количества при переводе ассетов.
Масштаб ущерба
Мы просканировали окно из 2089 блоков, с 4 489 527 по 4 491 615, и нашли в нём 96 поддельных блоков. Под угрозой оказалось всё, что подтвердилось после блока 4 487 775 в заражённой ветке, а это примерно три дня истории цепочки.
Как отбивали сеть
2Miners и другие пулы начали строить конкурирующую цепочку от блока 4 487 776, исключив из неё ветку с невалидными блоками. Вместе мы держим большую часть хешрейта Ravencoin, поэтому чистая цепочка росла быстрее поддельной и в итоге обогнала её. Сейчас она впереди на тысячи блоков, пиры переподключились, раскол закончился в пользу честной цепочки.
Всё, что было намайнено до 7 августа, под вопросом не стояло ни минуты. Наши пул RVN и RVN SOLO всё это время работали на чистой цепочке.
Что делать вам
- Поставьте v4.8.0, если держите собственную ноду, кошелёк, обозреватель блоков или интеграцию с биржей. Эта версия заменяет наш экстренный хотфикс 4.6.1.1-hf1.
- Версия v4.7.0 проблему не решает. Она закрывала только баг с переполнением ассетов и на основной сети так и не активировалась: голосование BIP9 не успело завершиться до того, как понадобился v4.8.0.
- Всё старше 4.6.1.1-hf1 остаётся уязвимым к тому же трюку с подделкой блоков и вдобавок может отказаться синхронизироваться.
Если вы майните RVN у нас и своей ноды не держите, со своей стороны делать ничего не нужно. Майнинг на KAWPOW и выплаты идут в обычном режиме.
Pearl: хардфорк Salted Noise-seed на блоке 99 000
11 августа в основной сети Pearl на блоке 99 000 активировался хардфорк. Он добавляет соль в noise seed, который использует алгоритм PearlHash. Практический смысл простой: шеры, посчитанные майнером старой версии, после форк-блока просто невалидны.
Обратите внимание! Отказ здесь тихий и оттого неприятный. Устаревший майнер продолжает бодро показывать хешрейт на экране, а в зачёт не идёт ничего. Если у вас в середине августа доход по PRL внезапно обнулился, причина почти наверняка в этом.
Версии майнеров с поддержкой форка:
- PeakMiner 2.9.0
- SRBMiner 3.5.3
- Krig 1.2.0
- ArcMiner 0.3.1
- Fl4shMiner 1.2.7
- ForgeMiner 1.5.10
Со стороны ноды форк приехал в Pearl 1.4.1, на ней мы и работаем. Раньше в том же месяце мы взяли Pearl 1.3.1 (коммит b6d7e5e), это доработка к софтфорку rank penalty из версии 1.3.0 от 5 августа. Наши пулы были готовы до форк-блока и продолжали находить блоки без перерыва. Майнинг идёт на пуле PRL и в PRL SOLO, доходность считается в 2CryptoCalc.
Снижение награды за блок в сети Kaspa
Согласно токеномике Kaspa, хардфорку Crescendo и официальному графику эмиссии, в августе у Kaspa произошло очередное плановое снижение награды за блок. В отличие от резких халвингов, Kaspa режет награду небольшими шагами каждый месяц.
- Прошлая награда: 2.449 KAS
- Новая награда: 2.312 KAS
Обратите внимание! Доходность майнинга Kaspa изменилась. Калькулятор 2CryptoCalc уже обновлён с учётом новой награды. Майнинг доступен на пуле KAS и в KAS SOLO.
Обновления нод
Ergo 6.0.4
Релиз от 18 августа. Большая часть изменений это укрепление API и работа с тестами, но три пункта важны тем, кто держит свою ноду Ergo или следит за распространением блоков:
- улучшена генерация кандидатов блоков;
- исправлена работа lastHeaders в предстоящем состоянии контекста, из-за чего майнер больше не залипает при расхождении цепочек во время предварительной проверки и валидации блока;
- починен механизм определения того, что нода догнала сеть, а дополнительный индекс теперь сохраняет целостность при переключении цепочек.
Остальное это хозяйственные правки: в упорядоченном пуле транзакций больше не могут появиться дубликаты идентификаторов, несколько REST-маршрутов и маршрутов кошелька наконец проверяют свои параметры, поправлена высота активации второй версии протокола в тестовой сети. На сам майнинг Autolykos обновление не влияет. Майним на пуле ERG и в ERG SOLO.
Quai v0.55.1
Тег от 11 августа. Главное для майнеров: в go-quai появился встроенный stratum-прокси для соло-майнинга, и в релиз собрана длинная серия работ по нему:
- плавающая сложность (vardiff) для stratum-прокси;
- опциональная поддержка PROXY protocol, чтобы stratum-сервер корректно работал за балансировщиком;
- websocket-подписка blockTemplateUpdates;
- значения сложности в биткоин-формате вместо сырых при отправке через API;
- служба health check на порту 8081, которая сверяет высоту ноды с публичным RPC;
- корректное завершение работы stratum, уникальные идентификаторы задач, монотонные идентификаторы сессий и параметр частоты, который обновляет ASIC только с заданной периодичностью;
- обновление обработки KawPoW при смене родительского хеша Quai и защита размера эпохи и light cache DAG.
В настройках вашего майнера ничего менять не нужно. Майнинг доступен на пулах QUAI KawPow, QUAI KawPow SOLO, QUAI SHA-256 и QUAI SHA-256 SOLO.
Итоги
Август показал, зачем пулу собственная экспертиза, а не только стойки с железом. Когда в Ravencoin вскрылась дыра в консенсусе, ждать релиза от проекта было некогда: патч написали и выкатили мы, и он же лёг в основу официальной версии v4.8.0. Вместе с другими пулами мы вернули сеть на честную цепочку, и намайненное до атаки не пострадало.
Что стоит сделать прямо сейчас:
- если держите ноду RVN, кошелёк или обозреватель — обновиться до v4.8.0;
- если майните PRL — проверить версию майнера, старая после блока 99 000 работает вхолостую;
- если майните KAS — пересчитать доходность с новой наградой 2.312 KAS.
Все актуальные новости, предупреждения и разборы мы публикуем в нашем телеграм-канале Новости 2Miners. Подписывайтесь, чтобы не пропустить следующий форк.
