- PVSM.RU - https://www.pvsm.ru -

Проверка временем: Timejacking против Bitcoin

Проверка временем: Timejacking против Bitcoin - 1

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

В этой статье мы рассмотрим атаку «Timejacking», основанную на уязвимости в обработке временных меток блоков в системе криптовалюты Bitcoin, и попытаемся объяснить, почему атака есть, а ее успешной реализации нет.

P.S. Тут будет много производных от слова «время». Очень много.

В двух словах

Впервые об атаке «Timejacking» написал Алекс Боверман. С его публикацией вы можете ознакомиться здесь [1]. В чем суть: атака эксплуатирует уязвимости механизма проверки временных меток блоков и счётчика времени в Bitcoin. Злоумышленник манипулирует одним из счётчиков времени узла-жертвы и создает «отравленный» блок. Жертва этот блок отбросит, а остальная сеть успешно примет, и пожалуйста — у нас спровоцирован форк! Вся сеть использует цепочку блоков, строящуюся за «отравленным», а жертва считает валидной альтернативную цепочку с повторной тратой токенов (a.k.a. double-spending), в которой «отравленный» блок не фигурирует.

Атака проводится в два этапа. Чтобы было понятнее, поговорим о каждом из них отдельно.

Акт 1. Создание форка и изолирование жертвы

Злоумышленнику необходимо сгенерировать «яБЛОКо раздора» — тот самый «отравленный» блок, который проигнорирует жертва. Точно так же жертва отбросит и другие блоки, которые будут добавляться последовательно за «отравленным».

Как обмануть жертву и заставить отбросить корректный блок?

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

Проверка временем: Timejacking против Bitcoin - 2

У временного окна есть две границы:

  • нижняя — tmin , она равна медиане временных меток 11 блоков, предшествующих верифицируемому блоку
  • верхняя — равна значению времени сети t0 + 2 часа

Значение временной метки блока верифицируется не относительно системного времени узла, а относительно медианного времени его соседей — времени сети (a.k.a. network-adjusted time).

Как считается время сети:

  • При установке нового соединения узлы обмениваются своим системным временем
  • Каждый узел вычисляет отклонение собственного системного времени от системного времени каждого своего соседа
  • Для вычисленных отклонений выбирается медианное значение
  • Собственное системное время + медианное отклонение = время сети

Вот как выглядит пример вычисления времени сети:

Проверка временем: Timejacking против Bitcoin - 3

Таким образом, злоумышленник может манипулировать значением времени сети жертвы, подключив к ней достаточное количество соседей, анонсирующих отстающее системное время. Уменьшается значение времени сети жертвы — уменьшается и верхняя граница диапазона допустимых значений временной метки верифицируемого блока. Но если отклонение времени соседа превышает 70 минут [2], то его время не будет учитываться при вычислении времени сети. Поэтому максимальное значение, на которое можно уменьшить время сети жертвы, равно 70 минутам.

Проверка временем: Timejacking против Bitcoin - 4

Соответственно, наш «отравленный» блок — это блок, временная метка которого должна попадать во временное окно всех узлов сети, кроме жертвы. Только тогда вся сеть его успешно примет, а жертва, время сети которой модифицировано, не менее успешно отбросит. На рисунке ниже — временное окно жертвы vs временное окно остальных узлов.

Проверка временем: Timejacking против Bitcoin - 5

Заметим, что, благодаря протоколу NTP, можно считать, что у большинства узлов системное время приблизительно одинаково, т.е., время сети каждого узла близко по значению к их системному времени.

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

Проверка временем: Timejacking против Bitcoin - 6

Акт 2. Double-spending

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

Проверка временем: Timejacking против Bitcoin - 7

Жертва примет эту цепочку, поскольку значение временных меток выбрано нарушителем из ее же временного окна, а остальные узлы ее справедливо проигнорируют — ведь они уже строят свою цепочку от «отравленного» блока, которая длиннее, чем альтернативная. В результате жертва считает, что получила токены, и отправляет товар. А основная сеть уверена, что токены не покидали кошелёк злоумышленника, и тот получает товар за «спасибо» — ведь большинство не может ошибаться. Финал, герой темной стороны торжествует!

Но не все так просто

Подводный камень № 1

В майнинг Bitcoin сегодня вовлечены огромные вычислительные мощности. Вероятность успешной генерации «отравленного» блока можно оценить по следующей формуле:

Проверка временем: Timejacking против Bitcoin - 8

Сегодня общий хэшрейт [3] сети Bitcoin приблизительно равен H=34∙1018 хэш/с. В таком случае, используя самое производительное устройство из этого списка [4], заявленный хэшрейт которого равен h=18∙1012 хэш/с, вероятность сгенерировать «отравленный» блок за 1 год (t=365∙24∙60) приблизительно равна 3%. А если взять из этой статистики [5] относительно небольшой майнинг-пул, обладающий 0,3% от общего хэшрейта, то вероятность успешной генерации блока в течение 3 суток равна 73%.

Подводный камень № 2

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

Для того, чтобы жертва приняла транзакцию с double-spending, блок с ней должен быть подтверждён ещё 6 блоками (для стандартного клиента). Генерировать подтверждающие блоки нарушителю придётся самостоятельно, и при этом надо уложиться в вышеупомянутые 70 минут. Боверман рассматривает [6] ситуацию, когда злоумышленник владеет 10% мощности всей сети. В такой ситуации, для генерации 6 блоков понадобятся ~5,5 часа с вероятностью успеха 10%. Для 3,3 часа вероятность успеха падает до 1%, для 140 минут — 0,147%. Согласно этим оценкам, успешно сгенерировать 6 блоков за 70 минут — это из области фантастики.

Подводный камень № 3

Когда узел вычисляет время сети, он учитывает системное время только первых 200 соседей [7] — потом медианное отклонение пересчитываться уже не будет. Значит, атаку необходимо реализовывать, пока количество уже подключенных к жертве соседей не превышает 99 — иначе время, анонсированное злоумышленником, не будет медианным. Такое количество соседей набежит примерно за 24 часа, а после жертву уже надо будет перезагружать — например, с помощью DoS.

Конец

В заключение можно сказать, что атака «Timejacking» — это очень хорошо, но в суровых реалиях Bitcoin становится неприменимой. А что насчет других систем, использующих блокчейн? Оставим этот вопрос для ваших дальнейших исследований!

Автор: NWOcs

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/284869

Ссылки в тексте:

[1] здесь: http://culubas.blogspot.ru/

[2] 70 минут: https://github.com/bitcoin/bitcoin/blob/0.16/src/timedata.h#L13

[3] общий хэшрейт: https://charts.bitcoin.com/chart/hash-rate

[4] этого списка: https://en.bitcoin.it/wiki/Mining_hardware_comparison

[5] этой статистики: https://blockchain.info/pools

[6] рассматривает: http://culubas.blogspot.com/

[7] первых 200 соседей: https://github.com/bitcoin/bitcoin/blob/v0.16.0/src/timedata.cpp#L62

[8] Источник: https://habr.com/post/413721/?utm_campaign=413721