|
Интересное - рядом. Ты каждый день сталкиваешься с bluetooth-устройствами
и особенно не задумываешься над тем, как они работают и как устроен
этот протокол. Ты можешь даже юзать чужие программы для bluejacking'а,
descovering'а и взлома PIN'ов, однако после определенного момента становится
интересно, за счет чего и как именно они работают. Настало время просвещаться.
Rак работает и устроен Bluetooth, какие недостатки в этом протоколе
есть и за счет чего работают все эти программы для атаки синезубых девайсов.
[залог успеха]
Несколько лет назад телефон с поддержкой bluetooth был
скорее хай-тек экзотикой, нежели чем-то действительно популярным. Однако
теперь синий зуб стал настоящим стандартом для любых портативных устройств.
Убедиться в этом совсем несложно: стоит только включить поиск устройств
в любом людном месте, как сразу отыщется 3-4 активных девайса, готовых
к взаимодействию.
В самом деле, огромное число людей сейчас используют телефоны,
оснащенные bluetooth-адаптерами.
[bluetooth и радио]
На самом деле, эту статью можно рассматривать как вводную
к материалу о практическом взломе bluetooth-устройств. Ведь прежде,
чем начинать злодействовать, необходимо вникнуть в суть системы и разобраться
с ее работой. Этим мы с тобой сейчас и займемся. Я опишу функционирование
протокола "снизу вверх", начиная с низкоуровневых вещей и
заканчивая командными интерфейсами, а так же укажу на слабые места протокола.
Вообще, спецификацию bluetooth можно разбить на несколько
уровней, на каждом из которых решаются свои задачи. В самом нижнем логическом
слое спецификации протокола описан так называемый "radio-level",
т.е. физический уровень, регламентирующий порядок передачи данных по
радиоканалу. Согласно стандарту, протокол использует диапазон частот
от 2402 МГц до 2480 МГц, при этом частота меняется в этих рамках с шагом
в 1 МГц что-то около 1600 раз в секунду по псевдослучайному закону.
Это сделано для того, чтобы избежать гнусного явления - интерференции
сигнала - а так же, чтобы свести к минимуму помехи от сторонних устройств,
ведь в этом диапазоне частот работают пульты от телевизоров и автомобильных
сигнализаций, WiFi-оборудование и микроволновые печи.
Следует отметить довольно занимательный факт: в некоторых
странах (например, во Франции) из-за странного законодательства, производители
bluetooth-устройств вынуждены временно ограничить ширину используемого
частотного коридора с 79 МГц до 23 МГц.
Что касается мощности сигнала, то здесь не все однозначно, всего есть
три мощностных класса. Первый класс подразумевает максимальную выходную
мощность в 20 dBm и позволяет работать на расстоянии до 100 метров.
Мощность сигнала в устройствах второго класса достигает 4 dBm, что позволяет
держать связь внутри круга с радиусом 10 метров. И, наконец, третий
класс устройств может работать на расстоянии в несколько сантиметров
и мощность сигнала у него - 0 dBm. Обрати внимание, что 0 dBm - это
тоже мощность, и символический ноль совсем не означает отсутствие сигнала
. Некоторые устройства предоставляют возможность управлять мощностью
антенны при помощи специальных LMP-команд (об этом интерфейсе ниже).
Что касается модуляции сигнала, то здесь применена гауссовская
частотная модуляция (GFSK, Gaussian Frequency Shift Keying)с параметром
фильтрации BT=0.5. На самом деле, это не такая простая тема и более
подробное описание уместнее бы смотрелось в каком-нибудь институтском
учебнике по радиосвязи, так что если эта тема тебе и в самом деле интересна,
советую почитать документацию на нашем диске .
[baseband: bluetooth и данные]
Bluetooth поддерживает два вида соединений: point-to-point
и point-to-multipoint. Два и более устройства образуют маленькую беспроводную
сеть, называемую piconet. При этом одно из девайсов является главным
(master) и предоставляет различные сервисы остальным. Slave-устройство
может параллельно работать в нескольких piconet'ах. Эта возможность
одновременно является и настоящим рулезом, и головной болью. Так, например,
при передаче данных между двумя устройствами, неавторизованный сторонний
девайс злоумышленника вполне может попробовать получить доступ к передаваемой
информации. Это, конечно, совсем не просто, однако не исключено.
Но вернемся к нашему протоколу. Каждое bluetooth-устройство
имеет уникальный 48-разрядный адрес, представляющий собой 12 шестнадцатеричных
чисел, для наглядности разделенных побайтно двоеточием. Чтобы было понятнее,
приведу пример адреса: 00:0A:D9:2E:3B:BF. Думаю, ты заметил большое
сходство с хорошо знакомыми тебе MAC-адресами сетевых карт . На самом
деле, BT-адрес (BT_ADDR) это и есть MAC устройства: он определяется
производителем девайса и уникален для каждой железяки. Как легко догадаться,
по BT_ADDR несложно судить о производителе устройства, на это указывают
первые три байта адреса. В моем случае символы 00:0A:D9 однозначно свидетельствуют
о том, что я наткнулся на телефончик SonyEricsson (смотри таблицу с
соответствием адресов и производителей).
Теперь расскажу о том, как, собственно, выглядят BT-пакеты.
Каждый пакет состоит из трех частей: кода доступа (68/72 бита), заголовка
(54 бита) и, собственно, самих данных (0-2745 разряда). Код доступа
используется для осуществления синхронизации данных, корректного разбиения
на страницы, вычисления смещений и так далее. Всего есть три типа кодов:
код канала (CAC), устройства (DAC) и очереди (IAC). Заголовок пакета
среди прочего позволяет контролировать ошибки при передаче данных: он
несет в себе информацию с подтверждением о доставке пакета, а так же
различные идентификаторы. Что касается самих данных, то они могут представлять
собой как голос, так и просто что-то абстрактное. Само собой, что в
спецификации bluetooth описано несколько типов пакетов, всего их 13
штук. Но более подробно об этом мы поговорим чуть ниже.
[link manager protocol]
Мы поднимаемся на уровень вверх и перед нами - Link Manager
Protocol, LMP. Этот протокол являет собой интерфейс, предназначенный
для организации и управления связью между устройствами. При помощи предоставляемых
функций можно организовывать линки между девайсами, шифровать передаваемую
информацию, управлять режимами работы устройств и т.д. Важно понимать,
хотя бы на пальцах, как работает этот протокол. При вызове одной из
управляющих функций LMP в эфир передается пакет определенного содержания,
который соответствует вызванной процедуре. Другое устройство получает
этот пакет, интерпретирует его и отвечает схожим пакетиком, который
посылается так же через интерфейс LMP. Для обмена информацией протокол
использует пакеты типов DM1 и DV, в зависимости от объема передаваемых
данных.
[Bluetooth и безопасность]
Конечно, Bluetooth проектировался с оглядкой на современную
действительность, когда информация может стоить очень дорого и ее транспортировка
- тем более по воздуху - должна быть максимально безопасным мероприятием.
Bluetooth использует довольно изощренное шифрование передаваемых данных
и, на первый взгляд, прекрасно их защищает. Однако это только так кажется:
у протокола есть свои недостатки, в которых мы сейчас попробуем разобраться.
Но сперва нужно описать вообще сам процесс защиты информации.
Для обеспечения секретности передаваемых данных Bluetooth
использует непростую многоуровневую схему, каждая ступенька в которой
защищена предыдущей. При выполнении авторизации устройства только начальный
параметр передается простым текстом, все остальные переменные защищены
сложным ключом, который может меняться в зависимости от стадии аутентификации.
Этот шифр носит гордое имя "link key", что можно перевести
как "ключ канала". При передаче информации, она просто ксорится
с этим ключом и таким образом защищается от посторонних глаз. Как я
уже говорил, на разных стадиях обмена информацией ключи канала разные,
они последовательно сменяют друг друга.
Взаимодействие устройств начинается с генерации так называемого
ключа инициализации; создание этого числа, как и вся авторизация устройств,
основана на простом и действенном соображении: если оба девайса хотят
соединения друг с другом, то их хозяева легко договорятся между собой
о некотором общем секретном пароле PIN - короткой цифре, например. И
это число используется как отправная точка для генерации всех последующих
кодов.
Еще одно маленькое отступление: в этой статье я буду стараться
придерживаться тех же обозначений для идентификаторов и функций, что
используются и в официальной спецификации. Так, например, устройство,
начинающее процесс авторизации, я буду обозначать как "A",
в тоже время девайс, с которым мы желаем соединиться, будет называться
не менее лаконично - "B". Ключ инициализации в официальных
доках обозначен как Kinit - я буду называть его так же, чтобы не путать
тебя.
Этот 128-битный ключ создается специальной функцией E22(BD_ADDR, PIN,
l(PIN), IN_RAND), где l(PIN) - длина пина в октетах, а IN_RAND - случайное
число, генерируемое устройством "A" и без всякой защиты передаваемое
девайсу "B". Шифр используется для защиты трафика при передаче
параметров, с помощью которых проводятся дальнейшие действия по аутентификации
устройств, в частности - вычисление кода, которым будет криптоваться
весь пользовательский трафик.
После генерации Kinit'а, он устанавливается ключом канала
и весь дальнейший обмен информацией защищается этим шифром. Затем создаются
так называемые комбинированные ключи, используемые для шифрования пользовательских
данных при передаче между устройствами: следует заметить, что на этот
раз ключи разные - для передачи информации от A к B используется Kab
и наоборот, информация, передающаяся от B к A защищается шифром Kba.
Генерируются эти ключи следующим образом.
Первым делом каждая девайсина создает по случайному числу,
мы обозначим их за LK_RANDa и LK_RANDb. Затем, при помощи функции E21(LK_RAND,
BD_ADDR), генерятся два числа LK_Ka и LK_Kb, причем в этот момент каждый
девайс знает только свою величину, а цель дальнейшей работы устройств
- сообщить друг другу эти числа так, чтоб никто чужой их не запалил.
Что может быть проще! Заксорив Kinit'ом случайные числа LR_RAND, устройства
меняются ими и вычисляют значения LK_K друг для друга. После этого уже
очень легко получить ключи Kab=LK_Ka XOR LK_Kb и Kba=LK_Kb XOR LK_Ka.
После проделанных операций выполняется самая последняя
и очень важная - конечная аутентификация, при которой устройство, провоцирующее
подключение, проходит проверку на желанность со стороны пассивного девайса.
Для этого используется схема, которая получила название challenge-response.
Я долго думал над тем, как бы это перевести, и в итоге остановился на
варианте, который мне предложили на lingvo.yandex.ru - "оклик-отзыв".
Схема работает довольно просто и ты сейчас в этом убедишься.
Устройство "A", которое запрашивает подключение,
генерирует случайное число AU_RAND и посылает его соседнему девайсу
"B". Устройство "B" вычисляет значение S специальной
функции E1(AU_RAND, BD_ADDR, Kab), где BD_ADDR - это адрес устройства.
Девайс "B" передает полученное значение S назад и теперь уже
очередь "A" проделать тоже самое, получив значение S'. Ясен
еж, что если оба устройства использовали одинаковый ключ Kab, то значения
S' и S совпадут, а аутентификация будет успешно пройдена.
Если же устройства использовали различные ключи, попытка
аутентификации будет неудачной и девайс "B" не будет некоторое
время отвечать на запросы "A". С ростом числа неудачных попыток
время ожидания будет расти экспоненциально, пока не упрется в некоторое
максимальное значение. По задумке инженеров, это должно было решить
проблему тупого перебора PIN-кода. Ну, в самом деле, теперь даже если
злоумышленник наколбасит какую-нибудь программу-брутфорсер, которая
будет с одного и того же интерфейса в цикле тупо пытаться установить
соединение, то ничего из этой затеи не выйдет.
После успешной аутентификации может быть включено дополнительно шифрование
трафика, однако это является опциональной возможностью стандарта и не
входит в базовый набор требований. Поэтому сейчас мы попробуем поискать
слабые места в той части протокола, которую я тебе изложил.
[атака на Bluetooth]
В самом деле, так ли уж все безупречно? Конечно, нет!
Подумай сам. В самом начале сеанса простым текстом пересылается параметр
IN_RAND, который при помощи определенных инструментов вполне может отсниффать
злоумышленник - к слову, точно так же пересылается и параметр AU_RANDa.
Что это дает? Обладая этой информацией уже вполне можно вычислить используемый
для связи PIN-код и даже link key! Каким образом? Совершенно ясно, что
сделать это аналитически невозможно, а значит ответ прост - получить
доступ к этим "секретным" данным можно простым перебором пина.
Что если написать простенькую программку, которая в цикле по всем возможным
значениям PIN будет вычислять последовательно значения-претенденты на
LK_Ka, LK_Kb, Kab=LK_Ka XOR LK_Kb и функцию E1(AU_RANDa, BD_ADDRb, Kab).
В случае, если мы угадаем PIN, полученное значение функции совпадет
с захваченным при сниффинге. Таким образом, со 100% вероятностью можно
восстановить используемый при соединении PIN-код. Однако, за какое время?
Ну, давай прикинем. Для каждой попытки необходимо один раз выполнить
функцию E22, 2 раза - E21, 1 раз - E1 и трижды посчитать XOR. Вообще,
это довольно ресурсоемкая задача. Однако если вспомнить, что любой нормальный
человек при использовании bluetooth не указывать пины длиннее 6 символов,
можно с уверенностью сказать, что секунд за 20 современный компьютер
с такой задачей управится .
На самом деле, в некоторых условиях вполне возможно перебирать
PIN и без всяких заморочек. Например, если есть желание повеселиться,
заюзав чужую bluetooth-гарнитуру, можно подобрать к ней PIN, не сниффая
не байта. Все дело в том, что у таких устройств обычно статичный PIN,
это такой ключик к устройству. И поскольку девайс самостоятельно реагирует
на попытки подключиться к нему, появляется возможность вести прямой
перебор этого ключа. Постой, ты ведь не забыл, о чем я говорил выше?
Ну, про то, что если аутентификация не удалась, то устройство не отвечает
некоторое время на повторные запросы от этого же девайса. Так вот, ничто
на самом деле не мешает каждую попытку проводить от имени нового устройства
просто меняя BD_ADDR - сделать это даже проще, чем сварить доширак.
Что касается шифрования с использованием ключа Kc, то
здесь ситуация схожая той, которую мы с тобой разобрали. К сожалению,
у меня нет возможности показать тебе этот недочет, но он абсолютно аналогичен
рассмотренному случаю: есть функция трех аргументов, точно известны
два из них и значение функции. Требуется подобрать значение третьего,
неизвестного аргумента. Словом, задачка на один несложный цикл.
[обнаружение невидимок]
Как ты знаешь, любое bluetooth-устройство может находиться
в двух режимах: доступном для внешнего обнаружения (discoverable-mode)
и недоступном. По задумке создателей bluetooth, режим non-descoverable
должен был решить проблему неавторизованного доступа. Ну, в самом деле,
если ты не можешь обнаружить работу устройства, то как ломать такую
невидимку? Однако не все так просто. Режим этот работает таким образом,
что устройство не откликается на широковещательные запросы и молчит
в тряпочку. Однако, если соседний девайс обратится непосредственно к
молчаливому устройству, то оно откликнется. Как я уже говорил выше,
первые три байта адреса определяются производителем устройства, таким
образом, если мы интересуемся телефоном конкретного производителя, то
максимальное количество таких устройств составляет 16^6=16777216. В
принципе, конечно, это большое число. Однако как посмотреть. Что мешает
нам написать программу, которая последовательно будет перебирать адреса
и обращаться к каждому из них, пока не получит ответ. По существу -
ничего! Более того, скажу тебе по секрету, что такую программу уже давным-давно
написали и с успехом применяют на практике .
На самом деле, легко понять, что полный перебор всего
диапазона займет кучу времени и поэтому имеет смысл распараллеливать
работу на нескольких интерфейсах: специальные программы поддерживают
такую многопоточность, что позволяет во многие разы сократить время
просмотра всего диапазона.
Таблица с адресами некоторых производителей BT-устройств
3com 000BAC |
3com 000476 |
Ericsson 0001EC |
Dlink 0080C8 |
SonyEricsson 000AD9 |
SonyEricsson 008037 |
Nokia 0002EE |
Nokia 00E003 |
Alcatel 00113F |
Alcatel 00089A |
Siemens 0001E3 |
Siemens 000BA3 |
Motorola 0001AF |
Motorola 00080E |
Tdk 008098 |
Apple 000393 |
Palm 0007E0 |
Intelbt 00D0B7 |
Как защищаться?
В самом деле, думаю, большинство читателей очень интересует
этот вопрос - как не пострадать от действий негодяев? В голову лезет
несколько очень простых советов. Ну, прежде всего, хорошая идея - использовать
длинные пины для аутентификации, поскольку в этом случае ты обломаешь
напрочь обломаешь саму возможность за разумное время подобрать Pin-код.
Ведь время перебора будет расти как факториал вслед за длиной пина (максимальная
длина, описанная в стандарте - 16 символов). Так же не нужно опасаться
использовать в пине, если это возможно, буквы латинского алфавита.
Хорошая привычка, если ты всерьез опасаешься воздушных
диверсантов, не спаривать устройства в окружении большого числа людей,
так как если в радиусе 10 метров вокруг тебя нет ни души, ты можешь
жить спокойно.
Источник:
|
|