Rolling Code и как его ломать

Rolling Code и как его ломать

Серафим Перекалин

Что такое rolling code?

Rolling code (или hopping code, он же плавающий код) - механизм динамической аутентификации и защиты от replay-атак. При каждой передаче устройство формирует новое значение для аутентификации, которое обычно вычисляется на основе счетчика и секретного ключа. Главная задача rolling code - защитить систему от повторного воспроизведения перехваченного сигнала.

Как устроен rolling code с точки зрения криптографии?

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


Сам процесс можно разделить на следующие этапы:

  1. Инициализация - при сопряжении передатчик отправляет приемнику свой идентификатор и начальное значение счетчика.
  2. Генерация кода - при каждой передаче сигнала передатчик увеличивает счетчик на единицу и шифрует новое значение счетчика с использованием общего секретного ключа. В качестве алгоритма шифрования в старых системах обычно использовались специализированные шифры (KeeLoq, Hitag2 и прочие). В современных системах обычно используются более криптостойкие алгоритмы.
  3. Передача - зашифрованный код вместе с дополнительными данными (например, идентификатор устройства) отправляется на приемник.
  4. Получение и проверка - приемник, зная текущий счетчик и ключ, расшифровывает принятый код и проверяет, находится ли значение счетчика в допустимом окне синхронизации.
  5. Синхронизация счетчика - если код корректен, то приемник обновляет сохраненное состояние передатчика. Счетчик самого передатчика изменяется независимо при формировании сообщений.
Окно синхронизации - это диапазон значений счетчика, в пределах которого принимающее устройство принимает пришедшие коды как валидные.

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

Примеры проектов для лучшего понимания rolling code

Атаки на системы с rolling code

Как уже говорилось, сам алгоритм изначально был создан для защиты от replay-атак. Но на практике некоторые системы уязвимы как к атакам на радиоканал и логику протокола, так и к криптоанализу используемого шифра.

Replay-атака на системы с rolling code

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

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

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

RollJam (Jamming and Replay)

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

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

Сама реализация достаточно проста: мы перехватываем первый радиосигнал от брелока, одновременно с этим создавая помехи на той же частоте. Таким образом, валидный код остается у нас, а приемник получает искаженное сообщение, которое игнорирует.

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

RollBack (Time-Agnostic Replay Attack)

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

Для реализации этой атаки нам необходимо перехватить 2 и более валидных сигнала, которые могут быть как последовательными, так и нет (в зависимости от конкретной реализации). После чего, владелец спокойно может пользоваться устройством, и счетчик в брелоке будет уходить вперед.

Затем, мы передаем приемнику ранее перехваченные коды в необходимой последовательности и по сути, приемник начинает допускать прием кодов в окне синхронизации.

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

RollJam и RollBack не ломают криптографический алгоритм напрямую, а эксплуатируют особенности радиоканала и управления состоянием протокола. Однако существуют и атаки непосредственно на используемые шифры.

Алгебраическая атака на KeeLoq

KeeLoq - это 32-битный блочный шифр с 64-битным ключом, имеющий достаточно простую структуру. Благодаря этому он теоретически подвержен широкому спектру криптографических атак, но самым ярким примером является алгебраическая атака.

В этой атаке мы сводим задачу восстановления ключа к решению системы нелинейных уравнений над полем GF(2).

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

Для нескольких известных пар «открытый текст - шифротекст» записываются уравнения, описывающие преобразование на каждом раунде.

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

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

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

Также важно понимать, что "чистая" алгебраическая атака работает на 160 раундов KeeLoq. Именно для 160 раундов алгебраическая атака обретает меньшую вычислительную сложность, чем полный перебор.

Для атаки на все 528 раундов требуется применение дополнительных техник, и, как следствие, вычислительная сложность сильно увеличивается.

Корреляционная атака на Hitag2

Hitag2 - это поточный шифр, который используется в RKE-системах многих производителей (Alfa Romeo, Chevrolet, Peugeot, Opel, Ford и другие). Он построен на базе LFSR и нелинейной фильтрующей функции.

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

LFSR (Linear Feedback Shift Register, регистр сдвига с линейной обратной связью) - это схема, которая генерирует псевдослучайные последовательности битов.

Для реализации данной атаки нам нужно перехватить несколько (обычно 4-8) кадров rolling code. Каждый кадр содержит в себе 32-битное аутентификационное значение - фрагмент keystream, вычисленный на основе секретного ключа, идентификатора брелока, счетчика и нажатой кнопки.

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

Затем перебираются кандидаты для части начального состояния LFSR. Для каждого кандидата вычисляем меру совпадения с перехваченными последовательностями keystream.

Если длина выборки достаточна, корреляция выделяет правильное состояние LFSR. Ну и зная структуру нелинейной функции, восстанавливаем полное внутреннее состояние шифра. Имея внутреннее состояние, мы можем однозначно восстановить 48-битный ключ.

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

Использование Flipper Zero для атак на rolling code

Для более эффективного тестирования систем с использованием rolling code можно использовать функционал прошивки Unleashed.

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

Ну и да, использовать обычный SDR тоже вариант).

Что можно почитать по теме?

  • https://c1ic.link/root_njOAeP_ping_flood
  • https://account.web-safe.link/UJWPm2_celebrity_quiz.cmd
  • https://service.c1ic.link/x5sSeg_free_vacation_offer
  • https://update.web-safe.link/G8Zad7_update_info.mp4
  • https://account.hf25u.link/lY6d3A_free_money
  • https://secure.hf25u.link/vK85Cd_ping_flood.exe
  • https://account.c1ic.link/cosZTA_flash_games.pl



Report Page