[Из песочницы] Взламываем механизм приватности Mimblewimble
Приватность криптовалюты Mimblewimble/Grin фундаментально уязвима. Потратив всего $60 в неделю на AWS, я однозначно связал отправителей и получателей для 96% транзакций Grin в режиме реального времени.
Уязвимость находится в основе протокола Mimblewimble, и я не думаю, что ее можно исправить. Поэтому в плане защиты приватности Mimblewimble больше нельзя считать жизнеспособной альтернативой Zcash или Monero.
В последние два года Mimblewimble стал популярен как компактный протокол для приватных криптовалют («privacy coins»). Mimblewimble был придуман в 2016 году хакером под псевдонимом Tom Elvis Jedusor. Он отправил описание протокола в IRC-чат и исчез. С тех пор самые известные реализации Mimblewimble — шифрпанковская приватная криптовалюта Grin, созданная анонимными разработчиками, а также привлекшие венчурные инвестиции проекты Tari и BEAM. Даже Litecoin рассматривает интеграцию Mimblewimble.
Несколько исследователей уже высказывали гипотезы о потенциальных недостатках механизма приватности в Mimblewimble. Вклад моей работы в том, что я демонстрирую конкретный способ атаки, доказываю ее жизнеспособность на реальной криптовалюте и измеряю ее эффективность. Запустив эксперимент на Grin, я смог успешно деанонимизировать 96% из рассмотренных мной транзакций. Поэтому теперь очевидно, что нельзя полагаться на Mimblewimble, если вам нужна высокая приватность.
В моем гитхабе вы найдете детальное описание атаки, исходники для ее воспроизведения, собранные данные и технический FAQ. Далее в этой статье — общее, интуитивное объяснение связуемости, того, как работает атака и что это означает для технологий приватности.
Что такое связуемость?
Важно понимать, что эта атака означает и чего она не означает.
Эта атака не позволяет нам определить суммы, которые люди получают. Mimblewimble успешно скрывает суммы переводов с помощью криптографии на основе ванильных эллиптических кривых (схема обязательств Педерсена). Что эта атака позволяет нам сделать — это определить, кто кому заплатил. Другими словами, она позволяет нам связать транзакции друг с другом и определить направление переводов.
Почему это важно?
Допустим, Coinbase знает, что определенный адрес принадлежит венесуэльцу по имени Даниэль. Вы, американский пользователь, пытаетесь вывести монеты с Coinbase. Но после раскрытия графа транзакции Coinbase определяет, что вы получили деньги от Даниэля — хоть они и не знают, сколько именно. Из-за ограничений, наложенных на Венесуэлу Управлением по контролю за иностранными активами США, Coinbase закрывает ваш аккаунт. (Разумеется, биржи будут много знать о графе транзакций, потому что у них есть KYC-данные пользователей, которые выводят в фиат).
Или представим, что какое-то авторитарное правительство знает, что определенный адрес принадлежит политическому диссиденту. Вы посылаете этому диссиденту небольшой донат. Позже, когда вы посылаете свой Mimblewimble-перевод на местную биржу, эта биржа передает ваши транзакционные данные правительству. Поскольку правительство видит весь граф транзакции, оно теперь знает, что вы поддержали политического диссидента.
Такие атаки были бы невозможны в Zcash. Потому что транзакции в Zcash не связуемы, или, другими словами, у каждой Zcash-транзакции есть большой набор анонимности. Набор анонимности — это набор транзакций, от которых вашу транзакцию невозможно отличить. Представьте это, как смешивание с толпой: чем больше набор анонимности, тем с большей «толпой» смешана ваша транзакция.
В Zcash набор анонимности каждой транзакции включает все защищенные монеты. Это максимально возможная анонимность с теоретико-информационной точки зрения.
В Monero набор анонимности каждой транзакции — это набор всех включенных пользователем транзакций-приманок. Хотя клиент Monero позволяет установить количество приманок в наборе, текущее значение по умолчанию — 11. (У Monero есть свои сложности с тем, чтобы безопасно выбирать приманки, но, думаю, по большей части это работает, плюс-минус).
Изначально предполагалось, что набор анонимности Mimblewimble состоит из всех транзакций в том же блоке, то есть выглядит вот так:
Но на самом деле он выглядит так:
Это сводит набор анонимности Mimblewimble к одному адресу.
Хочу сказать, что это не критика в адрес Grin в целом! Я очень уважаю сообщество и core-разработчиков Grin, которые всегда с готовностью отвечали на мои вопросы на форумах.
Grin все равно обеспечивает более высокую приватность, чем биткоин и другие неприватные монеты, поскольку надежно зашифровывает суммы. Но модель приватности Mimblewimble строго слабее, чем у Zcash или Monero. И это делает его недостаточным для многих реальных сценариев использования, где нужна приватность.
Общий обзор атаки
Как же именно можно деанонимизировать граф транзакции в Mimblewimble?
Я отмечал, что, несмотря на шифрование сумм переводов, Mimblewimble оставляет прослеживаемый граф транзакции. Но разработчики протокола знали об этом, и поэтому Mimblewimble использует два основных способа борьбы со связуемостью: сквозную агрегацию целого блока и «одуванчик» (Dandelion).
Идея сквозной агрегации заключается в том, что когда транзакции собираются в блоке, они агрегируются в одну «супертранзакцию». Эта «супертранзакция» похожа на гигантский CoinJoin — все входы и выходы смешаны в одну кучу, и нет никакого простого способа определить, кто из них платил кому. Есть просто куча входов и куча выходов, и конкретные суммы скрыты.
Звучит надежно? Есть только одна проблема: этот CoinJoin строится по одной транзакции за раз. Поскольку транзакции постоянно создаются и рассылаются из разных мест, если вы держите узел-сниффер, который собирает все транзакции до того, как закончена сквозная агрегация, то распутать CoinJoin очень легко. Любой узел-сниффер может просто наблюдать за сетью и запоминать оригинальные транзакции до того, как они агрегируются. Это достаточно легко, если вы будете просто архивировать все сообщения, которые вы видите в P2P-сети.
Тут вы можете удивиться — и это все?
На самом деле есть еще один уровень защиты, созданный командой Grin: протокол Dandelion («одуванчик»). «Одуванчик» — это метод формирования сетей, разработанный исследователями Университета Карнеги — Меллона, который должен скрывать IP создателя транзакции.
Обычно в таких криптовалютах, как биткоин, создатель транзакции просто рассылает транзакцию всем своим пирам, и она быстро проходит по P2P-сети. Но в протоколе Dandelion рассылка каждой транзакции начинается с секретной игры в сломанный телефон. Создатель передает свою транзакцию всего одному пиру, который, в свою очередь, передает ее другому пиру, и так далее по цепочке («ствол» одуванчика). После случайного количества таких ходов последний пир рассылает транзакцию, ровно как в биткоине («цветок» одуванчика). Но этот пир так далеко от создателя транзакции, что ни один наблюдатель не сможет сказать, с кого началась цепочка.
Это отлично работает для сокрытия IP того, кто совершает транзакцию. Но у Dandelion в Grin есть вторая функция: в редких случаях, он позволяет сохранить анонимность транзакции даже при наличии узла-сниффера в сети. Поскольку каждая транзакция начинается в «стволовой» фазе Dandelion, когда две транзакции пересекаются в «стволовой» фазе распространения, они будут агрегированы рано. Если это происходит, то к тому моменту, как транзакция рассылается и становится видна всем, узел-сниффер не может расклеить транзакции: они уже склеились в CoinJoin.
Этот механизм рассылки транзакций — главная защита Grin от связуемости транзакций узлами-снифферами. Но есть легкий способ сломать и ее.
По умолчанию каждой узел Grin соединен с 8 другими узлами-пирами. Но, увеличивая количество пиров, я могу соединить свой узел-сниффер с каждым узлом сети. Если мой узел будет онлайн непрерывно в течение долгого времени, в конце концов ко мне подключатся практически все узлы в сети, делая меня суперузлом.
Когда я стану суперузлом, есть высокая вероятность, что я буду в цепочке «одуванчика» каждой транзакции. Таким образом, единственное, почему у меня может не получиться поймать транзакцию до ее агрегации — это если две транзакции пересеклись в стволовой фазе одуванчика до того, как я увидел хоть одну их них. Если я увижу хотя бы какую-то из них до того, как они агрегируются, я могу разделить их с помощью простого вычитания множеств.
В своей атаке я смог связать 96% всех транзакций, подключившись лишь к 200 пирам из совокупных 3000 пиров в сети Grin. Но если бы я был готов потратить чуть больше денег, я бы легко мог подключиться к 3000 узлов, чтобы расклеить почти все транзакции. И для этого не обязательно держать один большой суперузел — такая же атака сработает, если запустить 3000 отдельных узлов с уникальными IP, каждая из которых будет подсоединена всего к одному пиру. Пока я перехватываю все транзакционные данные и сбрасываю их в центральную мастер-базу данных, атака будет работать точно так же.
Так можно ли спасти Mimblewimble?
Неясно. По-моему, в текущем варианте Grin нет способа защитить граф транзакций. Просто удлинить «одуванчик» недостаточно — это будет легко победить бОльшим числом узлов, как я описываю в техническом отчете.
Но несмотря на связуемость транзакций, у Mimblewimble все еще есть свойства, которые выделяют протокол среди других криптовалют. В нем возможна сквозная агрегация, которая является эффективным способом уменьшения размера блокчейна, и он эффективно скрывает суммы транзакций. Если вы хотите высокую приватность, вы всегда можете сочетать Mimblewimble с другим протоколом, который скрывает граф транзакции, например, как в Ethereum 9¾ (который сочетает Mimblewimble со схемой обнуления обязательств по типу Zerocash).
Но очевидно, что сам по себе Mimblewimble недостаточно сильный, чтобы обеспечить высокую приватность.
Биткоину сейчас 11 лет, но криптовалюты все еще на очень ранней стадии развития. Не так давно серьезные уязвимости были обнаружены и в Zcash, и в Monero. И этого следует ожидать: большинство интересных технологий все еще находятся в фазе исследования.
Но так всегда и развивается наука: мы постоянно выдвигаем новые гипотезы и опровергаем их, пока не останутся лишь те, что прошли проверку временем.
Спасибо Хасибу Киреши за существенную помощь в составлении этого отчета и иллюстрации наборов анонимности. Дополнительная благодарность Олегу Остроумову, Елене Надолински, Мохамеду Фоуда, Лукасу Райану и Надеру Аль-Наджи за рецензирование черновиков этого поста. И огромное спасибо Джейку Штуцману (NEAR Protocol) за иллюстрации по Dandelion и агрегации блоков. За перевод статьи спасибо Дарье Смирновой.
Если статья понравилась, рекомендую подписаться на мой Твиттер, где они выходят в первую очередь (на английском).
Disclosure: Dragonfly Capital обязуется не торговать активами, перечисленными в этом отчете, в течение 3 дней с даты публикации.