Уязвимости протокола Zerocoin позволяют блокировать транзакции пользователя и осуществить двойную трату
В криптографической схеме протокола Zerocoin обнаружены уязвимости, одна из которых позволяет злоумышленникам осуществлять “двойную трату”, сжигая монеты других пользователей. Об этом сообщила команда исследователей немецкого Университета Эрлангена-Нюрнберга (FAU) во главе с криптографом Тимом Руффингом.
Как подчеркивается в блоге технического факультета FAU, выявленная уязвимость не затрагивает блокчейн Zcash, который частично позаимствовал элементы Zerocoin. Другие криптовалюты, использующие этот протокол, по-прежнему могут быть уязвимы к атаке.
В частности, эта проблема актуальна для таких монет, как Zcoin, PIVX, SmartCash, Zoin и Hexxcoin.
We found an attack on Zerocoin leading to vulnerabilities in the cryptocurrencies @zcoinofficial, @zoinofficial, @_pivx , @scashofficial, and @hxxcoin (NOT Zcash); first two are still affected. Joint work with @aravind2112, Viktoria Ronge and @doschroeder.https://t.co/r3EYLxroNG
— Tim Ruffing (@real_or_random) 12 April 2018
Помимо этого, исследователи обнаружили две критические ошибки кода в программной библиотеке, имплементирующей Zerocoin, за счет которых атакующие получают возможность создавать новые монеты “из воздуха” и красть их у других пользователей.
Для понимания того, в чем заключаются выявленные уязвимости, исследователи FAU напоминают о базовых характеристиках протокола Zerocoin.
Его основная идея – достижение анонимности при помощи двух операций — mint и spend. Операция mint (чеканка) подразумевает создание (генерирование) монеты zerocoin при помощи публичной монеты и секретного ключа.
Во всех перечисленных выше криптовалютах в результате транзакции mint можно получить одну обычную «публичную» монету (например, 1 hexxcoin), которую затем можно обменять на 1 zerocoin.
При осуществлении второй операции (spend) пользователь расходует zerocoin и технически, если владеет секретным ключом, предоставляет доказательство того, что именно он является владельцем монеты. Здесь и начинается анонимность: используется доказательство с нулевым разглашением (zero-knowledge proof) — технология, которая позволяет скрыть, какие именно монеты zerocoin расходуются. Вместо этого показывается только то, что пользователь имеет право потратить монету zerocoin, которой может оказаться любая из монет в этом блокчейне.
Предотвращение двойной траты
Лежащая в основе Zerocoin идея наводит на мысль о том, что технология дает возможность легко осуществить так называемую «двойную трату» — использование одних и тех же монет для нескольких платежей. Если верификатор не знает, какой именно zerocoin потрачен, как он может подтвердить, что конкретная монета не была израсходована ранее?
Предлагаемое решение этой проблемы состоит в том, что каждый zerocoin имеет уникальный серийный номер. Протокол требует раскрытия этого серийного номера и доказательства его достоверности только при расходовании zerocoin. Это позволяет верификаторам иметь список серийных номеров, которые ранее уже были использованы, и определять транзакции как недействительные.
Атака denial-of-spending
В обеих предлагаемых Zerocoin схемах «отчеканенная» монета представлена публичной битовой строкой, которая подтверждает серийный номер, однако скрывает его в момент создания. Предполагается, что пользователи выбирают случайный серийный номер, вероятность уникальности которого очень высока. Однако, как установили исследователи, вместо того чтобы выбрать новый случайный серийный номер, атакующий может выбрать серийный номер по своему усмотрению.
Это ведет к следующей атаке: честный пользователь пытается потратить свои монеты zerocoin и отправляет в сеть транзакцию вместе с серийным номером. В то же время атакующий, который, как предполагается, контролирует сеть жертвы, блокирует это сообщение, не давая ему возможности попасть в сеть. После этого атакующий генерирует новую монету zerocoin с точно таким же серийным номером и отправляет ее в сеть.
В результате, когда «честная» транзакция попадает в сеть, ноды распознают ее серийный номер, отправляя его в список уже использованных серийных номеров. Таким образом, пользователь лишается возможности потратить свои монеты zerocoin. При любой попытке это сделать транзакция отвергается, так как определяется сетью как “двойная трата”, а сами монеты пользователя фактически сжигаются.
Осуществление атаки на практике
Одновременно с этим исследователи подчеркивают, что есть несколько моментов, которые мешают осуществить подобную атаку на практике.
В частности, атакующий должен иметь возможность перехватывать и блокировать сообщения, то есть иметь определенные привилегии в сети (контроль над ISP-сетью жертвы, зловредная нода в сети Tor или, до определенного предела, статус майнера).
Если атакующий не в состоянии блокировать сетевые сообщения, вероятен сценарий, при котором расходная транзакция жертвы включается в блокчейн до транзакции атакующего. В этом случае монеты zerocoin атакующего также не подлежат трате, то есть атака теряет смысл.
Ситуация осложняется тем, что, согласно правилам консенсуса, монеты zerocoin, сгенерированные в одном блоке, могут быть потрачены только в следующем блоке. Это означает, что атакующий также должен иметь возможность блокировать сетевые сообщения на протяжении более длительного периода времени.
Финансовый интерес при осуществлении атаки
Финансовый интерес атакующего может состоять в нанесении ущерба репутации криптовалюты, когда об атаке становится известно публично. Это позволяет злоумышленникам делать ставки на снижение цены монеты еще до начала атаки. Обычно об атаке сообщается после того, как было скомпрометировано как минимум несколько участников сети, и снижение доверия ведет к падению курса монеты.
Доказуемая безопасность
Обе схемы Zerocoin имеют корректные математические доказательства, подтверждающие, что они удовлетворяют определенным параметрам безопасности. Более того, говоря о работе с серийными номерами, используемая сегодня на практике имплементация работает так, как и предполагали разработчики.
Проблема, однако, кроется в параметрах безопасности, или, если говорить более точнее, в математических определениях, описывающих, что именно подразумевается под понятием «безопасность». Например, в то время как существует определение, описывающее невозможность кражи монет Zerocoin, нет определения, которое бы утверждало, что монеты честного пользователя не могут быть сожжены. Иными словами, такое требование было попросту пропущено.
Решение проблемы
Простым способом решения указанной проблемы исследователи называют использование вместо битовой строки нового рандомного публичного ключа в качестве серийного номера. Расходные транзакции должны быть дополнительно подписаны этим публичным ключом. В этом случае атакующий, хотя по-прежнему сможет видеть серийный номер и генерировать монеты с таким же серийным номером, не будет иметь возможность их потратить, поскольку для этого ему также потребуется публичный ключ.
Другие уязвимости
Исследователи FAU также сообщают, что обнаружили еще две критические проблемы. Они, впрочем, не связаны со схемой Zerocoin, а относятся к имплементациям в библиотеке libzerocoin, которая используется всеми перечисленными криптовалютами. При этом, подчеркивают авторы, библиотека libzerocoin была изначально создана в качестве исследовательского прототипа, и предупреждения о ее недостаточной безопасности и неготовности к развертыванию звучали с самого начала.
В этой связи, настаивают немецкие специалисты, использование таких имплементаций без соответствующего аудита кода является безответственным. Упоминаемые проблемы также были выявлены при независимом аудите командой PIVX, которая уже внесла необходимые исправления в свою локальную копию libzerocoin.
Первая из упомянутых проблем связана с обработкой серийных номеров, позволяя тратить монеты zerocoin множество раз при помощи разных представлений одного и того же серийного номера. Это давало атакующим возможность создавать монеты «из воздуха».
Вторая проблема относится к подписи расходной транзакции. Оригинальная схема Zerocoin использует так называемую «подпись разглашения», особенную форму доказательства с нулевым разглашением, которая дополнительно выступает в роли цифровой подписи. Однако в библиотеке libzerocoin эта подпись не учитывала хеш подписываемой транзакции. В теории это позволяло любому, кто видит валидную транзакцию, заменить ее собственной транзакцией и отправить монеты zerocoin на другой адрес.
Какие монеты затрагивают проблемы
Zcoin, PIVX, SmartCash, Zoin и Hexxcoin были уязвимы к атаке denial-of-spending, из них Zcoin и Zoin на момент публикации отчета оставались по-прежнему уязвимыми.
Zcoin, SmartCash, Zoin и Hexxcoin были уязвимы к инфляционному багу, позволявшему создавать монеты «из воздуха». Эти же монеты также были уязвимы к проблеме, связанной с подписью расходной транзакции. По данным исследователей FAU, на данный момент эти проблемы у указанных проектов устранены, однако данное утверждение делается на основе заявлений от авторов самих проектов и не было верифицировано.
Комментарии проектов
Как отметила команда Zcoin, она уже близка к релизу новой версии программного обеспечения, в которой содержатся исправления указанных проблем. Также Zcoin опубликовали официальное заявление в ответ на отчет Тима Руффинга.
Please read our official statement on the issue. https://t.co/PUBeCm0Uz1
— Zcoin (@zcoinofficial) 13 April 2018
«Тим Руффинг, который обнаружил уязвимости, поставил нас об этом в известность, и мы работали вместе с ним над улучшением библиотеки Zerocoin, имплементировав необходимые патчи. Мы также сообщили о баге ряду других проектов, которые используют Zerocoin, в частности, PIVX и Zoin. Код содержится в последней версии нашего кошелька и ждет активации посредством Zerocoin ID. Это означает, что новая схема, которая фактически сравнима с хардфорком, будет активирована, когда Zerocoin сгенерирует определенное число. Нам, возможно, и хотелось бы осуществить активацию немедленно, однако было крайне важно выдержать переходный период, в течение которого старые монеты могли бы быть потрачены», — говорится в сообщении Zcoin.
Команда проекта также подчеркнула, что высоко ценит работу Тима Руффинга, однако считает экономические выгоды от атаки крайне низкими, а саму возможность ее осуществления – достаточно сложной.
Представители Zoin заявили, что команда проекта была поставлена в известность об обнаруженных уязвимостях, и еще в марте рекомендовала пользователям не использовать функционал zerocoin.
«В настоящий момент этот функционал в нашем кошельке отключен, и случаев эксплуатации уязвимостей замечено не было! Сейчас мы работаем над крупным обновлением, которое будет выпущено 30 апреля», — заявляет Zoin.
В свою очередь команда PIVX заявила, что решила проблему с подписями транзакций еще до того, как запустила zerocoin в 2017 году. Криптографические проблемы были устранены в предстоящем релизе кошелька PIVX (версия 3.1), но уже сейчас они не имеют значения, так как библиотека zPIV была отключена несколько недель назад при подготовке к апгрейду кошелька.
Проект SmartCash в комментарии к записи Тима Руффинга в Twitter заявил, что ему было известно об уязвимостях и раньше и что слой Zerocoin был деактивирован еще несколько месяцев назад.
В то же время SmartCash утверждает, что монеты с активированным Zerocoin по-прежнему испытывают проблему с эксплуатацией уязвимостей.
We have disabled the Zerocoin layer few months ago due to vulnerabilities. We were well aware of them. Coins that have it enabled are still being exploited. $smart #SmartCash
— SmartCash (@scashofficial) 12 April 2018
Как отмечается в блоге FAU, пользователям все же стоит предпринять дополнительные меры безопасности и, помимо использования последних версий ПО соответствующих проектов, воздержаться от траты неизрасходованных монет Zerocoin в случае с Zcoin и Zoin.
Полный текст отчета исследователей FAU доступен по этой ссылке.
Напомним, первый релиз протокола Zerocoin состоялся в декабре 2015 года. В феврале этого года сообщалось, что ошибка в коде Zerocoin привела к краже более полумиллиона долларов у проекта Zcoin.