Приветствуем! Впервые на сайте Zcash?
The Zcash network is young, but evolving quickly! Sign up and we'll be in touch with monthly highlights on ecosystem growth, network development and how to get started with Zcash!

Язык

Устранение уязвимостей в протоколе Zcash

Taylor Hornby, Zooko Wilcox | Apr 26, 2016

Вступление

Автор: Зуко

Полжизни я посвятил криптографии, информационной безопасности и цифровым деньгам (целых 20 лет, но кто считал?), и никогда до этого я не участвовал в таком амбициозном проекте, как Zcash. И мне повезло, ведь я никогда не работал в команде настолько квалифицированных специалистов, способных осуществить разработку надежных и практичных криптосистем.

Неотъемлемой частью проверки компьютерной безопасности является так называемый процесс «противостояния», в ходе которого производятся попытки атаки на систему — как для нахождения слабых сторон, так и с целью ее укрепления. Этот процесс может вызвать недоумение среди непосвященных людей, но для специалистов в области компьютерной безопасности важно знать, что систему проверяют, устраняют в ней неполадки и публикуют отчеты по безопасности. Это дает уверенность в том, что система становится сильнее.

Участники нашей команды уже имели дело с работами такого рода по аудиту систем для других компаний, включая Cryptocat, GlobaLeaks, SpiderOak и Эфириум.

Этот пост в блоге рассматривает некоторые вопросы безопасности, с которыми мы столкнулись в процессе подготовки Zcash к запуску как открытой, не имеющей запретов финансовой системы.

Несколько участников нашей команды в 2014 году опубликовали оригинальную научную работу по Zerocash, а также её научный обзор от независимых экспертов. Недавно мы расширили и значительно улучшили протокол, добавив к нему новую спецификацию, и тем самым избавив его от уязвимостей безопасности.

На данный момент мы обнаружили и устранили три уязвимости безопасности:

  1. Зуко Уилкокс обнаружил уязвимость Золото фей, которая заставляла пользователя думать, что он получил целую пачку монет, которые можно потратить. На самом деле, когда пользователь пытался потратить эти монеты, то обнаруживал, что он может потратить только одну.
  2. Тейлор Хорнби обнаружил уязвимость InternalH Collision, которая даёт пользователю возможность совершить двойную трату в специально выпущенном блоке, но при условии, что у него есть мощный компьютер, способный найти коллизии 128-битных хеширующих функций.
  3. Дейра Хопвуд обнаружила не относящуюся к эксплойтам ошибку в системе безопасности. Она заключается в том, что если одна из псевдослучайных функций протокола не обладает устойчивостью к коллизиям, средства, отправленные на специально созданный приватный адрес, могут быть потрачены дважды. (Эту ошибку нельзя отнести к эксплойтам, так как функция все-таки является устойчивой к коллизиям.)

В следующей статье вы можете ознакомиться с описанием самой значимой из уязвимостей – коллизией InternalH, которую обнаружил и описал Тейлор.

— Зуко Уилкокс, 2016-04-25

Коллизия уязвимости InternalH

Автор: Тейлор

Если бы мы запустили Zcash не обнаружив и не устранив коллизию InternalH, то это могло бы привести к подделке денег. Любой, чей компьютер обладает достаточной мощностью, чтобы выявить коллизии 128-битных хешей, мог бы дважды использовать деньги в личных целях и создавать Zcash из воздуха.

Обнаружение 128-битных коллизий хэшей требует \(2^{64}\) параллелизированных операций, и это сегодня вполне доступно атакующим, так что уязвимость вполне может быть использована на практике в корыстных целях. Давайте разберемся, как работает атака, и что мы сделали для защиты от нее.

Ошибка

Слабость схем обязательства заключается в наличии примечаний. Схемы обязательств это полезные криптографические инструменты, так как они позволяют вам опубликовать обязательство без разглашения связанной с ним информации. Затем, немного позже, вы можете открыть обязательство и показать всем, что вы действительно владеете той информацией, о которой утверждаете.

Чтобы система обязательств работала правильно, она должна обладать двумя свойствами:

  1. Скрытность: Увидев обязательство, невозможно получить информацию о нем. Даже если вы почти уверены, что знаете о чем говорилось в обязательстве, вы не сможете подтвердить свои догадки.

2. Обязательность: Если вы согласились на одну стоимость, то не можете поменять свое решение позже и сказать, что вы соглашались на другую сумму. Обязательство должно открываться с одной уникальной стоимостью, и не должно быть возможности открыть обязательство с любой другой стоимостью.

В Zcash фундаментальной единицей стоимости является “банкнота“, которая состоит из определенных величин \((a_{pk}, v, \rho , r)\) имеющих определенные значения в протоколе. Как часть протокола, обязательства по банкнотам прописаны в блокчейне. Так выглядит вычисление обязательства в первоначальном виде:

\(InternalH = \text{SHA256Compress}(a_{pk} \text{ \| } \rho ) \text{ truncated to 128 bits }\)
\(k = \text{SHA256Compress}(r \text{ \| } InternalH)\)
\(cm = \text{SHA256Compress}(k \text{ \| } [0]^{192} \text{ \| } v)\)

Здесь SHA256Compress является функцией сжатия, используемой хеш-функцией SHA256.

Уязвимость коллизии InternalH состоит в том, что её схема лишена свойства обязательности. Поэтому возможно придерживаться одной стоимости, а затем открыть обязательство позже и изменить его ценность.

Легко увидеть, как это можно сделать, если вы умеете делать коллизии 128-битных хэшей. Обязательство начинается с вычисления \(InternalH\), 128-битного хэша \(a_{pk}\) и \(\rho \), а затем применения обязательства к хэшу. Если коллизия InternalH найдена, значит имеется две разные \(a_{pk}\) и \(\rho \) пары \((a_{pk}, \rho )\) и \((a_{pk}\prime, \rho \prime)\) которые дадут нам нам то же самое \(InternalH\), ,и вы сможете открыть обязательство как для \((a_{pk}, v, \rho , r)\) так и для \((a_{pk}\prime, v, \rho \prime, r)\). Таким образом, данная схема не имеет обязательности. Как эта слабость в системе может привести к атаке?

Атака

Обязательства по всем существующим банкнотам хранятся в блокчейне. Для того, чтобы потратить банкноту, вам необходимо осуществить доказательство с нулевым разглашением, которое покажет, что вы знаете ключ траты для банкноты, которая связана с блокчейном и вы должны показать обнулятор этой банкноты. Обнулятор является значением, которое задумано уникальным для каждой банкноты. Чтобы позволяет убедиться в том, что ни одна банкнота не может быть потрачена дважды, все узлы в сети проверяют, что они не видели этот обнулятор ранее.

Обнулятор банкноты \((a_{pk}, v, \rho , r)\) принадлежащий ключу траты \(a_{sk}\) вычисляется приложением псевдослучайной функции \(\rho \), таким образом, обнулятор будет \(PRF_{a_{sk}}^{nf}(\rho )\). Тот, кто тратит средства, должен подтвердить нулевое разглашение (без раскрытия \(\rho \) или \(a_{sk}\)) и это покажет, что обнулятор вычислен правильно.

Слабость InternalH weakness позволяет атакующему обработать обязательство банкноты для двух различных и валидных \(\rho \) существующих значений. Они могут найти \(\rho _1\) и другое \(\rho _2\) таким образом, что обязательство может открыть \((a_{pk}, v, \rho _1, r)\) или \((a_{pk}, v, \rho _2, r)\). Атакующий может потратить обязательство банкноты первый раз, используя \(\rho _1\) с раскрытием обнулятора \(PRF_{a_{sk}}^{nf}(\rho _1)\), и затем потратить её второй раз, используя \(\rho _2\) с раскрытием обнулятора \(PRF_{a_{sk}}^{nf}(\rho _2)\). в результате эта банкнота имеет два различных обнулятора вместо одного, таким образом, она может быть потрачена дважды. Так как всё это делается с нулевым разглашением, ни один из узлов сети не может сказать, что обе траты ссылаются на то же самое обязательство банкноты. Другой вариант атаки заключается в нахождении двух различных \(a_{pk}\), вместо двух различных ρ.

Для каждой коллизии 128-битных битных хэшей, которую находит атакующий, он может эффективно удвоить количество своих Zcash в одной доступной для двойной траты операции и затем осуществить двойную трату. Таким образом, даже если выполнение \(2^64\) операций для поиска коллизии будет не дешевым делом, атака быстро окупится.

Исправление

Если вы читали главу 5.1 в оригинальную научную работу по Zerocash, вы могли бы найти, почему было выбрано \(InternalH\) размером 128 бит для схемы обязательства, которая обеспечивает сильную функцию с названием статистическое скрытие. Обычное скрытие поддается вычислениям: оно значит, что вам ничего не удастся узнать о входе сделки, если у вас нет невероятно быстрого компьютера (способного взломать алгоритм SHA256). Статистическое скрытие говорит, что даже если у вас есть бесконечно быстрый компьютер, вы всё равно ничего не сможете узнать о входе сделки. Это позволяет Zcash сохранить гарантии приватности, даже если однажды хэширующая функция SHA256 будет взломана.

Чтобы устранить эту уязвимость, мы переключились на другую схему обязательства, которая имеет безопасное закрепление. Для эффективного вычисления доказательства с нулевым разглашением Zcash, мы переключились с особо мощного статистического скрытия на обычное скрытие. Это не имет значения на практике, поскольку для взлома нашей новой схемы обязательства вам пришлось бы взломать сначала алгоритм SHA256, что в ближайшей перспективе вряд ли может случиться. Вот наша действующая конструкция схемы примечания:

\(cm = \text{SHA256}(\text{0xB0} \text{ \| } a_{pk} \text{ \| } v \text{ \| } \rho \text{ \| } r)\)

Вы можете узнать более подробные детали в спецификацию.

Заключение

Построение защищенных криптографических протоколов - сложная задача. И даже наша команда криптографов мирового класса и специалистов по безопасности может допускать ошибки. Но несмотря на все сложности, мы настроены оптимистично, ведь опыт проведения тщательных проверок безопасности и прозрачность позволит нам создать действительно защищенный продукт.

На данном этапе протокол Zcash подвергся интенсивной проверке параметров безопасности: сначала со стороны независимых экспертов, а затем сотрудниками нашей компании. Но мы нуждаемся в более строгой проверке протокола, чтобы быть уверенными в его безопасности.

Если вам нравится находить баги в криптографических протоколах, мы бы хотели дать вам возможность ознакомиться со спецификацию. Если вы сможете взломать протокол и рассказать нам, как вам это удалось, вы поможете всему человечеству благодаря усилению открытой, не имеющей запретов, сохраняющей приватность финансовой системы!

— Тейлор Хорнби и Зуко Уилкокс, 2016-04-25