Хабрахабр

[Из песочницы] Взламываем механизм приватности Mimblewimble

Приватность криптовалюты Mimblewimble/Grin фундаментально уязвима. Потратив всего $60 в неделю на AWS, я однозначно связал отправителей и получателей для 96% транзакций Grin в режиме реального времени.

Поэтому в плане защиты приватности Mimblewimble больше нельзя считать жизнеспособной альтернативой Zcash или Monero.
В последние два года Mimblewimble стал популярен как компактный протокол для приватных криптовалют («privacy coins»). Уязвимость находится в основе протокола Mimblewimble, и я не думаю, что ее можно исправить. Он отправил описание протокола в IRC-чат и исчез. Mimblewimble был придуман в 2016 году хакером под псевдонимом Tom Elvis Jedusor. Даже Litecoin рассматривает интеграцию Mimblewimble. С тех пор самые известные реализации Mimblewimble — шифрпанковская приватная криптовалюта Grin, созданная анонимными разработчиками, а также привлекшие венчурные инвестиции проекты Tari и BEAM.

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

Далее в этой статье — общее, интуитивное объяснение связуемости, того, как работает атака и что это означает для технологий приватности. В моем гитхабе вы найдете детальное описание атаки, исходники для ее воспроизведения, собранные данные и технический FAQ.

Что такое связуемость?

Важно понимать, что эта атака означает и чего она не означает.

Mimblewimble успешно скрывает суммы переводов с помощью криптографии на основе ванильных эллиптических кривых (схема обязательств Педерсена). Эта атака не позволяет нам определить суммы, которые люди получают. Другими словами, она позволяет нам связать транзакции друг с другом и определить направление переводов. Что эта атака позволяет нам сделать — это определить, кто кому заплатил.

Почему это важно?

Вы, американский пользователь, пытаетесь вывести монеты с Coinbase. Допустим, Coinbase знает, что определенный адрес принадлежит венесуэльцу по имени Даниэль. Из-за ограничений, наложенных на Венесуэлу Управлением по контролю за иностранными активами США, Coinbase закрывает ваш аккаунт. Но после раскрытия графа транзакции Coinbase определяет, что вы получили деньги от Даниэля — хоть они и не знают, сколько именно. (Разумеется, биржи будут много знать о графе транзакций, потому что у них есть KYC-данные пользователей, которые выводят в фиат).

Вы посылаете этому диссиденту небольшой донат. Или представим, что какое-то авторитарное правительство знает, что определенный адрес принадлежит политическому диссиденту. Поскольку правительство видит весь граф транзакции, оно теперь знает, что вы поддержали политического диссидента. Позже, когда вы посылаете свой Mimblewimble-перевод на местную биржу, эта биржа передает ваши транзакционные данные правительству.

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

Это максимально возможная анонимность с теоретико-информационной точки зрения. В Zcash набор анонимности каждой транзакции включает все защищенные монеты.

Хотя клиент Monero позволяет установить количество приманок в наборе, текущее значение по умолчанию — 11. В Monero набор анонимности каждой транзакции — это набор всех включенных пользователем транзакций-приманок. (У Monero есть свои сложности с тем, чтобы безопасно выбирать приманки, но, думаю, по большей части это работает, плюс-минус).

Изначально предполагалось, что набор анонимности Mimblewimble состоит из всех транзакций в том же блоке, то есть выглядит вот так:

Но на самом деле он выглядит так:

Это сводит набор анонимности Mimblewimble к одному адресу.

Я очень уважаю сообщество и core-разработчиков Grin, которые всегда с готовностью отвечали на мои вопросы на форумах. Хочу сказать, что это не критика в адрес Grin в целом!

Но модель приватности Mimblewimble строго слабее, чем у Zcash или Monero. Grin все равно обеспечивает более высокую приватность, чем биткоин и другие неприватные монеты, поскольку надежно зашифровывает суммы. И это делает его недостаточным для многих реальных сценариев использования, где нужна приватность.

Общий обзор атаки

Как же именно можно деанонимизировать граф транзакции в Mimblewimble?

Но разработчики протокола знали об этом, и поэтому Mimblewimble использует два основных способа борьбы со связуемостью: сквозную агрегацию целого блока и «одуванчик» (Dandelion). Я отмечал, что, несмотря на шифрование сумм переводов, Mimblewimble оставляет прослеживаемый граф транзакции.

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

Есть только одна проблема: этот CoinJoin строится по одной транзакции за раз. Звучит надежно? Любой узел-сниффер может просто наблюдать за сетью и запоминать оригинальные транзакции до того, как они агрегируются. Поскольку транзакции постоянно создаются и рассылаются из разных мест, если вы держите узел-сниффер, который собирает все транзакции до того, как закончена сквозная агрегация, то распутать CoinJoin очень легко. Это достаточно легко, если вы будете просто архивировать все сообщения, которые вы видите в P2P-сети.

Тут вы можете удивиться — и это все?

«Одуванчик» — это метод формирования сетей, разработанный исследователями Университета Карнеги — Меллона, который должен скрывать IP создателя транзакции. На самом деле есть еще один уровень защиты, созданный командой Grin: протокол Dandelion («одуванчик»).

Но в протоколе Dandelion рассылка каждой транзакции начинается с секретной игры в сломанный телефон. Обычно в таких криптовалютах, как биткоин, создатель транзакции просто рассылает транзакцию всем своим пирам, и она быстро проходит по P2P-сети. После случайного количества таких ходов последний пир рассылает транзакцию, ровно как в биткоине («цветок» одуванчика). Создатель передает свою транзакцию всего одному пиру, который, в свою очередь, передает ее другому пиру, и так далее по цепочке («ствол» одуванчика). Но этот пир так далеко от создателя транзакции, что ни один наблюдатель не сможет сказать, с кого началась цепочка.

Но у Dandelion в Grin есть вторая функция: в редких случаях, он позволяет сохранить анонимность транзакции даже при наличии узла-сниффера в сети. Это отлично работает для сокрытия IP того, кто совершает транзакцию. Если это происходит, то к тому моменту, как транзакция рассылается и становится видна всем, узел-сниффер не может расклеить транзакции: они уже склеились в CoinJoin. Поскольку каждая транзакция начинается в «стволовой» фазе Dandelion, когда две транзакции пересекаются в «стволовой» фазе распространения, они будут агрегированы рано.

Но есть легкий способ сломать и ее. Этот механизм рассылки транзакций — главная защита Grin от связуемости транзакций узлами-снифферами.

Но, увеличивая количество пиров, я могу соединить свой узел-сниффер с каждым узлом сети. По умолчанию каждой узел Grin соединен с 8 другими узлами-пирами. Если мой узел будет онлайн непрерывно в течение долгого времени, в конце концов ко мне подключатся практически все узлы в сети, делая меня суперузлом.

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

Но если бы я был готов потратить чуть больше денег, я бы легко мог подключиться к 3000 узлов, чтобы расклеить почти все транзакции. В своей атаке я смог связать 96% всех транзакций, подключившись лишь к 200 пирам из совокупных 3000 пиров в сети Grin. Пока я перехватываю все транзакционные данные и сбрасываю их в центральную мастер-базу данных, атака будет работать точно так же. И для этого не обязательно держать один большой суперузел — такая же атака сработает, если запустить 3000 отдельных узлов с уникальными IP, каждая из которых будет подсоединена всего к одному пиру.

Так можно ли спасти Mimblewimble?

Неясно. По-моему, в текущем варианте Grin нет способа защитить граф транзакций. Просто удлинить «одуванчик» недостаточно – это будет легко победить бОльшим числом узлов, как я описываю в техническом отчете.

В нем возможна сквозная агрегация, которая является эффективным способом уменьшения размера блокчейна, и он эффективно скрывает суммы транзакций. Но несмотря на связуемость транзакций, у Mimblewimble все еще есть свойства, которые выделяют протокол среди других криптовалют. Если вы хотите высокую приватность, вы всегда можете сочетать Mimblewimble с другим протоколом, который скрывает граф транзакции, например, как в Ethereum 9¾ (который сочетает Mimblewimble со схемой обнуления обязательств по типу Zerocash).

Но очевидно, что сам по себе Mimblewimble недостаточно сильный, чтобы обеспечить высокую приватность.

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

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

Дополнительная благодарность Олегу Остроумову, Елене Надолински, Мохамеду Фоуда, Лукасу Райану и Надеру Аль-Наджи за рецензирование черновиков этого поста. Спасибо Хасибу Киреши за существенную помощь в составлении этого отчета и иллюстрации наборов анонимности. За перевод статьи спасибо Дарье Смирновой. И огромное спасибо Джейку Штуцману (NEAR Protocol) за иллюстрации по Dandelion и агрегации блоков.

Если статья понравилась, рекомендую подписаться на мой Твиттер, где они выходят в первую очередь (на английском).

Disclosure: Dragonfly Capital обязуется не торговать активами, перечисленными в этом отчете, в течение 3 дней с даты публикации.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть