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

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

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

Взлом DAO 2016 года - показательный случай

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

Недавно особенно интересное дело, взлом DAO в 2016 году, получило значительное развитие - была опубликована статья-расследование Forbes, в которой была установлена личность предполагаемого хакера. Процесс, в ходе которого был идентифицирован этот человек, позволяет получить некоторое представление о широко используемом кошельке конфиденциальности Wasabi Wallet и о том, как неправильное использование этого программного обеспечения может привести к "демиксингу" средств предполагаемого хакера. 

Были допущены критические ошибки

Что касается порядка действий, то первым шагом хакеров была конвертация части похищенных средств из Ethereum Classic в Bitcoin. Для осуществления обмена хакер использовал Shapeshift, который в то время предоставлял полную публичную запись всех сделок на платформе. Из Shapeshift часть средств перешла в Wasabi Wallet. Дальше все пошло по накатанной.  

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

Вместо того, чтобы транзакция имела одного плательщика и получателя, транзакция CoinJoin имеет несколько плательщиков и получателей. Допустим, у вас есть CoinJoin с 10 участниками - если CoinJoin построен правильно и все правила взаимодействия соблюдены, средства, которые вытекают из CoinJoin, будут иметь набор анонимности, равный 10. То есть любой из 10 "смешанных выходов" из транзакции может принадлежать любому из 10 (или более) "несмешанных входов" в транзакцию. 

Хотя CoinJoins могут быть очень мощным инструментом, существует множество возможностей для участников совершить критические ошибки, которые значительно ухудшают или полностью подрывают любую конфиденциальность, которую они могли получить от CoinJoin. В случае с предполагаемым хакером DAO такая ошибка была допущена. Как вы прочтете далее, есть вероятность, что эта ошибка была ошибкой пользователя, однако также возможно, что в Wasabi Wallet была (с тех пор исправленная) ошибка, которая привела к нарушению конфиденциальности. 

Wasabi Wallet использует протокол ZeroLink, который строит CoinJoins со смешанными выходами равной ценности. Это означает, что все пользователи должны смешивать только определенное, заранее установленное количество Биткойна. Любая сумма, превышающая это количество, которая поступает в CoinJoin, должна быть возвращена соответствующим пользователям в виде несмешанного Биткойна.

Если, например, у Алисы есть один вывод .15 Биткоина, а CoinJoin принимает только выводы стоимостью .1 Биткоина, то после завершения CoinJoin у Алисы будет смешанный вывод .1 Биткоина и несмешанный вывод .05 Биткоина. Биткоин в размере .05 считается "несмешанным", потому что его можно связать с исходным результатом Алисы в размере .15. Смешанный выход больше не может быть напрямую связан с входом и будет иметь набор анонимности, состоящий из всех других участников CoinJoin. 

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

В случае с хакером DAO, похоже, что в процессе использования Wasabi Wallet они использовали один адрес в нескольких CoinJoins; в одном случае адрес был использован в качестве несмешанного вывода изменений, во втором - в качестве смешанного вывода.

Это относительно необычная ошибка в контексте CoinJoin, потому что эта техника "вина за ассоциацию" требует транзакции ниже CoinJoins, чтобы "объединить" несмешанные и смешанные выходы, связав их вместе. Но в данном случае не требовалось анализировать транзакции за пределами двух CoinJoin, поскольку один и тот же адрес использовался противоречивыми способами в двух разных CoinJoin. 

По сути, такая возможность существует из-за конструктивного решения в программном обеспечении Wasabi Wallet: Wasabi Wallet использует один путь деривации для смешанных и несмешанных выходов. Это считается плохой практикой. Сотрудник Wasabi заявил, что это сделано для того, чтобы сделать восстановление кошелька совместимым с другими кошельками, однако в BIP84 (именно эту схему деривации использует Wasabi Wallet) есть стандартный способ распознавания пути деривации, назначенного для изменения выходов.

Сбои, вызванные таким выбором дизайна, наиболее заметны, когда у пользователя одновременно запущены два экземпляра Wasabi Wallet при использовании одного и того же семени. В этом случае, при одновременной попытке запустить микс от каждого экземпляра, два экземпляра могут выбрать один и тот же адрес таким противоречивым образом. Об этом предупреждается в официальной документации. Также возможно, что виной тому стали известные ошибки в кошельке Wasabi Wallet.

Итоги и выводы

Так что же мы можем из этого извлечь? Хотя эта ошибка с Wasabi - не совсем конец истории, она сыграла решающую роль в розыске предполагаемого хакера. В очередной раз подтверждается наше убеждение, что конфиденциальность - это сложно. Но на практике мы имеем еще один пример того, как важно предотвратить загрязнение выходных данных при использовании инструментов конфиденциальности, и как тщательный "контроль монет" необходим как пользователям, так и программному обеспечению. Возникает вопрос, какого рода протоколы конфиденциальности разработаны для минимизации этого класса атак? 

Одним из интересных решений является CoinSwap, где вместо объединения выводов в большую транзакцию, вы обмениваетесь выводами с другим пользователем. Таким образом, вы обмениваетесь историями монет, а не объединяете истории монет. Более того, если обмен монетами осуществляется в контексте вне цепи (как это реализовано в Mercury Wallet), то не нужно иметь дело с несмешанными выводами изменений. 

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

Mercury Wallet в настоящее время является единственной внецепочечной системой обмена монет, доступной для конечных пользователей. Он позволяет пользователям заблокировать свои монеты в протоколе второго уровня (известном как statechain), а затем вслепую обменивать их с другими пользователями statechain. Это очень интересная техника, и с ней стоит поэкспериментировать тем, кто заинтересован в изучении новых инструментов обеспечения конфиденциальности с захватывающей функциональностью и приемлемыми компромиссами.

Источник