Timejacking - это потенциальная уязвимость в системе, которая активно обсуждалась в первые годы существования Биткойна.
В 2011 году первым об атаке «Timejacking» написал Алекс Боверман. Суть атаки заключается в уязвимости механизма проверки временных меток блоков и счётчика времени в биткоин. Биткойн ноды имеют внутренние часы, которые отвечают за эти временные метки и синхронизируют сетевое время, чтобы убедиться, что оно совпадает с другими узлами.Каждый узел поддерживает внутренний счетчик, который представляет сетевое время. Это основано на среднем времени одноранговых узлов, которое отправляется в сообщении при их соединении. Счетчик времени сети возвращается к системному времени если медианное время отличается более чем на 70 минут от системного времени.
Злоумышленник может потенциально замедлить или ускорить счетчик времени сети узла, подключившись к нескольким одноранговым узлам и сообщив о неточных метках времени.
Он манипулирует одним из счётчиков времени узла-жертвы и создает «отравленный» блок. Жертва этот блок отбросит, а остальная сеть успешно примет, и пожалуйста - у нас спровоцирован форк! Вся сеть использует цепочку блоков, строящуюся за «отравленным», а жертва считает валидной альтернативную цепочку с повторной тратой токенов (double-spending), в которой «отравленный» блок не фигурирует.
Создание «отравленного блока»
В заголовке каждого блока есть временная метка, которую узел проверяет при верификации. Это значение должно попадать в определенный диапазон, мы назовем его временным окном. Диапазон временного окна представлен на рисунке ниже:
У временного окна есть две границы:
нижняя — tmin , она равна медиане временных меток 11 блоков, предшествующих верифицируемому блоку
• верхняя — равна значению времени сети t0 + 2 часа
Как считается время сети:
• При установке нового соединения узлы обмениваются своим системным временем
• Каждый узел вычисляет отклонение собственного системного времени от системного времени каждого своего соседа
• Для вычисленных отклонений выбирается медианное значение
• Собственное системное время + медианное отклонение = время сети
Атака1.Злоумышленник может манипулировать значением времени сети жертвы, подключив к ней достаточное количество соседей, анонсирующих отстающее системное время. Максимальное значение, на которое можно уменьшить время сети жертвы, равно 70 минутам.
2. Создаётся «отравленный» блок. Его задача попасть во временные рамки сети, кроме времени жертвы. Основная сеть принимает блок, а жертва его отбросит. В итоге, атакуемый изолируется от основной сети и переходит на цепочку блоков, которые генерируются мошенником.
3.В генерируемой мошенником сети жертве переводятся монеты, а в основной сети эти монеты находятся на счету атакующего. Атакуемый совершает обмен или отправляет товар и несет убытки. Как только сеть стабилизируется, основная цепочка будет иметь приоритет, и подтверждения того, что злоумышленник отправил, будут отменены.
Удобство атаки заключается в том, что не требуется замена всех честных нод вредоносными узлами.
Проблемы:1.Для отправки «отравленного» блока требуется хорошая мощность сети
2.«Отравленный» блок попадёт во временное окно жертвы не более чем через 70 минут — это максимальное время, за которое необходимо завершить третий этап.
Для того, чтобы жертва приняла транзакцию с double-spending, блок с ней должен быть подтверждён ещё 6 блоками (для стандартного клиента). Генерировать подтверждающие блоки нарушителю придётся самостоятельно, и при этом надо уложиться в вышеупомянутые 70 минут. Боверман рассматривает ситуацию, когда злоумышленник владеет 10% мощности всей сети. В такой ситуации, для генерации 6 блоков понадобятся ~5,5 часа с вероятностью успеха 10%. Для 3,3 часа вероятность успеха падает до 1%, для 140 минут — 0,147%. Согласно этим оценкам, успешно сгенерировать 6 блоков за 70 минут — это из области фантастики.
3. Когда узел вычисляет время сети, он учитывает системное время только первых 200 соседей — потом медианное отклонение пересчитываться уже не будет. Значит, атаку необходимо реализовывать, пока количество уже подключенных к жертве соседей не превышает это количество, иначе время, анонсированное злоумышленником, не будет медианным. Такое количество соседей набежит примерно за 24 часа, а после жертву уже надо будет перезагружать — например, с помощью DoS атаки.
Алекс Боверман предлагал следующие
меры, для предотвращения атаки:
Использование системного времени узла вместо сетевого времени блокчейна, чтобы определить верхний предел временных меток блоков и при создании блоков.
Уменьшить временные диапазоны в несколько раз
Использование доверенных нод
Проверка состояния сети и отключение нод в случае подозрительной активности
Требовать больше подтверждений перед принятием транзакции
Использовать отложенную проверку метки времени.
ИтогАтака «Timejacking» может успешно сработать, но в текущих реалиях сети Bitcoin становится неприменимой. Максимум это может создать задержки в сети или вызвать проблемы на некоторых узлах.
Огромный интерес эта тема может вызвать у менее популярных блокчейнов.
Материал не простой, поэтому некоторые вещи оставил без изменения, как в источнике.
Для написания статьи были использованы эти материалы:http://culubas.blogspot.com/https://habr.com/ru/company/neobit/blog/413721/https://ru.wikipedia.org/wiki/Атака_по_времениhttps://bitcointalksearch.org/topic/timejacking-5180442https://bitcoin.stackexchange.com/questions/3516/was-a-timejacking-attack-ever-performed