Атаки в мире криптовалют

Вы наверняка слышали об «атаке 51 %», «двойном расходовании» и других пугающих фразах, которые будоражат сообщества, связанные с криптовалютами. Несмотря на то что поводы для беспокойства действительно имеются, паника вкупе с невежеством порождает множество слухов. Угрожает ли опасность биткоину и другим цифровым валютам? Давайте проясним ситуацию и рассмотрим наиболее распространенные атаки, способные нарушить работу системы.

Атаки в мире криптовалют

Атака 51 %

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

Широко известно, что «криптовалюта защищена майнингом». Но что это означает? Как и от чего она защищена? Майнинг — это процесс создания новых блоков. А зачем они нужны? С технической точки зрения они требуются для идентификации «хороших» и «плохих» транзакций. Если Элис пытается отправить одни и те же деньги Бобу и Кэрол, теоретически не имеет значения, какая из транзакций является «правильной». Важно, что транзакция должна быть только одна. Каждый майнер должен решить, какую транзакцию выбрать — ту, которая произошла раньше, ту, за которую он получит больше, или ту, у которой лучше хеш, и т. д. Если майнеров много, имеем распределенную задачу выработки консенсуса.

Атака 51%

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

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

Таким образом:

  • Атакующий может: «запрещать» включение отдельных (либо всех) транзакций в цепочку блоков, отменять старые транзакции (возвращать деньги) и делать отмененные транзакции действительными.
  • Атакующий не может: контролировать оборот денег других людей (перенаправлять либо перехватывать транзакции) и препятствовать обмену данными между узлами сети.

Двойная трата

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

Атака типа «гонки» (Race Attack). Атакующий осуществляет транзакцию A, оплачивая покупку. Одновременно он выполняет транзакцию B, переводящую эти же деньги на другой счет злоумышленника. Если магазин не дожидается денег и отгружает купленные товары, то идет на значительный риск: с вероятностью 50 % транзакция B может попасть в цепочку блоков без каких-либо усилий со стороны взломщика. Что еще хуже, он может увеличить эту вероятность, выбирая узлы сети для передачи той или иной транзакции. Расчеты для таких операций можно найти в этом документе. Именно поэтому не стоит доверять неподтвержденным транзакциям, не так ли?

Атака Финни (Finney Attack). А теперь давайте предоставим атакующему доступ к некоторой части мощностей майнинга сети. Он пытается найти обычный блок, который может содержать его транзакцию B. Суть в том, что ни транзакция A, ни транзакция B еще не отправлены. Как только блок обнаруживается (рано или поздно в зависимости от вычислительных мощностей), он отправляет... транзакцию A! Злоумышленник покупает товары в магазине. Продавец, наученный горьким опытом, ждет появления блока с транзакцией A в сети. Как только блок обнаруживается, магазин отгружает товары, и... тут-то и появляется блок с транзакцией B, найденный злоумышленником. Это приводит к так называемой развилке, когда майнеры должны выбрать один из двух блоков для продолжения цепочки.

Если выбор осуществляется неслучайным образом (что само по себе гарантирует 50 % успеха!), при некоторых обстоятельствах атакующий может увеличить свои шансы. Поэтому даже транзакция с 1 подтверждением может быть небезопасной.

Затем предоставим нашему взломщику доступ к БОЛЬШИМ, но все же не достигающим 51 %, мощностям майнинга сети. Что произойдет тогда? Он может подготовить не один блок, а сразу несколько, чтобы обогнать «честную» цепочку. Вероятность такого события не велика, но эта атака будет на 100 % успешной. Например, если у злоумышленника имеется 10 % хешрейта, на каждые 100 блоков (чаще, чем раз в сутки!) он может находить два «быстрых» блока подряд и начинать свою атаку. Теперь магазин, ожидающий двух подтверждений, снова в опасности! Так сколько же подтверждений требуется с учетом возможностей атакующего? Подробные расчеты можно найти в этой статье, но, по мнению Сатоши, достаточно шести подтверждений.

Эгоистичный майнинг

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

Все начинается с того, что пул, которым владеет злоумышленник, заявляет, что «здесь майнинг выгоднее, чем в других пулах». Давайте предположим, что это правда. Как в таком случае поведут себя обычные майнеры? Вероятнее всего, они войдут в пул и начнут майнинг. В результате пул может получить 51 % мощностей. Конечно, каждый майнер отдает себе отчет в том, что, присоединяясь к крупному пулу, он приближает этот момент, а потому подвергает опасности систему, из которой извлекает прибыль. К сожалению, такова человеческая натура. Поэтому когда каждый «играет сам за себя», результат чаще всего оказывается плачевным.

Но тут возникает вопрос: как пул может быть более выгодным? Естественно, атакующий не станет за свой счет компенсировать разницу. Хотя это может быть дешевле, чем просто купить 51 %, все равно расходы будут весьма велики. Рассмотрим алгоритм, изложенный в указанной статье, который позволяет одному пулу регулярно получать чуть больше, чем обычным пулам.

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

Когда пул находит новый блок, который увеличивает его приватную цепочку, то:

  1. В случае, если цепочка блоков на данный момент раздвоилась, пул публикует свой собственный блок и выигрывает гонку. Блок, найденный честными майнерами, становится изолированным, и их работа оказывается напрасной.
     блокN уже опубликован в сети Ситуация развилки: блокN уже опубликован в сети
  2. Если развилки нет, пул оставляет этот блок в тайне и продолжает наращивать свою цепочку (тем самым увеличивая отрыв)
    В данной ситуации атакующий выигрывает, но сеть по-прежнему майнит цепочку блока N В данной ситуации атакующий выигрывает, но сеть по-прежнему майнит цепочку блока N

Когда остальная часть сети находит блок для публичной цепочки, то:

  1. В случае, если публичная цепочка опережает приватную, пул «отбрасывает» свои неопубликованные блоки (при наличии) и начинает новую приватную цепочку от нового блока. Это самый неудачный для пула сценарий, поскольку он теряет часть проделанной работы.
    Атакующий проигрывает и начинает новую приватную цепочку от нового блокаАтакующий проигрывает и начинает новую приватную цепочку от нового блока
  2. Если публичная и приватная цепочки сравнялись, пул публикует все свои блоки сразу. Таким образом, он вызывает развилку цепочки блоков и с некоторой вероятностью выигрывает. Здесь все зависит от времени реакции пула, поскольку обычные майнеры продолжают генерацию цепочки, которую они начали. Если, к примеру, пул имеет доступ ко всем узлам в сети, он опубликует свою цепочку до распространения свежего блока.
    Атакующий публикует все блоки, находящиеся в приватной цепочке, и возникает развилка. Цепочка, которая находит следующий бок, выигрывает. Атакующий публикует все блоки, находящиеся в приватной цепочке, и возникает развилка. Цепочка, которая находит следующий бок, выигрывает.
  3. Если публичная цепочка отстает от приватной на N блоков, пул отправляет N+1 блоков, моментально изолируя свежий блок сети (так что сеть снова потратила свои ресурсы впустую).
    Атакующий публикует все блоки, находящиеся перед блокомN+3*, и оставляет остальные блоки в тайне. Атакующий публикует все блоки, находящиеся перед блоком N+3*, и оставляет остальные блоки в тайне.

Главной целью данной атаки является пустое расходование ресурсов сети. Такое случается всякий раз, когда присутствует хотя бы один приватный блок: обычная сеть не знает, что она отстает, и майнит блоки, которые с большой вероятностью будут изолированы. Естественно, пул время от времени будет терять деньги, когда он не опубликует собственный блок, который изолируется после проигрыша гонки. Тем не менее согласно расчетам, приведенным в статье, такая тактика в среднем выгоднее обычного майнинга. Основной причиной этого является то, что «честная» сеть теряет блоки после их изоляции.

Поэтому каждый здравомыслящий майнер считает более выгодным присоединиться к такому пулу, чем терять ресурсы в других пулах. Это и является целью злоумышленника. Так как же противостоять такой атаке? Во-первых, есть надежда, что в подобном случае здравомыслящие майнеры просчитают ситуацию на два шага вперед и поймут, что выигрывая центы от присоединения к пулу, они потеряют доллары после взлома сети при получении пулом 51 % ресурсов. Во-вторых, описанная нами модель «кормит» только одного атакующего. А что если все пулы используют этот алгоритм? С точки зрения логики, если все участники ведут себя подобным образом (в том числе нечестные), такой алгоритм не дает никаких преимуществ.

Атака Сибиллы

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

Как правило, сделать это очень сложно: коды биткоина и других криптовалют написаны таким образом, что узел выбирает соединение с другими узлами практически случайно. Даже в случае, если взломщик контролирует 80 % всех узлов в сети, и нам требуется установить 8 случайных исходящих соединений, вероятность оказаться полностью окруженным составляет всего 0,8^8 = 17 %.

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

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

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

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

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

Данный текст не следует рассматривать в качестве всеобъемлющего руководства по борьбе с атаками. Некоторые моменты мы могли забыть, а некоторые опущены намеренно. Вполне вероятно, что нам известно не все. Главное, что не существует такой разрушающей атаки, которая могла бы уничтожить нашу молодую отрасль.

Более того, любая новая (описанная) атака в действительности является выдающимся событием, поскольку способствует развитию технологий.

Категория: 
Безопасность
Ваша оценка: Нет
0
Голосов еще нет
2708 / 0
Аватар пользователя admin
Публикацию добавил: admin
Дата публикации: пн, 02/01/2016 - 16:05

Что еще почитать:

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