Первоисточник: материал Shielded Labs | Авторы: Зуко Уилкокс [*], Дайра-Эмма Хопвуд [†], Джек «str4d» Григг [†], Джуда Карузо [*], Джейсон Макги [*] и Джош Свихарт [†] | Перевод и адаптация: ruzcash
[*] Shielded Labs, [†] Zcash Open Development Lab

Главное
- Из-за уязвимости zcashd узлы пропускали проверку доказательств Sprout при обработке новых блоков.
- Уязвимость не использовали. Средства всех пользователей, включая средства в пуле Sprout, находятся в безопасности.
- Ошибка могла затронуть только выведенный из эксплуатации пул Sprout, в котором находилось около 25 тысяч ZEC. Механизм «турникетов» Zcash не допустил бы увеличения общего предложения ZEC, которое на момент публикации составляло около 16,63 миллиона ZEC.
- Конфиденциальность пользователей не подвергалась опасности.
- Специалист по безопасности Алекс «Scalar» Сол ответственно сообщил об уязвимости 23 марта 2026 года. Инженеры Zcash Open Development Lab (ZODL) подготовили исправление, а все крупные майнинговые пулы установили его за три дня.
- Zebra, реализация полного узла от Zcash Foundation, не содержала этой ошибки. Попытка использовать уязвимость привела бы к разделению цепочки.
| Затронутые версии | zcashd от v3.1.0 до v6.11.x |
|---|---|
| Исправленная версия | zcashd v6.12.0 |
Кратко
Специалист по безопасности Алекс «Scalar» Сол обнаружил уязвимость в zcashd. При определённых условиях она позволяла майнеру добавить недействительные транзакции, которые узлы приняли бы. Это могло привести к утрате средств пользователями старого, выведенного из эксплуатации пула Sprout. Уязвимость не влияла на конфиденциальность пользователей.
Разработчики протокола из Zcash Open Development Lab (ZODL) подготовили исправление. Его установили майнинговые пулы, на которые приходится подавляющая часть вычислительной мощности сети.
Уязвимость не использовали. Все средства пользователей, в том числе находившиеся в Sprout, остались в безопасности. Это можно проверить с помощью Zebra или последней на момент публикации версии zcashd 6.12.0. Обе реализации подтверждают, что в блокчейн Zcash добавлялись только действительные транзакции. Следовательно, до установки исправления майнинговыми пулами ошибку не применяли.
Исследователь сообщил об уязвимости непублично. Инженеры Shielded Labs и ZODL вместе с майнинговыми пулами провели согласованное раскрытие.
Важно, что эта и подобные ошибки не позволяли увеличить общее предложение ZEC. Между пулами ценности, то есть прозрачным пулом, старым пулом Sprout, пулом Sapling и действующим пулом Orchard, в Zcash работают «турникеты». Они служат защитными шлюзами и ограничивают последствия возможной атаки. Турникет Sprout не позволяет вывести из этого пула больше ZEC, чем было внесено. Поэтому ошибка не могла увеличить общее предложение или затронуть пользователей, хранящих ZEC в других пулах.
Ошибка не позволяла нарушить конфиденциальность пользователей Zcash. Её защищает сквозное шифрование между кошельками пользователей. Действия майнеров и полных узлов Zcash не могут раскрыть данные пользователей даже при ошибке в их программном обеспечении.
Полный узел Zebra, который разрабатывает и поддерживает Zcash Foundation, работает в основной сети Zcash с июля 2023 года. В Zebra этой уязвимости никогда не было. При попытке атаки Zebra создала бы отдельную цепочку блокчейна Zcash, содержащую только действительные транзакции.
Предыстория
Sprout был первым защищённым пулом Zcash и начал работать вместе с запуском сети в октябре 2016 года. Улучшенный пул Sapling добавили в октябре 2018 года, а в ноябре 2020 года ZIP 211 вывел Sprout из эксплуатации.
Предыдущую уязвимость, способную затронуть пользователей Sprout и возникшую из-за ошибки в криптографической работе, опубликованной до создания Zcash, обнаружили и устранили в 2018 году.
Внести средства в Sprout больше невозможно. Современные кошельки не создают новые транзакции Sprout. Исключением остаётся встроенный кошелёк zcashd, который позволяет вывести существующие средства из Sprout в другие пулы.
На момент публикации в пуле Sprout находилось около 25 424 ZEC.
Сообщение стороннего исследователя
Алекс «Scalar» Сол сообщил о проблеме Shielded Labs 23 марта 2026 года.
После получения отчёта Shielded Labs совместно с разработчиками ядра ZODL проверила уязвимость и подготовила исправление. Исправление написал Джек Григг (str4d), а Дайра-Эмма Хопвуд и Крис Наттикомб проверили его.
Shielded Labs связалась с майнинговыми пулами и поставщиками инфраструктуры, чтобы они установили исправление.
Для согласования обновления организация напрямую обратилась к ViaBTC, Luxor, F2Pool и AntPool.
Хронология
28 октября 2016 года
- Zcash запущен с защищённым пулом Sprout.
28 октября 2018 года
- Запущен защищённый пул Sapling.
- Исправлена CVE-2019-7167.
28 июля 2020 года
- Уязвимость впервые появилась в zcashd 3.1.0.
18 ноября 2020 года
- Пул Sprout закрыт для новых поступлений средств согласно ZIP 211.
14 июня 2023 года
- Выпущена Zebra 1.0.0, которая проверяет все транзакции, включая транзакции Sprout.
23 марта 2026 года
- Scalar сообщил об уязвимости Shielded Labs.
24 марта 2026 года
- Shielded Labs встретилась с инженерами ZODL Дайрой-Эммой Хопвуд, Крисом Наттикомбом и Джеком Григгом (str4d), чтобы проверить уязвимость и подготовить исправление. str4d написал исправление, а Дайра-Эмма Хопвуд и Крис Наттикомб проверили его.
- Shielded Labs сообщила о проблеме Zcash Foundation.
- Shielded Labs связалась с майнинговыми пулами ViaBTC, Luxor и F2Pool.
25 марта 2026 года
- Luxor подтвердил установку исправления.
- Shielded Labs связалась с AntPool.
26 марта 2026 года
- F2Pool подтвердил установку исправления.
- ViaBTC подтвердил установку исправления.
- AntPool подтвердил установку исправления.
31 марта 2026 года
- Выпущена версия zcashd 6.12.0.
Технические подробности уязвимости
Уязвимость возникла из-за того, что при подключении нового блока к вершине цепочки узлы zcashd не проверяли доказательства Sprout.
Ошибку внесла оптимизация кода в версии zcashd 3.1.0[1], выпущенной 28 июля 2020 года. Она затрагивала проверку блоков в zcashd, а именно порядок проверки доказательств Sprout при обработке блока.
При обычной проверке функция CheckBlock вызывается дважды: сначала при приёме блока, затем при его подключении к цепочке. Чтобы два раза не выполнять ресурсоёмкую проверку, доказательства Sprout должны проверяться во время второго вызова[2]. Однако этот порядок неправильно взаимодействовал с оптимизацией, унаследованной от Bitcoin Core. Флаг CBlock::fChecked сохраняет состояние проверки. Когда он установлен, CheckBlock сразу завершает работу и пропускает дальнейшие проверки. В затронутых версиях первый вызов мог ошибочно установить fChecked и отметить весь блок как проверенный[3]. Поэтому при втором вызове CheckBlock завершалась раньше времени, а доказательства Sprout не проверялись[4].
Доказательства Sprout правильно проверялись при приёме транзакций в очередь неподтверждённых транзакций и при повторном создании индекса узла. Ошибка позволяла принять недействительные транзакции только в том случае, если злоумышленник-майнер сам включал их в блок. При атаке пользователи Sprout могли потерять средства, если бы майнеры не откатили весь блокчейн Zcash до блока, предшествовавшего атаке.
Исправление[5] устанавливает fChecked только после завершения всех проверок, включая строгую проверку доказательств Sprout. Так восстанавливается правило, по которому доказательства Sprout всегда проверяются до приёма блока.
[1] Выпуск zcashd 3.1.0
[2] Отложенная проверка доказательств Sprout
[3] Установка флага проверки блока
[4] Досрочное завершение CheckBlock
[5] Исправление уязвимости
Благодарности
Благодарим Алекса «Scalar» Сола за обнаружение ошибки с помощью ИИ и ответственное сообщение о ней, которое защитило пользователей Zcash. Благодарим также Дэвида Бёркетта, разработчика MWEB в Litecoin, за помощь в ответственном раскрытии. Scalar не просил награду и не поднимал вопрос оплаты, однако Shielded Labs, ZODL, Zcash Foundation и Bootstrap решили выделить ему по 50 ZEC. Общая награда в 200 ZEC выражает благодарность за защиту пользователей и укрепление Zcash.
Отдельно благодарим разработчиков ZODL Дайру-Эмму Хопвуд, Криса Наттикомба и Джека Григга за быструю проверку и исправление.
Мы также благодарим Zcash Foundation за работу над Zebra. Узлы Zebra правильно проверяли доказательства Sprout и обеспечивали дополнительный уровень защиты. После запуска Zebra в основной сети Zcash попытка атаки привела бы к разделению цепочки, что помогло бы быстрее обнаружить и устранить проблему.
Благодарим Luxor, F2Pool, AntPool и ViaBTC за установку исправления на их майнинговых пулах.
Комментировать статью