Эта история началась несколько месяцев назад, когда ко мне попал популярный фитнес-трекер в виде браслета от одного из известных производителей подобных устройств. Так как это носимое устройство (wearable device), то я установил себе Android Wear app – приложение, созданное специально для носимых устройств. Это приложение без проблем подключилось к фитнес-браслету.
Правда, была одна странность: программа подключилась к браслету Nike+ Fuel Band SE, а у меня был браслет другой фирмы. Достаточно быстро мне удалось выяснить, что браслет Nike принадлежит моему коллеге. А он даже не заметил, как я подключился к его устройству.
После этого мне захотелось провести небольшое исследование и проверить свой браслет на предмет безопасности.
Умные браслеты: коммуникации с телефоном
Сейчас на рынке довольно много предложений аналогичных браслетов от других производителей. Ниже приведена статистика KSN по установкам на мобильные устройства пользователей приложений под Android для работы с популярными фитнес-трекерами (данные для статистики получены от пользователей KSN, которые дали свое согласие на их передачу).
Распределение установок Android-приложений
для работы с фитнес-трекерами разных производителей
Хотя эта статистика популярности именно Android-приложений (у нас нет гарантий, что соответствующие устройства есть у пользователей), в некотором приближении она отражает ситуацию с популярностью и носимых устройств.
Для коммуникации с телефоном большинство этих браслетов используют технологию Bluetooth LE (также известную как Bluetooth Smart). Для нас это значит, что соединение устройств происходит не так, как в обычном Bluetooth. Нет никакого общего пароля – у большинства устройств нет экрана и/или клавиатуры.
В некоторых случаях подключиться к носимому устройству можно без ведома пользователя
Tweet
В этих браслетах используется GATT (Generic Attribute Profile) — профиль общих атрибутов. Т.е. на носимом устройстве есть некий набор сервисов, у каждого сервиса есть набор характеристик. Каждая характеристика содержит байтовый буфер и список дескрипторов, каждый дескриптор содержит значение – байтовый буфер.
Для того чтобы это проиллюстрировать, я взял готовый код из Android SDK – пример приложения для подключения к Bluetooth LE устройствам. Мне не пришлось писать ни строчки кода – просто открыл уже существующий проект в Android Studio и нажал кнопку Start.
На скриншоте выше виден результат подключения к моему браслету с помощью этого приложения. Тут видны сервисы и их характеристики. Но для моего браслета не так просто получить данные из характеристик – для этого необходимо не только подключение, но и аутентификация. В случае же некоторых из FitBit устройств мне удалось считать данные из характеристик и их дескрипторов. Вполне возможно, что это пользовательские данные.
Сканирование
Итак, используя пример приложения из Android SDK, мне удалось подключиться к некоторым устройствам. После этого я сделал свое приложение, которое автоматически искало Bluetooth LE устройства, пыталось к ним подключиться и получить их список сервисов.
Используя это приложение, я провел несколько сканирований.
- За два часа в Московском метро я смог подключиться к 19 устройствам 11 FitBit и 8 Jawbone.
- В течение часа в фитнес-клубе в городе Bellevue, WA, USA, было обнаружено 25 устройств: 20 Fitbit, по одному – Nike, Jawbone, Microsoft, Polar, Quans.
- За два часа в Канкуне (Мексика) вовремя SAS2015 я смог подключиться к 10 фитнес-трекерам: 3 Jawbone и 7 FitBit.
Всего за шесть часов сканирования я смог подключиться к 54 устройствам. И это при наличии двух серьезных ограничений:
- Несмотря на указанные в спецификации 50 метров, реальное максимальное расстояние для подключений в большинстве случаев – не больше 6 метров.
- Предполагается, что к уже подключенному устройству невозможно подключиться. Т.е. если ваш девайс спарен с вашим телефоном, то никто не сможет к нему подключиться, его даже не должно быть видно в ходе сканирования.
Второе ограничение в принципе означает, что пока устройство подключено к смартфону, оно не доступно для атаки. Хотя на самом деле это не так. И вот пример: используя мое приложение для сканирования, мне удалось заблокировать коммуникацию между моим браслетом и официальным приложением, хотя они заранее были спарены.
Учитывая второй пункт приведенных выше ограничений, можно предположить, что обнаруженные мною устройства никогда не подключались к телефону, либо браслет не был подключен к смартфону во время сканирования (bluetooth на телефоне выключен). А может быть, уже подключенное устройство было доступно для подключения, несмотря на предполагаемое ограничение. Как бы то ни было, шансы у потенциальных злоумышленников подключиться к фитнес-трекерам весьма велики.
Однако в большинстве случаев для того, чтобы получить доступ к данным пользователя, необходимо не только подключение к устройству, но и аутентификация. Давайте посмотрим, как происходит аутентификация у Jawbone.
Мой браслет: аутентификация
Для аутентификации на телефоне официальное приложение моего браслета использует один из четырех доступных на устройстве сервисов. Для каждой характеристики из этого сервиса приложение устанавливает флаг «CharacteristicNotification» – таким образом приложение сообщает браслету, что хочет получать нотификации о любом изменении этой характеристики. Затем приложение получает список дескрипторов для каждой характеристики и устанавливает флаг «ENABLE_NOTIFICATION_VALUE» – так приложение сообщает браслету, что хочет получать нотификации о любом изменении каждого дескриптора.
После этого одна из характеристик меняет свое значение – байтовый буфер. Приложение считывает с браслета этот буфер: заголовок 200f1f и массив байт – назовем его authBytes.
Приложение создает новый массив. Первой его частью будет константный массив, содержащийся в приложении и начинающийся с 6dc351fd44, второй частью нового массива будет authBytes. Приложение получает MD5 хэш от нового массива и отправляет его обратно на устройство в следующей структуре:
- Header (201210051f)
- MD5
- Проверочный байт
Затем приложение отправляет на устройство еще один массив, также содержащийся в этом приложении.
После этого браслет начинает вибрировать, пользователю остается лишь нажать кнопку – и аутентификация будет завершена.
Для официального приложения процесс аутентификации занимает около 15 секунд. Я сделал приложение, которому надо всего лишь 4 секунды для того, чтобы браслет завибрировал.
Заставить пользователя нажать единственную кнопку на браслете легко. Нужно лишь быть достаточно настойчивым – можно перезапускать процесс аутентификации много раз, пока пользователь все-таки не нажмет кнопку. Или пока он не отойдет на расстояние, превышающее 6 метров.
Несмотря на ограничения, всего за шесть часов сканирования я смог подключиться к 54 фитнесс-браслетам
Tweet
На моем браслете после того, как аутентификация завершена, данные становятся доступными для снятия. В настоящее время на носимых фитнес-устройствах содержится не так уж много информации. Как правило, это количество шагов, фазы сна, пульс за последний час или около того. Приблизительно раз в час приложение переносит всю информацию с браслета в облако.
После аутентификации на устройстве легко выполнять команды. Например, для того, чтобы поменять время, нужно отправить на устройство массив байт, начинающийся с f0020c, а затем дату в виде YYYY MM DD DW HH MM SS MSMSMSMS.
В случае с другими фитнес-трекерами все еще проще: для FitBit часть данных доступна сразу после подключения, а код приложения для Nike даже не обфусцирован и читается очень легко (результаты одного исследования можно посмотреть здесь).
Заключение
Как показали результаты моего маленького исследования, в некоторых случаях подключиться к носимому устройству можно без ведома пользователя.
Впрочем, атаковав браслет, подобный тому, что есть у меня, злоумышленник не сможет получить доступ ко всем данным пользователя – они не хранятся на браслете или в телефоне, официальное приложение регулярно переносит всю информацию с браслета в облако. Однако фитнес-трекеры становятся все популярнее и функциональнее. Вероятно, в ближайшем будущем они будут содержать гораздо больше сенсоров, а значит, и гораздо больше пользовательской информации, зачастую медицинской. Несмотря на это, складывается впечатление, что создатели этих устройств не думают об их безопасности.
Просто представьте – если взломан браслет с датчиком пульса, владелец магазина может следить за частотой пульса покупателя, пока тот смотрит на скидки в его магазине. Так же можно узнавать реакцию людей на рекламу. Более того, взломанный браслет с датчиком пульса можно использовать в качестве детектора лжи.
Конечно, возможны и более вредоносные действия – например, применение Trojan-Ransom. Злоумышленник может перехватить контроль над вашим браслетом и заставить его постоянно вибрировать. А за отключение вибрации потребовать деньги.
Злоумышленник может заставить браслет постоянно вибрировать и потребовать деньги за отключение вибрации
Tweet
Мы уведомили разработчика устройства о результатах этого исследования, и разработчик сообщил, что данный метод является скорее следствием ошибки в пользовательском интерфейсе, чем настоящей брешью в безопасности устройства. Мне трудно с этим спорить: найти по-настоящему «вредоносное» и массовое применение этому методу действительно сложно. С другой стороны, и простой ошибкой в интерфейсе я назвать это не могу. Скорее, это уязвимость в безопасности устройства, которой могло бы и не быть, примени производитель более продвинутую схему аутентификации устройства; Поскольку мы не получили подтверждения о том, что эта ошибка будет устранена, мы не станем раскрывать имя вендора и название браслета, в котором наличие ошибки было подтверждено опытным путем – чтобы не давать хулиганам прямой наводки на конкретную модель. Пользователям, которых встревожила представленная в этой статье информация о способе перехвата управления умным браслетом, мы рекомендуем обратиться к производителю устройства и уточнить, является ли информация из этой статьи актуальной для их устройств.
Мы также рассчитываем, что опубликованная в этой статье информация поможет разработчикам устройств избежать ошибок при проектировании новых продуктов и сделать их по-настоящему безопасными.
Как я взломал свой фитнес-браслет
Андрей
Отличная статья! Спасибо!
Руслан
Статья +! Вышел на неё через поиск. Мой браслет соединяется с соседской программой, живут они этажом выше, после того как я теряю связь со своим смартфоном. И после этого я на браслете вижу имена входящих звонков и читаю чужие смс. Вроде ничего такого, но когда это происходит (вибрация) ночью, то раздражает )) Если на ночь не отключаю браслет, делаю следующее: вечером кладу рядом смартфон, чтобы связь не терялась, отключаю передачу данных, чтобы свои оповещения из интернета не беспокоили и нормально сплю. Теперь всё понятно. Спасибо!
Dmitry
«Поскольку мы не получили подтверждения о том, что эта ошибка будет устранена, мы не станем раскрывать имя вендора и название браслета, в котором наличие ошибки было подтверждено опытным путем»
— А может как раз надо опубликовать эту информацию в открытом доступе,
чтобы как пользователи узнали
об этом» косяке»,
так и изготовитель
«пошевелился» с обновлением кривой прошивки?
Securelist
Добрый вечер, Дмитрий!
Этой истории уже много лет, но в целом наша задача — сделать мир безопаснее, а не пристыдить производителя публично, поэтому наши эксперты стараются ответственно подходить к раскрытию уязвимостей.