ZigBee — один из протоколов, который используют для домашней автоматизации. Его поддержкой наделяют девайсы умного дома, такие как: лампочки, беспроводные выключатели, датчики движения и т.д. Но насколько все эти устройства безопасны?
В этой статье я расскажу, про устройство и безопасность сети ZigBee, а также покажу, при помощи каких устройств и программ перехватывать его сигнал для изучения.
- Почему ZigBee?
- Основные понятия
- PHY
- MAC
- NWK layer
- Адресация в сетях ZigBee
- APL layer
- Безопасность ZigBee
- Распределенная модель
- Централизованная модель
- Ключи шифрования в ZigBee
- Работаем с ZigBee в Wireshark
- Уязвимости ZigBee
- Софт для работы с ZigBee
- Железо для работы с ZigBee
- Digi XBee ZigBee Mesh Kit
- Texas Instruments CC2531
- Texas Instruments CC1352
Почему ZigBee?
Конечно, этот протокол не нов — стандарт появился еще в 2003 году. Сегодня есть более современные аналоги вроде LoRaWAN и RPMA, но ZigBee продолжает быть популярным. Почему? Взгляни на картинку.
Помимо дальности и скорости здесь учтена стоимость. И сразу видно, что ZigBee отлично сбалансирован и при невысокой цене дает приемлемые дальность действия и скорость передачи данных. Вряд ли тебе понадобится стримить видео в 4K на выключатель, а чтобы что-то сделать издалека, обычно используется подключенный к интернету хаб. Вот и получается, что ZigBee не сильно бьет по карману при создании умного дома и покрывает основные нужды.
К тому же более новые протоколы могут таить неприятные сюрпризы. Например, в разговорах о LoRa я уже несколько раз слышал от интеграторов, что при большом количестве устройств в сети могут начаться чудеса. Говорят, что на опрос сотни девайсов может уйти около часа.
Основные понятия
Топология сети может быть одной из следующих:
- звезда;
- кластерное дерево;
- стильный-модный-молодежный вариант — mesh.
Координатор (он же FFD) — это самый главный узел. Он создает сеть, выбирает, на каком канале общаться, может выступать как «центр доверия» (trust center). Роутеры — устройства уже чуть попроще. Они служат зачастую ретрансляторами сообщений от конечных устройств. Конечные устройства (end device) — то, что мы объединяем в сеть, то есть выключатели, лампочки, датчики движения и прочие гаджеты.
Вот сводная таблица функциональности каждого из устройств.
Координатор | Роутер | Конечное устройство | |
---|---|---|---|
Создание сети ZigBee | x | ||
Выдача разрешений на присоединение к сети другим устройствам | x | x | |
Назначение 16-разрядного сетевого адреса | x | x | |
Обнаружение и запись путей для эффективной доставки сообщений | x | x | |
Обнаружение и хранение списка соседей, доступных в один хоп | x | x | |
Маршрутизация сетевых пакетов | x | x | x |
Присоединение и выход из сети | x | x | x |
Режим сна | x |
А теперь открываем официальную спецификацию ZigBee. Там нас почти сразу встречает вот такая интересная картинка.
Но пусть она тебя не пугает, потому что к концу статьи ты поймешь, что в реальности все немного проще!
PHY
Итак, начнем изучение с PHY, физического уровня, и будем подниматься вверх по слоям.
Мы будем говорить о ZigBee, но ZigBee базируется на IEEE 802.15.4. Причем этот же стандарт взят за основу для WirelessHART и для ISA100.11a.
ZigBee, а точнее, IEEE 802.15.4 может работать в трех частотных диапазонах.
И, как ты можешь заметить, если выбрать для него частоту 2,4 ГГц, то Wi-Fi и ZigBee могут начать мешать друг другу. Для уменьшения перекрестных помех между Wi-Fi и ZigBee лучше выбирать следующие каналы.
Что не может не радовать, в стандарте есть такое понятие, как ED — Energy Detection. Эта фича используется в координаторе умного дома, чтобы он выбирал канал, где меньше всего помех.
Общий вид посылки для PHY имеет следующий вид.
Если у тебя дома завалялся SDR и ты желаешь контролировать каждый-прекаждый битик в модуляции OQPSK, то тебе поможет вот эта схема.
Этот вид модуляции как раз и применяется на частоте 2,4 ГГц. А мы тем временем идем дальше выше по стеку протоколов, и нас ждет уровень MAC.
MAC
Общий вид MAC-фреймов представлен ниже.
Как видишь, Frame Control отвечает за тип пакета данных (Beacon, Ack, Cmd, Data), тип адресации, а также наличие шифрования.
Теперь поговорим о каждом фрейме данных чуть подробнее.
Data Frame — один из самых простых фреймов. В нем передаются данные протоколов, которые работают поверх IEEE 802.15.4. Получается, что ты можешь взять за основу IEEE 802.15.4 и разработать протокол для своих нужд.
ACK Frame — фрейм подтверждения. Увы, мы живем в неидеальном мире, где бывает много помех, а при передаче по радиоканалу тем более. Поэтому необходимо подтверждать принятые данные.
Здесь Sequence Number указывает на то, какой фрейм из пришедших ранее мы подтверждаем.
MAC Cmd frame в той или иной степени отвечает за «организацию сети» на уровне 802.15.4.
Ниже представлены команды, которые могут тебе встретиться.
FFD — Full-function Device — это координатор сети, та самая главная «железка», которая организовывает сеть ZigBee.
RFD — Reduced-function Device — не столь важное устройство, как координатор, выполняет функции роутера при пересылке пакетов.
Beacon frame — об этом фрейме стоит поговорить подробнее.
Так как мы передаем данные по радиоканалу и у нас есть несколько устройств, эти устройства должны как-то определять, в какой момент можно передавать данные, а когда занята несущая и стоит подождать. Поэтому в сетях ZigBee/IEEE 802.15.4 есть два способа передачи данных: режимы Beacon и NonBeacon.
Для передачи данных в режиме NonBeacon используется так называемый unslotted CSMA-CA channel access mechanism. По моему опыту, он используется редко.
Наиболее частый случай — использование режима Beacon. В этом случае координатор отправляет так называемые маячки (beacons), на основе которых остальные устройства синхронизируются и передают данные.
Общий вид передачи данных в этом режиме представлен ниже.
Во фрейме Beacon указывается, сколько будет slotted CSMA-CA, будет ли доступ без конкуренции и последует ли Inactive portion — время, когда конечные устройства смогут со спокойной совестью уйти в спячку для продления работы от батарейки.
NWK layer
Вот так выглядит фрейм во всей красе на уровне NWK. Не забываем, что раз мы уже тут, данные будут упакованы в Data Frame уровня MAC.
Как видишь, на уровне NWK тоже встречаются несколько разновидностей фреймов. Но прежде чем о них говорить, думаю, стоит осветить вопросы адресации в сетях ZigBee. Потому что тебя, наверное, уже терзают вопросы, что такое Dst Addr, Src IEEE Addr и тому подобные вещи.
Адресация в сетях ZigBee
Начнем, пожалуй, с PAN ID, или Personal Area Network ID. Он используется для логического отделения узлов одной сети ZigBee от узлов другой, если сети расположены на одной и той же территории либо работают на одном и том же канале.
EPIND — Extended PAN ID, глобальный 64-битный уникальный идентификатор. Используется для избегания конфликтов PAN ID.
Src/Dst Addr — собственно, адрес отправителя и получателя. Могут быть как короткими (16-битными), так и длинными (64-битными). Причем если 64-битный адрес используется на слое NWK, то это и будет как раз Src/Dst IEEE addr. Он считается уникальным для каждого приемопередатчика ZigBee.
Ну и чтобы лучше понимать устройство адресов, посмотрим часть дампа трафика в Wireshark.
Сейчас пока важно понять, что Src/Dst Addr на уровнях MAC и NWK — это одни и те же адреса.
NWK Data frame — служит для передачи более высокоуровневых слоев. Тут все просто.
NWK Cmd frame — как раз тут и творится основная «магия» маршрутизации данных, построения mesh-сети и подключения/отключения узлов.
Список основных команд представлен ниже.
Про Inter-PAN, увы, не скажу ничего, так как он загадочен. Его основная задача — пересылка данных между узлами, которые находятся в разных сетях, но документации по этой теме очень немного.
APL layer
Наконец мы добрались до самого верха в стеке протоколов ZigBee. Общий вид фреймов представлен ниже.
Data Frame Format
Этот фрейм содержит «все последовательности октетов следующего более верхнего уровня». Спрашивается, куда уж выше?
APS Command Frame Format
Acknowledgement Frame Format
Теперь тебя, возможно, насторожат новые составные части фрейма: Profile ID, Cluster, Endpoint. Попробуем с ними разобраться. Вернись к той страшной картинке со стеком протоколов в самом начале статьи. Надеюсь, теперь она будет восприниматься полегче.
PHY и MAC определены стандартом IEEE 802.15.4, вышележащие уровни — это ZigBee.
Одна из главных задумок — обеспечить совместимость (interoperability), отсюда такой комбайн на уровне APL. Это означает, что если взять, к примеру, лампочку с поддержкой ZigBee вендора А, купленную десять лет назад, и выключатель вендора Б, купленный вчера, то они без проблем будут работать друг с другом. Раньше ZigBee этим похвастаться не мог, сейчас же все становится гораздо лучше.
ZigBee Device Object (ZDO) фактически отвечает за инициализацию устройства — будет ли оно FFD (координатором) или end device. Также производит настройку и инициализацию NWK и SSP (Security Service Provider). О механизмах безопасности в сетях ZigBee поговорим чуть дальше.
Application Support Sublayer (APS) предоставляет программный интерфейс между уровнем NWK и приложениями, которые могут работать на устройстве.
Application Framework — что-то вроде окружения, где выполняются приложения ZigBee.
Чтобы устройства понимали, как взаимодействовать друг с другом, их для начала нужно идентифицировать по профилям. Для этого как раз и применяются Application profiles. Размер — два байта. Бывают:
- Public profiles — они разработаны в ZigBee Alliance для производителей совместимых устройств. Служат для того, чтобы устройства разных вендоров могли работать друг с другом;
- Private profiles (другое официальное название — Manufacturer Specific Profiles, MSP). Это уже профиль, разработанный самим вендором для своих нужд (например, специфичных для устройства).
Некоторые profile ID представлены ниже в таблице.
profile ID | описание |
---|---|
0x0101 | Industrial Plant Monitoring (IPM) |
0x0104 | Home Automation (HA) |
0x0105 | Commercial Building Automation (CBA) |
0x0107 | Telecom Applications (TA) |
0x0108 | Personal Home & Hospital Care (PHHC) |
0x0109 | Advanced Metering Initiative (AMI) |
Следующая структурная единица коммуникации между устройствами — Cluster ID. Она также имеет длину в два байта. Это своего рода сообщения, определенные в profile ID. К примеру, для профиля Home Automation могут быть заданы следующие кластеры:
- On/Off — используется, чтобы включить или выключить устройство (например, лампочку или термостат);
- Level control — используется для димминга (например, можно плавно зажечь лампочку на 80% от максимальной яркости);
- Color control — управление цветом освещения (вдруг захочется мимимишный розовый оттенок?).
Завершает систему адресации Endpoint. Чтобы было понятнее, приведу аналогию с обычным компьютером. Устройство ZigBee — это как машина в сети: у него есть IP, по которому можно обратиться. И как на одном компьютере может крутиться несколько служб на разных портах, так и на устройствах ZigBee может быть несколько приложений. Чтобы однозначно обращаться к одному или другому, как раз и нужны эндпойнты.
Вот так будет выглядеть иерархическая структура для выключателя света с профилем Home Automation.
Безопасность ZigBee
Когда заходит речь про безопасность ZigBee, многие источники говорят, что у ZigBee может быть либо централизованная система безопасности, либо децентрализованная — и что данные шифруются при помощи AES-128 на уровнях NWK и/или APL. Но очень часто почему-то забывают сказать, что так как ZigBee базируется на IEEE 802.15.4, этот стандарт тоже предоставляет кое-какие возможности в плане безопасности.
Когда выставлен третий бит в FC (Frame Control), у нас появляется дополнительный заголовок AUX Security Header, который, в свою очередь, определяет уровень безопасности (Security Level), а также включает в себя 32-битный счетчик, позволяющий исключить простейшие атаки типа replay. Про Security Level мы поговорим буквально через пару абзацев.
Распределенная модель
Распределенная модель безопасности считается менее надежной, но более простой в реализации.
Как видно, в этом случае могут быть только два типа устройств — роутеры и конечные устройства (end device). Роутеры могут создавать сеть и генерировать ключ к сети (network key). Чтобы устройства могли подключиться к такой сети, они должны иметь pre-configured link key.
Централизованная модель
Как понимаешь, посредственный уровень безопасности — не наш путь, поэтому при реализации умного дома лучше выбирать централизованную модель безопасности.
В этом случае координатор не только выполняет функции организации и построения сети, но также является центром доверия (Trust Center, TC). Он выбирает ключ шифрования для уровней NWK и APL и отвечает за подключение новых узлов.
Когда мы рассматривали фреймы NWK, ты мог обратить внимание на AUX NWK Header. Это как раз дополнительный заголовок, который появляется, если включено шифрование на уровне NWK. Формат фрейма с учетом шифрования представлен ниже.
AUX NWK Header появляется тогда, когда в заголовке Frame Control из NWK выставлен соответствующий бит.
Для уровня APL фрейм выглядит аналогичным образом.
Думаю, тебя уже давно мучает вопрос, что это за «уровень безопасности» (Security level) и знакомая аббревиатура MIC (Message Integrity Code). Ответ на этот вопрос дан в таблице ниже.
Как видишь, ZigBee и IEEE 802.15.4 позволяют использовать только проверку целостности полученного фрейма. Для этого как раз служит MIC — либо можно включить для фреймов шифрование AES-128.
Ключи шифрования в ZigBee
Я уже упомянул шифрование AES-128, а значит, никак не обойтись без разговора про ключи. Вот какие они бывают.
Pre-configured global link key — дефолтный ключ для ZigBee. Его значение — 5A 69 67 42 65 65 41 6C 6C 69 61 6E 63 65 30 39, что означает ZigBeeAlliance09. Он используется, чтобы шифровать network key.
Ниже приведу небольшой кусочек дампа трафика, который проходит, когда мы подключаем новое устройство к сети.
№ Пакета | End-node/координатор | Примечание |
---|---|---|
1853 | End-Node, IEEE addr 00:0D:6F:00:… | Отправляет команду на подключение к сети (Association Request) |
1857 | Координатор, IEEE addr 00:12:4B:00:… | Assoсiation Response, где выдается добро на подключение к сети и устройство получает короткий адрес 0x5022 |
1861 | Координатор | Запрашивает описание устройства и данных о том, кто к нему подключился |
1873 | Координатор | Отправляет NWK key в зашифрованном виде с помощью pre-configured global link key |
Вот мы и разобрали процесс подключения и ассоциации конечного устройства к координатору. Это так называемая MAC association. Для полноты картины добавлю, что перед Association Request устройство отправит в эфир Beacon request.
Еще возможен Network Rejoin — подключение к сети на уровне NWK. Но в этом случае конечному узлу уже надо знать network key. Это возможно, если узел действительно заново подключается к сети или если NWK key был указан каким-то другим способом.
Так что если ты подловишь момент, когда происходит добавление нового устройства, то есть все шансы перехватить NWK key и прослушивать весь трафик.
Зачем ждать этого момента, когда можно сымитировать подключение устройства к сети и тем самым заполучить ключ NWK? Возможно, в других реализациях так и получится, но в нашем умном доме предусмотрели этот момент. У нас сначала необходимо переключить координатор в состояние ожидания подключения нового устройства, которое длится несколько секунд, и только потом добавлять устройство. Так что подгадывать момент все же придется.
Другой вопрос, который может у тебя возникнуть: зачем вообще использовать дефолтный link key, когда можно задать свой и в разы улучшить взломостойкость? Ответ простой: кастомный link key нарушит совместимость, о которой мы говорили чуть ранее. Да и не всякий пользователь захочет подключать лампочку или розетку к программатору или джамерами задавать приватный ключик. Вот и приходится искать баланс между удобством и безопасностью.
Работаем с ZigBee в Wireshark
Wireshark прекрасно справляется с парсингом ZigBee, но, чтобы это заработало, нужно в настройках задать дефолтный ключ шифрования. Открывай меню «Edit → Preferences → Protocols», выбирай «ZigBee → Pre-configured key» и добавляй Pre-configured global link key с шестнадцатеричным значением 5A 69 67 42 65 65 41 6C 6C 69 61 6E 63 65 30 39.
Network key (он же NWK key) — используется, как ты уже понял, для шифрования на уровне NWK. Он применяется для коммуникации между всеми узлами сети, произвольно генерируется координатором. Передается, когда происходит подключение нового узла.
Application link key — этот ключик будет работать на уровне APL. Используется он для того, чтобы два узла могли установить шифрованное общение друг с другом.
Очень рекомендую почитать статью Security Analysis of ZigBee (PDF). В ней наглядно и подробно рассказывается про используемые ключи.
Уязвимости ZigBee
Теперь, зная внутреннюю структуру, можно поговорить о том, какие возможны атаки на ZigBee. Один из их основных видов — это использование дефолтного link key при подключении новых устройств. Но тут приходится выбирать между удобством для рядовых пользователей и безопасностью. Можно считать, что это баг, но если добавить красивые слова про совместимость, быстроту развертывания и прочие удобные штучки, то он уже чуть больше похож на фичу. О том, как нивелировать ее опасность, я уже писал выше.
Следующий вопрос, который хочется поднять: как обстоят дела с replay attack? Как помнишь, на каждом из уровней у нас есть Frame Counter, который должен препятствовать этому виду атак. Но теория с практикой сходятся далеко не всегда.
Стандарт — вещь хорошая и нужная, но его реализация вендором — это совершенно другое дело. Впрочем, «железки» GS Labs, которые мне довелось потестить, этому виду атак подвержены не были.
Еще один вектор — это конфликт PAN ID. Суть этой атаки в том, что злоумышленник разворачивает ложный координатор. В результате валидный координатор сменяет PAN ID на какое-то другое значение. Но устройства по-прежнему могут быть привязаны к старому PAN ID. Получается, что злоумышленнику удается нарушить целостность сети. Это может привести к тому, что датчик открытия или датчик движения (или, не дай бог, датчик дыма) не подаст вовремя тревогу. О такой атаке был как раз недавно доклад на Black Hat USA 2019 (PDF).
Также не стоит забывать про разные варианты атак типа DoS или флуд в канале. Например, весь канал может быть забит фреймами ACK. В начале статьи мы смотрели, как выглядит ACK frame. Если помнишь, в нем нет ни возможности шифрования (да и нечего там шифровать), ни даже MIC.
Еще, как вариант, можно подделать значение frame counter — если узел не проверяет MIC, то когда придет валидный пакет, его frame counter будет меньше. Согласно стандарту, такие пакеты стоит отбрасывать.
Софт для работы с ZigBee
Далее небольшим списком перечислю, какие есть инструменты для взлома изучения ZigBee.
- KillerBee — в описании говорится, что это фреймворк и утилиты для атак на сети ZigBee и IEEE 802.15.4 networks. В списке поддерживаемого железа много всего устаревшего (например, Atmel RZ RAVEN USB Stick, который снят с производства). Заявлено, что есть поддержка Texas Instruments CC2531, но прошивка имеет статус beta и работает только на прослушивание трафика.
- Attify ZigBee Framework — считай, то же самое, что и KillerBee, но с графическим интерфейсом.
- SecBee — для работы требует Scapy-radio, KillerВee и GNU Radio block, а из железа подавай уже SDR — и, как пишет разработчик, лучше всего USRP.
- Z3sec — для полноценной работы тоже требует много дополнительных пакетов. Из железа поддерживается Ettus USRP или железо, совместимое с KillerBee.
Получается, что разнообразие только кажущееся — и обычно нужно либо дорогущее железо (SDR), либо старье вроде Atmel RZ RAVEN USB Stick. Поэтому я решил разработать свою утилиту — pwnrf. Работа еще не закончена, поэтому и внешний вид пока соответствующий.
Моя основная задумка — реализовать возможность собирать произвольные пакеты ZigBee/IEEE 802.15.4. Причем как валидные, где проверяются форматы, содержимое полей, так и произвольные фреймы, чтобы можно было искать логические ошибки. Ну и, конечно, утилита будет работать в режиме сниффера. Из железа планируется поддерживать CC2531, CC1352 либо любой другой трансивер, с которым можно связаться через UART/Serial.
Железо для работы с ZigBee
Пару слов о том, с какими железками доводилось сталкиваться при работе с ZigBee.
Digi XBee ZigBee Mesh Kit
В основе этих модулей лежат трансиверы компании Silabs. Сейчас наиболее актуальный и свежий набор — это Digi XBee3 ZigBee 3.
Для работы Digi XBee есть что-то вроде IDE — XCTU. Радует, что она работает как в Windows, так и в Linux.
Увы, по моим субъективным ощущениям, эта штука больше рассчитана на построение сетей ZigBee и Digimesh. Для модулей есть прошивки как ZigBee, так и IEEE 802.15.4. Но, к сожалению, особой гибкости по генерации произвольных пакетов достичь не удалось.
Texas Instruments CC2531
Эта отладочная плата TI втыкается в USB подобно флешке. Ее китайские клоны можно найти на Aliexpress по цене около $3–4.
Сразу «из коробки» работает как сниффер. Можно воспользоваться фирменной утилитой TI под названием packet-sniffer или взять ccsniffpiper — последняя позволит пробрасывать принятые пакеты сразу в Wireshark.
Если же ты захочешь писать свою прошивку для этого донгла, то готовься вспоминать старую добрую архитектуру x51 (8051 Core, если быть точным). Ну и для того чтобы ты смог залить свою крутую прошивку, тебе потребуется еще cc-debugger.
Можно, конечно, использовать более свежий CC2538, который основан на ARM Cortex-M3. У него больше памяти и ресурсов, но и цена в разы выше.
Texas Instruments CC1352
Как по мне, CC1352 — уже тяжелая артиллерия. Этот чип работает в двух частотных диапазонах (2,4 ГГц и субгигагерцевом) и поддерживает приличное количество беспроводных протоколов.
Что еще приятно: на этом микроконтроллере можно разработать свой радиопротокол с преамбулой, sync word и прочими кастомными характеристиками.
Для полноценной работы с этим камнем тебе потребуется Code Composer Studio (основана на Eclipse) и соответствующий SDK. Кстати, SmartRF Studio позволит вручную генерировать произвольный пакет ZigBee. Но пакет этот придется самому полностью писать в hex-кодах.
Также загляни на обучающий ресурс TI, где ты найдешь примеры работы с этим и другими микроконтроллерами. И прочитай статью «Дешевый хаб для устройств Z-Wave и ZigBee«.