Как я взломал свой фитнес-браслет

Эта история началась несколько месяцев назад, когда ко мне попал популярный фитнес-трекер в виде браслета от одного из известных производителей подобных устройств. Так как это носимое устройство (wearable device), то я установил себе Android Wear app – приложение, созданное специально для носимых устройств. Это приложение без проблем подключилось к фитнес-браслету.

insecurable_wearables_1

Правда, была одна странность: программа подключилась к браслету Nike+ Fuel Band SE, а у меня был браслет другой фирмы. Достаточно быстро мне удалось выяснить, что браслет Nike принадлежит моему коллеге. А он даже не заметил, как я подключился к его устройству.

После этого мне захотелось провести небольшое исследование и проверить свой браслет на предмет безопасности.

Умные браслеты: коммуникации с телефоном

Сейчас на рынке довольно много предложений аналогичных браслетов от других производителей. Ниже приведена статистика KSN по установкам на мобильные устройства пользователей приложений под Android для работы с популярными фитнес-трекерами (данные для статистики получены от пользователей KSN, которые дали свое согласие на их передачу).

insecurable_wearables_2

Распределение установок Android-приложений
для работы с фитнес-трекерами разных производителей

Хотя эта статистика популярности именно Android-приложений (у нас нет гарантий, что соответствующие устройства есть у пользователей), в некотором приближении она отражает ситуацию с популярностью и носимых устройств.

Для коммуникации с телефоном большинство этих браслетов используют технологию Bluetooth LE (также известную как Bluetooth Smart). Для нас это значит, что соединение устройств происходит не так, как в обычном Bluetooth. Нет никакого общего пароля – у большинства устройств нет экрана и/или клавиатуры.

В этих браслетах используется GATT (Generic Attribute Profile) — профиль общих атрибутов. Т.е. на носимом устройстве есть некий набор сервисов, у каждого сервиса есть набор характеристик. Каждая характеристика содержит байтовый буфер и список дескрипторов, каждый дескриптор содержит значение – байтовый буфер.

Для того чтобы это проиллюстрировать, я взял готовый код из Android SDK – пример приложения для подключения к Bluetooth LE устройствам. Мне не пришлось писать ни строчки кода – просто открыл уже существующий проект в Android Studio и нажал кнопку Start.

insecurable_wearables_3

На скриншоте выше виден результат подключения к моему браслету с помощью этого приложения. Тут видны сервисы и их характеристики. Но для моего браслета не так просто получить данные из характеристик – для этого необходимо не только подключение, но и аутентификация. В случае же некоторых из 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 устройствам. И это при наличии двух серьезных ограничений:

  1. Несмотря на указанные в спецификации 50 метров, реальное максимальное расстояние для подключений в большинстве случаев – не больше 6 метров.
  2. Предполагается, что к уже подключенному устройству невозможно подключиться. Т.е. если ваш девайс спарен с вашим телефоном, то никто не сможет к нему подключиться, его даже не должно быть видно в ходе сканирования.

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

insecurable_wearables_4

Учитывая второй пункт приведенных выше ограничений, можно предположить, что обнаруженные мною устройства никогда не подключались к телефону, либо браслет не был подключен к смартфону во время сканирования (bluetooth на телефоне выключен). А может быть, уже подключенное устройство было доступно для подключения, несмотря на предполагаемое ограничение. Как бы то ни было, шансы у потенциальных злоумышленников подключиться к фитнес-трекерам весьма велики.

Однако в большинстве случаев для того, чтобы получить доступ к данным пользователя, необходимо не только подключение к устройству, но и аутентификация. Давайте посмотрим, как происходит аутентификация у Jawbone.

Мой браслет: аутентификация

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

После этого одна из характеристик меняет свое значение – байтовый буфер. Приложение считывает с браслета этот буфер: заголовок 200f1f и массив байт – назовем его authBytes.

Приложение создает новый массив. Первой его частью будет константный массив, содержащийся в приложении и начинающийся с 6dc351fd44, второй частью нового массива будет authBytes. Приложение получает MD5 хэш от нового массива и отправляет его обратно на устройство в следующей структуре:

  • Header (201210051f)
  • MD5
  • Проверочный байт

Затем приложение отправляет на устройство еще один массив, также содержащийся в этом приложении.

После этого браслет начинает вибрировать, пользователю остается лишь нажать кнопку – и аутентификация будет завершена.

Для официального приложения процесс аутентификации занимает около 15 секунд. Я сделал приложение, которому надо всего лишь 4 секунды для того, чтобы браслет завибрировал.

Заставить пользователя нажать единственную кнопку на браслете легко. Нужно лишь быть достаточно настойчивым – можно перезапускать процесс аутентификации много раз, пока пользователь все-таки не нажмет кнопку. Или пока он не отойдет на расстояние, превышающее 6 метров.

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

После аутентификации на устройстве легко выполнять команды. Например, для того, чтобы поменять время, нужно отправить на устройство массив байт, начинающийся с f0020c, а затем дату в виде YYYY MM DD DW HH MM SS MSMSMSMS.

В случае с другими фитнес-трекерами все еще проще: для FitBit часть данных доступна сразу после подключения, а код приложения для Nike даже не обфусцирован и читается очень легко (результаты одного исследования можно посмотреть здесь).

Заключение

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

Впрочем, атаковав браслет, подобный тому, что есть у меня, злоумышленник не сможет получить доступ ко всем данным пользователя – они не хранятся на браслете или в телефоне, официальное приложение регулярно переносит всю информацию с браслета в облако. Однако фитнес-трекеры становятся все популярнее и функциональнее. Вероятно, в ближайшем будущем они будут содержать гораздо больше сенсоров, а значит, и гораздо больше пользовательской информации, зачастую медицинской. Несмотря на это, складывается впечатление, что создатели этих устройств не думают об их безопасности.

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

Конечно, возможны и более вредоносные действия – например, применение Trojan-Ransom. Злоумышленник может перехватить контроль над вашим браслетом и заставить его постоянно вибрировать. А за отключение вибрации потребовать деньги.

Мы уведомили разработчика устройства о результатах этого исследования, и разработчик сообщил, что данный метод является скорее следствием ошибки в пользовательском интерфейсе, чем настоящей брешью в безопасности устройства. Мне трудно с этим спорить: найти по-настоящему «вредоносное» и массовое применение этому методу действительно сложно. С другой стороны, и простой ошибкой в интерфейсе я назвать это не могу. Скорее, это уязвимость в безопасности устройства, которой могло бы и не быть, примени производитель более продвинутую схему аутентификации устройства; Поскольку мы не получили подтверждения о том, что эта ошибка будет устранена, мы не станем раскрывать имя вендора и название браслета, в котором наличие ошибки было подтверждено опытным путем – чтобы не давать хулиганам прямой наводки на конкретную модель. Пользователям, которых встревожила представленная в этой статье информация о способе перехвата управления умным браслетом, мы рекомендуем обратиться к производителю устройства и уточнить, является ли информация из этой статьи актуальной для их устройств.

Мы также рассчитываем, что опубликованная в этой статье информация поможет разработчикам устройств избежать ошибок при проектировании новых продуктов и сделать их по-настоящему безопасными.

Публикации на схожие темы

Всего комментариев: 1
  1. Андрей

    Отличная статья! Спасибо!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *