Варианты атак на распределенные сети | Bitcoin School
Bitcoin School

Варианты атак на распределенные сети

30-го окт. 2019

В отличие от конечных пользователей сеть Биткойн очень хорошо защищена за счет изящных решений многих проблем на уровне протокола и большой вычислительной мощности распределенной сети майнеров. Для того, чтобы электронная платежная система могла функционировать и быть по настоящему одноранговой (все пользователи равны и нет контролирующего органа), необходимо решить главную проблему – возможность двойного расходования средств (double spending). Проще говоря, нужно предотвратить повторное использование уже потраченной монеты. Как именно это реализовано в коде Биткойна, можете прочитать в White paper. В этой статье, мы разберёмся с конкретными теоретически-возможными способами обмануть алгоритм подтверждения транзакций.

Атаки двойного расходования

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

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

Атака Финни 

Теоретически возможная атака Финни названа в честь Hal Finney – американского программиста и одного из первых пользователей Биткойна. Он же получил первую в истории транзакцию Биткойна в количестве 10 монет от Сатоши Накамото.

Атака Финни – это мошенничество в виде двойного расходования, которое требует участия майнера после того, как блок был добыт. Риск атаки Finney не может быть устранен независимо от мер предосторожности, принятых продавцом, но требуется некоторая хеш-мощность майнера, и должна произойти определенная последовательность событий.

Предположим, что атакующий периодически генерирует блоки. В каждый блок, который он генерирует, он включает перевод с адреса A на адрес B, оба из которых он контролирует. Чтобы обмануть вас, когда он генерирует блок, он не транслирует его. Вместо этого он открывает веб-страницу вашего магазина и делает платеж на ваш адрес C со своего адреса A, используя тот же input, что и в траназкции А->B. Иногда в продавцы не дожидаются даже 1 подтверждения в сети и при появлении на своем кошельке транзакции со статусом Pending передают товар. Теперь злоумышленник транслирует свой блок, и его транзакция (А->В) будет иметь приоритет над вашей. Это приводит к так называемой развилке (fork), когда майнеры должны выбрать один из двух блоков для продолжения цепочки.

При обычных условиях выбор осуществляется практически случайным образом, и это дает около 50 % вероятности, что будет продолжена цепочка с транзакцией A->B, а A->C будет отменена. При некоторых обстоятельствах атакующий может увеличить свои шансы. Поэтому даже транзакция с 1 подтверждением может быть небезопасной.

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

Например, если у злоумышленника имеется 10 % хешрейта, на каждые 100 блоков (чаще, чем раз в сутки) он может находить два «быстрых» блока подряд и начинать свою атаку. Тогда даже продавец, ожидающий двух подтверждений, в опасности! 

По мнению Сатоши, для полной безопасности достаточно шести подтверждений.

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

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

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

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

В централизованных решениях атаки Сивиллы обычно исключаются с помощью набора эвристических правил:

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

С помощью подобной атаки фальсифицируют интернет-голосования или накручивают рейтинг на Google Page Rank.

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

 

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

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

Последствия атаки Сивиллы:

1) Атакующий блокирует транзакции пользователя, фактически отсоединив его от общей сети

2) Атакующий сам решает, к какому блоку подсоединить пользователя. И чаще всего это отдельно созданные им блоки, где реализуется «двойная трата»

3) Атакующий отслеживает все транзакции пользователя, применяя для этого скрипты и ПО.

 

Эгоистичный майнинг/Атака альтернативной истории

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

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

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

Продавец дожидается N подтверждений и передает товар.

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

Другая стратегия (названная нулевой) состоит в том, что публиковать можно результат секретной цепочки даже при N = M, при этом сеть войдёт в состояние бифуркации (раздвоения пути): из-за медлительности сбора и синхронизации результатов большинство пользователей продолжат майнить блоки по ранее опубликованной цепочке, а нечестный майнер будет майнить обе цепочки и присоединится к той из них, в которой быстрее получит блок. При этом довольно высок риск всё же отправить деньги продавцу, не получить награду за блоки и потратить много электричества впустую.

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

Косвенным признаком эгоистичного майнинга могло бы быть увеличение доли блоков-сирот (orphan block).

В сети Биткойн orphaned блок – это блок, который не принят сетью или не является частью самой длинной цепочки.

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

 

Атака Vector 76 или "атака одного подтверждения"

В 2011 году, пользователь Bitcointalk под ником vector76 описал этот тип двойного расходования.

Это комбинация атаки гонки (ниже) и атаки Финни, таким образом, когда транзакция, которая даже имеет одно подтверждение, все еще может быть отменена. Атака основана на преднамеренном разветвлении цепочки транзакций и позволяет дважды тратить средства с одним подтверждением. Здесь используется тот факт, что при постепенном включении разных транзакций в блоки часть сети будет видеть транзакции действительными, а другая часть – недействительными. Атака длится всего 10 минут и за это время атакующий может успеть получить услуги или обналичить средства по двум транзакциям.

Атака типа «гонка» (Race Attack)

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

Проект Blockcypher направлен на помощь в таких ситуациях. Для любой транзакции с нулевым подтверждением по специальному алгоритму добавляется атрибут доверия. Если этот показатель составляет 99,9 %, то вероятность попытки двойного расходования равна только 0,01 %. Расчёт основан на анализе двух аспектов транзакции: «формат» и «поведение». «Формат» анализирует структуру транзакции: каковы входные и выходные данные, их история, тип подписи. «Поведение» рассматривает то, как транзакция распространяется по сети, отслеживает изменение её параметров со временем.

Алгоритм атаки Vector 76

Нечестный клиент (А) удерживает предварительно добытый блок(1), который состоит из транзакции, которая реализует определенный депозит (т. е. высвобождает депозитные монеты в обмене Биткойнов). Злоумышленник (А) ожидает объявления следующего блока(2) и быстро отправляет блок 1 вместе с недавно добытым блоком 2 непосредственно на ноду биржи или к своим ближайшим коллегам с надеждой, что биржа и, возможно, некоторые из соседних майнеров рассмотрят цепочку, содержащую предварительно добытый блок в качестве основной цепи. Злоумышленник быстро отправляет другую транзакцию, которая запрашивает вывод из обмена тех же монет, которые были депонированы злоумышленником в его предыдущей транзакции. В этот момент, если другая цепочка, которая не содержит транзакцию и которая используется злоумышленником для внесения монет, проскочит, депозит станет недействительным, но злоумышленник уже выполнил вывод, Таким образом, обменник теряет монеты.


Атака 51%

Это атака, при которой в распоряжении атакующего должны находиться вычислительные мощности большие, чем у всей остальной сети  (более 51% хеш-мощности).

В децентрализованных платёжных системах (криптовалютах) нет надзорного органа, который бы вел книгу учета и следил за правомерностью всех транзакций. Поэтому для предотвращения повторного расходования одной и той же монеты было предложено объединять транзакции в блоки, которые выстраиваются в непрерывную цепочку — формируют блокчейн (буквально цепочку блоков). В сетях на алгоритме Proof-of-Work, для добавления нового блока майнерам нужно провести  вычисления, чтобы доказать совершение работы. Тот, кто первым решает задачу, получает вознаграждение (награду за блок). Чем больше у майнера вычислительных мощностей, тем выше вероятность решить задачу первым.

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

 

Жертвами атаки 51 становились некоторые сети с невысоким хешрейтом:

1) Electroneum

Атака произошла в апреле 2018 года. Говорят за атакой стоит Bitmain. Но никаких доказательств, подтверждающих это нет.

Прочитать подробнее можно здесь

2) Bitcoin Gold
Подробнее

3) Zen-Cash

ZenCash — это один из форков ZClassic (ZCL) и эту монету можно майнить на ASIC-майнерах.

3 июля 2018 года, взломщики осуществили атаку двойного расходования (Double-spending). Благодаря приросту вычислительной мощности удалось получить контроль над более чем 51% хешрейта сети. После этого ребята успели несколько раз реорганизовать блокчейн, причем наибольший откат составлял 38 блоков. парни также смогли провести двойное расходование двух крупных транзакций на 13 000 и 6 600 ZEN, что по тому курсу составляло чуть около $550 000.
Подробнее

4) Verge
Подробнее

5) Bitcoin Cash
Подробнее

5) Monacoin

6) Litecoin Cash

 

Самое надёжное, что можно делать для обеспечения безопасности платежей – это дожидаться достаточного количества подтверждений, которое напрямую зависит от суммы перевода. Часто можно встретить следующий вариант: если речь идёт о транзакции на сумму меньше 1000$, то будет достаточно 1-2 подтверждений, 10000-1000000$ – лучше подождать 3-5 блоков, а при переводе бOльших объемов достаточно надёжным будет 10+ подтверждений. Напомним, что Сатоши считал 6 подтверждений вполне достаточным.

А вот от атаки 51% защититься поможет только использование блокчейнов с высоким хешрейтом (Биткойн), основанных на алгоритме Proof-of-stake (правда там тоже есть немало вопросов к безопасности) или с защитой от подобных атак (например, Dash с их технологией ChainLocks).