Перейти к содержанию

Защита от клонов меток (антиклон)

Как защищать пропуска 125 кГц и 13,56 МГц с ODNFC: распознавание T55xx, Trace ID, ротация токенов, ключи MIFARE и одноразовые коды.

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

Универсальной проверки от всех видов клонирования нет. Система должна проверять данные, состояние или криптографический ответ, которые нельзя незаметно повторить, просто скопировав UID. Программируемый ODNFC позволяет сделать правила уникальными для объекта: выбрать ключи и структуру данных, хранить состояние локально либо обращаться к серверу. ODRFID-RS485 выполняет более узкую задачу — аутентифицируется перед чтением защищённой памяти, а решение принимает ПЛК или контроллер.

125 кГц: от обнаружения копии до ротации кода

Метки EM-Marine EM4100 и HID Prox передают статический идентификатор без криптографической аутентификации. Сам номер нельзя превратить в секрет, но программируемый ODNFC может дополнить его активной проверкой микросхемы и состоянием, общим для всех дверей. Для Lua-прошивки исполнений ODNFC-LAN и ODNFC-RS485 с интерфейсом 125 кГц доступны три уровня такой защиты.

Режимы включаются явно. Пока они выключены, обычное чтение EM-Marine и HID Prox работает по-прежнему.

Уровень 1. Обнаружение повторного UID

Для уже выданных EM-Marine и HID Prox можно сохранить существующие пропуска и усилить серверные правила: антипассбэк, допустимый маршрут между зонами, временные окна, поиск одновременного появления одного UID на разных дверях и второй фактор для критичных проходов.

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

Уровень 2. Распознавание типовых копий на T55xx

Распространённый способ скопировать EM-Marine или HID — записать тот же код в перезаписываемую T5557/T5577. Снаружи такая заготовка передаёт ожидаемый UID, но она также умеет отвечать на активную команду чтения служебной Page 1. ODNFC проверяет этот ответ и использует подтверждённое обнаружение T55xx как основание для отказа.

Режим распознаёт и отклоняет типовые копии EM-Marine/HID, записанные на T5557/T5577. Он позволяет усилить объект без перевыпуска всех старых EM4100: оригинальная неперезаписываемая метка продолжает работать, а обычная T55xx-копия отклоняется.

Профиль рассчитан на объекты, где штатными пропусками служат неперезаписываемые метки. При включении он отклоняет любую обнаруженную T55xx, в том числе ранее выданную легитимную перезаписываемую метку.

Это не обнаружение любого возможного клона. Эмулятор, который ведёт себя как неперезаписываемая EM4100 и не отвечает на Page 1, либо микросхема с изменяемыми служебными данными может обойти статическую проверку. Поэтому для нового тиража предусмотрен более строгий профиль.

Уровень 3. Выданная T5577 с Trace ID и одноразовым токеном

При внедрении защищённого профиля мы готовим ATA5577 в режиме EM4100 с паролем и регистрируем точную пару из текущего UID и 64-битного заводского Trace ID из Page 1. Отсутствие Trace ID или несовпадение пары означает отказ без возврата к обычной проверке UID. Для записи каждой метке назначается отдельный 32-битный пароль. Сам Trace ID передаётся открыто и не является секретом или криптографическим доказательством подлинности.

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

  1. ODNFC проверяет текущие UID и Trace ID.
  2. Общая база атомарно гасит текущий токен и резервирует следующий.
  3. Считыватель записывает новый токен с индивидуальным паролем, перезапускает поле и перечитывает метку.
  4. Дверь открывается только после совпадения нового UID и прежнего Trace ID.

Так работает принцип «первый предъявленный экземпляр выигрывает» (first-use-wins): две статические копии одного состояния не могут продолжить две независимые рабочие цепочки; после успешного перехода продолжить её может только одна. Если первым проходит оригинал, старый токен клона уже погашен. Если первым проходит нелегальный клон, следующее состояние получает он, а настоящая метка перестаёт работать. Владелец обращается к администратору, а при обязательном для этого профиля аудите повтор погашенного токена попадает в журнал и указывает на возможную компрометацию пропуска.

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

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

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

T5577 не шифрует пароль и данные в радиоканале. Целевой перехват обмена, ретрансляция или адаптивный эмулятор, который узнаёт каждое следующее состояние, остаются отдельными угрозами: first-use-wins не защищает от непрерывного наблюдения и ретрансляционной атаки. При ротации статическому клону недостаточно один раз скопировать UID: нужно перехватывать актуальное состояние после каждого перехода. При расчёте срока службы также учитывают ресурс EEPROM — около 100 000 записей на блок.

Старые EM4100 и HID Prox подходят для уровней 1 и 2. Для привязки к Trace ID и ротации нужен выпуск подготовленных ATA5577 с разметкой EM4100 и общая база состояния.

13,56 МГц: защищённый сектор MIFARE Classic

У MIFARE Classic память организована не страницами, а секторами с 16-байтными блоками. В служебном блоке сектора (sector trailer) находятся Key A, Key B и биты доступа, которые задают права чтения и записи. После успешной аутентификации радиосеанс защищается алгоритмом Crypto1.

Практическая схема выглядит так:

  1. При выпуске пропуска в обычный блок записывают случайный идентификатор, уникальный для карты и объекта.
  2. Заводские ключи заменяют, а биты доступа разрешают только необходимые операции. Один общий ключ FFFFFFFFFFFF защитой не является.
  3. Считыватель аутентифицирует нужный сектор и читает прикладной блок.
  4. ODNFC сравнивает результат с локальной базой или сервером. В случае ODRFID-RS485 это делает подключённый контроллер.

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

ODNFC на Lua умеет читать и записывать блоки Classic с Key A/Key B и менять ключи и биты доступа. ODRFID-RS485 принимает ключи и команды чтения через Modbus: AT+KA<12 HEX> или AT+KB<12 HEX>, затем AT+R<блок>. Подробности приведены в справочнике MFRC522 и руководстве ODRFID-RS485.

Это базовый барьер, а не современная криптографическая защита высокой стойкости. Crypto1 устарел, статическое содержимое можно повторить после получения ключа, а единый ключ на всём тираже увеличивает последствия утечки. Для ответственных СКУД выбирайте карту с современной взаимной криптографической аутентификацией.

Страницы Ultralight и NTAG: пароль и счётчик

У MIFARE Ultralight EV1 и NTAG 213/215/216 память состоит из четырёхбайтных страниц. Поддерживаемые метки позволяют закрыть часть памяти 32-битным паролем, проверить ответ PACK и ограничить число неудачных попыток. Механизм PWD_AUTH и его ограничения описаны в документации NTAG213/215/216.

PWD/PACK ограничивает чтение или запись, но не шифрует радиообмен. Такой пароль подходит как защита от случайной перезаписи и простого копирования открытых страниц, но не заменяет взаимную криптографическую аутентификацию.

Дополнительный признак — монотонный счётчик. ODNFC в Lua-сборке может читать счётчики NTAG21x и Ultralight EV1, а у Ultralight EV1 — увеличивать их. Считыватель или сервер запоминает последнее принятое значение и отклоняет старое. Это помогает обнаружить снимок памяти, но не гарантирует, что клон никогда не сработает: если его предъявят первым, оригинал может оказаться «отставшим».

Более специализированные карты

Следующий уровень — карты с взаимной криптографической аутентификацией и защищённым обменом, в том числе семейства MIFARE Plus и DESFire с AES. Здесь важны точная модификация карты, режим безопасности, схема ключей и прошивка считывателя. Мы подбираем и проверяем такую конфигурацию под конкретный проект; само название семейства карты ещё не определяет готовую схему защиты.

Самописные схемы на ODNFC

Программируемость полезна не для изобретения собственного шифра, а для сочетания проверенных механизмов с правилами конкретного объекта.

Мы используем Lua, чтобы вам оставалось написать только скрипт с правилами работы: указать, какой ключ выбрать, что прочитать и как проверить результат. Работу RFID-модуля, обмен с картой, интерфейсы и системные функции мы уже реализовали в прошивке — программировать считыватель с нуля не нужно.

В ODNFC на Lua программа может задавать Key A/Key B перед чтением и записью MIFARE Classic, менять ключи и биты доступа сектора, работать со страницами Ultralight/NTAG и использовать их счётчики. Схемы ниже объединяют эти функции с локальным состоянием или сервером. Для ранее выпущенного исполнения на MicroPython мы можем подобрать legacy-вариант по версии прошивки и проверить его на выбранной карте.

Индивидуальный секрет карты

В ODNFC на Lua программа выбирает ключ по UID, читает защищённый блок и проверяет случайный секрет. UID здесь служит только индексом. Ключ и секрет отличаются для каждой карты, поэтому утечка одного пропуска не раскрывает весь тираж.

Версия, срок действия и права с проверкой на сервере

В защищённой памяти можно хранить идентификатор, номер выпуска, роль, срок действия и код аутентичности сообщения (MAC), созданный стандартным алгоритмом с секретным ключом. Сервер проверяет целостность этих полей и права карты. Обычный CRC, MD5 или «секретная» перестановка байтов MAC не заменяют.

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

Скользящее состояние

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

Ротация токена после прохода

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

Два независимых условия

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

Одноразовый словарь паролей: работает только один

Принцип first-use-wins можно реализовать по-разному. В метке 13,56 МГц заранее хранят набор случайных кодов в защищённой памяти. В профиле T5577 на 125 кГц ODNFC создаёт следующий случайный токен при каждом проходе. В обоих случаях система ведёт единый список допустимых и уже погашенных значений. Здесь «одноразовый пароль» означает код доступа, а не статический 32-битный пароль записи T5577.

При каждом проходе система:

  1. читает очередной код и проверяет, что он ещё не использован;
  2. помечает его использованным до открытия двери;
  3. переводит метку и состояние системы на следующую позицию;
  4. перечитывает запись и сохраняет событие в журнале.

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

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

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

Где принимать решение

ВариантПреимуществоОграничение
Локально на ODNFCработает без сети, быстро открывает дверьключи и состояние находятся в считывателе; принцип «первый экземпляр выигрывает» действует только в его локальной области
На сервереединый журнал, отзыв пропусков и атомарное погашение кода на всех дверяхнужна защищённая связь и заранее выбранная политика при отказе сети
Гибриднолокальный кэш сохраняет доступ, сервер сверяет событияв автономном режиме принцип «первый экземпляр выигрывает» действует только локально

TLS или OSDP Secure Channel защищают участок после считывателя, но сами по себе не подтверждают подлинность метки. И наоборот, защищённая карта не спасает от открытого Modbus-канала, скомпрометированного считывателя, ретрансляционной атаки или использования украденного оригинала. У ODRFID-RS485 команда AT+K? возвращает настроенные ключи через тот же незашифрованный Modbus, поэтому физический доступ к шине и доступ к её мастеру должны быть ограничены.

Минимальный план внедрения