Так себе взломщики

История о том, как мы RFID-замок взломать пытались

Наверняка многие смотрели фильмы про агента 007 Джеймса Бонда. В них он лихо расправлялся со сверхзлодеями, стрелял изо всех существующих видов оружия и играючи взламывал самые разные замки. К сейфу присоску прилепил, компьютер включил, кнопку нажал и сидит разглядывает журнал с красавицами, пока замок не будет открыт. Мы с инженерами «Авито» тоже решили попробовать себя в роли взломщиков — открыть RFID-замок. Опыта набрались, но взломать замок так и не получилось.

Бесконтактное чтение

Все, кто ходит в офис, сталкивались с такими замками — приложил пластиковую карточку, дверь и открылась. В подавляющем большинстве случаев на входе стоят замки, использующие для чтения ключей технологию RFID (Radio Frequency IDentification, радиочастотная идентификация).

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

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

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

Технология RFID сегодня используется очень широко; не только в замках, охраняющих офисы от вторжения, или домофонах подъездов. Метки RFID также получают товары в магазинах, посылки, автомобили, телефоны и многое другое. Благодаря этому удается значительно уменьшить время, необходимое, например, на сортировку или поиск товаров — оператору необходимо только поднести считыватель, чтобы за секунду получить всю необходимую информацию о товаре. До внедрения RFID ему приходилось брать каждый товар в руки и внимательно изучать этикетку.

В начале прошлого года разработчики из Массачусетского технологического института показали систему локализации объектов в пространстве TurboTrack. Эта система основывается на получении сигналов с RFID-меток, расположенных на объектах, и может использоваться в роботизированных манипуляторах, которые определяют местоположение объекта за 7,5 миллисекунды со средней ошибкой в несколько миллиметров.

Разработчики установили на робота антенну, передающую радиосигналы и принимающую ответы с RFID-меток. По принятым сигналам система и может вычислять координаты объекта. Таким образом, роботу не нужна сложная и дорогостоящая система распознавания объектов по изображениям с камер.

Исторически RFID, как и множество других технических изобретений, основывается на другой технологии, созданной военными. Речь идет о системе распознавания «свой-чужой», впервые разработанной Исследовательской лабораторией ВМС США в 1937 году. Она представляет собой приемник и ответчик специальных кодов, по которым другие самолеты в небе могут быстро узнать — враг перед ними или союзник.

Впервые же система RFID в том виде, в котором мы знаем ее сегодня, была представлена в 1973 году в Исследовательской лаборатории Лос-Аламоса. Она работала на частоте 915 мегагерц. В последующие годы систему дорабатывали, а в 1983 году разработчики ее запатентовали.

Впрочем, широкого применения технология RFID тогда не получила — производство приемо-передатчиков и меток было относительно дорогим. Дешевой технология RFID стала только в 2000-х годах. Тогда и началось ее широкое внедрение во все сферы жизни: от прохода в метро и подъезды до сортировки посылок на почте и даже автоматической дозаправки беспилотников в воздухе.

Манчестер-II

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

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

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

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

RFID-ключ за 32 битовых интервала отправляет свой идентификатор (он определяет, зарегистрирован ключ в системе или нет), за 8 интервалов — код изготовителя ключа, за 9 — заголовок (код ключа, который в связке с идентификатором позволяет определить зарегистрированный в системе ключ), за 14 — контрольную сумму (позволяет проверить правильность передачи заголовка и идентификатора) и за 1 — так называемый стоп-бит, обозначающий окончание передачи.

Попытка взлома

Для нашего эксперимента мы приобрели на «Авито» комплект замка: контроллер Iron Logic Z5R со встроенным RFID-считывателем, электромагнитный замок, кнопку отпирания и набор RFID-карт. Сам контроллер является универсальным и может работать не только с RFID-картами, но и с ключами iButton. Многие, наверное, знакомы с такими: металлическая таблетка, похожая на батарейку, вставленная в пластиковую ручку.

Мы прорабатывали две базовые идеи взлома замка. Первая заключалась в том, чтобы открыть его с помощью простого магнита, например, от компьютерного жесткого диска. В жестком диске такие магниты используются в системе управления «голосовой» головкой, читающей данные с магнитных «блинов». Дело в том, что в некоторых RFID-системах используются небольшие SMD-реле. Они управляются контроллером.

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

Такой способ, например, хорошо работает с RFID-замками китайской компании Hfeng. Она поставляет замки в Россию, США и еще несколько стран. Но в случае с контроллером Z5R это не сработало. Дело в том, что в нем, в отличие от китайских замков, для управления замком используются не реле, а транзисторы, которым на изменение магнитного поля глубоко наплевать: пока на затвор подается напряжение, транзистор пропускает ток, как только оно исчезает — перестает.

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

В этом случае можно установить «жучок» (в нашем случае контроллер ESP8266 с Wi-Fi с версией прошивки NodeMCU), который будет перехватывать передаваемый по проводам код и отображать его в собственном веб-интерфейсе. Этот код затем можно записать на другую карту и использовать ее для прохода или передать сразу в линию контроллеру по команде из того же веб-интерфейса.

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

Подготовка

Для начала мы подготовили ESP8266 к чтению данных. Подключили питание и подпаяли проводок к цифровому порту D0. Планировали написать программу для контроллера на языке Lua, именно такой используется в прошивке контроллера NodeMCU. Но затем решили пойти по проверенному пути — использовать среду разработки Arduino IDE с уже знакомой нам модификацией языка программирования C.

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

#define PIN 0
void setup() {
    Serial.begin(9600);
    pinMode(PIN, INPUT);
}
void loop() {
    if (Serial.available()) {
        Serial.print(getData());
    }
}
void getData() {
    return digitalRead(PIN);
}

Все предельно просто. Для начала, мы определяем константу PIN и присваиваем ее цифровому порту D0. Затем в функции setup() запускаем обмен данными с монитором порта Arduino IDE с помощью команды Serial.begin(). В монитор порта ESP8266 должна передавать получаемые от контроллера замка данные. После этого переводим цифровой порт D0 в режим приема данных.

После этого в постоянно повторяющейся функции loop() с логического оператора if() проверяем, установлена ли связь с монитором порта Arduino IDE. Если связь установлена, передаем в него данные, полученные с помощью функции getData(). Наконец, в функции getData() мы читаем логические уровни на цифровом порту D0 и возвращаем их с помощью директивы return.

Казалось, что еще нужно для старта? Но прочитать данные из контроллера Z5R так и не получилось. На доступной части платы контроллера есть несколько контрольных точек, порт TM (он используется для подключения устройства чтения iButton или еще одного RFID-приемо-передатчика), несколько пинов для управления чипом и две точки подключения RFID-антенны.

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

Это первый в рубрике «Найдено на Авито» эксперимент, который не удался. Но отрицательный опыт, тоже опыт. Мы разобрались в том, как работает одна из реализаций технологии RFID, поняли как ведется передача данных и как работают контроллеры замков. А это хоть чего-нибудь да стоит.

Василий Сычёв

Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter.
Подслушано под водой

Соберите идеальную мелодию морских глубин