Взлом систем умного дома от А до Я на примере протокола ZigBee. Часть 2
Life-Hack [Жизнь-Взлом]/ХакингБезопасность 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.
Ниже приведу небольшой кусочек дампа трафика, который проходит, когда мы подключаем новое устройство к сети.
Вот мы и разобрали процесс подключения и ассоциации конечного устройства к координатору. Это так называемая 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. Используется он для того, чтобы два узла могли установить шифрованное общение друг с другом.
Уязвимости 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, где ты найдешь примеры работы с этим и другими микроконтроллерами.
Ресурсы, которые помогут тебе расширить кругозор:
- Документация по ZigBee 101
- ZigBee Security: Basics (часть 1, 2 и 3)
- @ZigBeer — русскоязычная группа в «Телеграме», где обсуждают вопросы, связанные с ZigBee