Разработчики Decred выпустили обновление кошелька, закрывающее уязвимость в механизме смешивания монет. Дыра позволяла деанонимизировать участников сессии — то есть подрывала ровно ту функцию, ради которой смешивание и делают.

Коротко: что исправлено

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

Практическое следствие: кошельки версии 2.1.6 не будут смешивать монеты со старыми, а старые не смогут участвовать в сессиях с обновлёнными. Разработчики требуют обновиться всем пользователям предыдущих версий.

Попутно закрыты ещё две проблемы. Первая касалась распределения вины при сбое сессии: участник, некорректно инициировавший обвинение, мог сам избежать ответственности. Вторая — удаления сообщений из пула после истечения сессии.

Что изменилось в версии 2.1.6

Изменение Содержание
Протокол клиента смешивания Изменён для предотвращения деанонимизации
Версия сопряжения Повышена, старые кошельки несовместимы
Распределение вины Исправлена возможность избежать ответственности
Очистка пула сообщений Исправлено удаление после истечения сессии
Требование к пользователям Обязательное обновление всех прежних версий
Использованный механизм CoinShuffle++, протокол смешивания сети

Как работает смешивание и что в нём ломается

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

Отсюда и природа таких уязвимостей. Ломается обычно не криптография, а протокольная логика: порядок сообщений, обработка сбоев, механизм обвинения нечестного участника. Достаточно, чтобы одна сторона могла извлечь дополнительный бит информации о том, кто с кем оказался в сессии, — и анонимность группы начинает распадаться.

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

Почему принудительная несовместимость версий — правильное решение

Насколько я это вижу, самое интересное в этом обновлении — не сам патч, а способ его внедрения.

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

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

Это принципиальное отличие приватных протоколов от остальной инфраструктуры. Обновление кошелька для хранения защищает только вас; обновление кошелька для смешивания имеет смысл лишь тогда, когда его установили все.

Насколько это критично для пользователя

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

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

Частые вопросы

Что именно исправили в Decred?

Уязвимость в протоколе клиента смешивания, позволявшую деанонимизировать участников сессии, а также две ошибки в обработке сбоев и очистке пула сообщений.

В какой версии вышло исправление?

В dcrwallet 2.1.6. Разработчики требуют обновления от всех пользователей предыдущих релизов.

Почему старые кошельки не работают с новыми?

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

Использовалась ли уязвимость на практике?

Сведений об этом нет. Оценки числа потенциально затронутых сессий также не публиковались.

Что такое CoinShuffle++?

Протокол смешивания, применяемый в сети: участники одновременно отправляют одинаковые суммы, чтобы связь входов и выходов нельзя было восстановить.

Можно ли не обновляться?

Технически да, но смешивание перестанет работать: сессии между старыми и новыми клиентами не формируются.

Источники

Материал подготовлен на основе публикации crypto.news и релизов dcrwallet.