Хабрахабр

Реверс инжиниринг протокола активации Яндекс.Станции

Чтобы её активировать, нужно поднести телефон и проиграть звук из приложения «Яндекс». «Яндекс.Станция» — умная колонка с голосовым помощником Алиса. Под катом я расскажу, как устроен этот сигнал, про пароль от WiFi в открытом виде и попробую развить идею передачи данных через звук.

Преамбула

Я закончил радиотехнический факультет МФТИ, изучал и разрабатывал системы связи от протоколов физического уровня до сетей федерального масштаба. Поэтому, когда друзья подарили Яндекс.Станцию, мне сразу стало интересно, как организована передача данных для активации через аудиотокен.

Процесс активации

Когда включаешь новую колонку, каким-то образом нужно передать на неё информацию для подключения к WiFi сети и авторизации в сервисах Яндекса. В Станции это сделано через звук и выглядит, как на видео ниже (7:34).

Знал бы он, что в этот момент его пароль от WiFi попал в видео практически в открытом виде! "… передача информации происходит, ну не по звуку, конечно ..." — говорит Валентин. Но об этом позже.

Телефон берет данные о WiFi сети (ssid из системы, пароль вводит пользователь) и данные для авторизации в Яндексе. А пока рассмотрим, что происходит. Станция демодулирует сигнал с микрофонов, декодирует данные и использует их для подключения к сети и авторизации. Они каким-то образом кодируются, модулируются и излучаются динамиком телефона.

В этом процессе нас интересует, как кодируются и модулируются данные.

Визуальная демодуляция

Для получения образца сигнала не нужна сама Станция. Необходимо только, чтобы телефон был подключен к WiFi с интернетом. Я решил создавать точки доступа с разными ssid и паролями, чтобы посмотреть, как меняется сигнал. Для удобства стал записывать звук в файлы и работать с ними.

Нажал «Проиграть звук» и записал получившийся сигнал. Для начала я создал точку доступа со случайным паролем «012345678» и подключил к ней телефон. Здесь по вертикальной оси отложена частота, по горизонтальной — время, а цвет определяется амплитудой. Давайте посмотрим на его спектр во времени (waterfall).

Так, тут видно, что применяется частотная модуляция, а данные передаются символами по 40мс. Также можно выделить возрастающую подпоследовательность:

Кажется, у нас был возрастающий пароль. Стоп! Как эти цифры выглядят в кодировках ascii или utf-8? «012345678». Ого! "30 31 32 33 34 35 36 37 38". Вот он где лежит: Даже менять пароль не пришлось!

Я попробовал менять пароль и убедился, что правильно определил его положение в сигнале.

По сути кодируется hex строка, где каждому значению 0 — F соответствует своя частота от 1 кГц до 4,6 кГц с шагом в 240 Гц. Получается, данные кодируются символами по 4 бита. При этом в начале и в конце передачи есть излучение на частотах выше 5 кГц — метки начала и конца отделены от основной части на физическом уровне.

Декодирование

Чтобы каждый раз не переписывать на листочек символы, глядя на спектр, я набросал простой приёмник на питоне, который достаточно стабильно конвертирует аудиофайл в исходную hex-строку. Я стал менять ssid точки доступа и анализировать, на какие байты это влияет. В итоге выяснилось, что информация о ssid хранится в двух байтах перед паролем. При этом длинна этого блока не зависит от длины ssid. Как так?

При этом, скорее всего, Станция после включения вычисляет хеши названий всех доступных сетей. Вероятно, на Станцию передаётся только хеш от ssid. Скорее всего, это сделано для уменьшения длины посылки. После чего выбирает сеть, сравнивая полученные значения с принятыми. (Но как тогда происходит подключение к скрытым сетям?)

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

Однако, длина пакета достаточно маленькая, поэтому точно можно сказать, что в посылке нет какого-нибудь OAuth токена. Данные для авторизации в Яндексе мне не удалось выделить. А она, в свою очередь, получает по этой ссылке полноценные данные для аутентификации. Я предполагаю, что приложение «Яндекс» получает временную ссылку, часть которой передаёт на Станцию. Думаю, сделано это также для уменьшения длины посылки.

Написал в Яндекс?

Да, 8 мая 2019. Получил автоматический ответ:

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

Это вообще проблема?

Возможно, сотрудники Яндекса не считают это проблемой. Действительно, это сложно назвать уязвимостью, ведь активация Станции редко происходит больше 1 раза. При этом, часто она находится в «доверенном» помещении. Дома или в офисе вы можете произносить пароль от WiFi вслух, что практически то же самое. Специалисты по информационной безопасности, как вы считаете?

Кроме того, алгоритм активации уже зашит в произведенные Станции, поэтому избавиться от этой уязвимости в текущей версии вряд ли удастся.

По крайней мере, не вежливо обещать ответить и не делать этого. Однако, я считаю, это не повод игнорировать сообщения в bugbounty. Если что, номер тикета: 19050804473488035. Ладно, будем считать, что моё обращение где-то затерялось.

Поэтому, несмотря на то, что я обладаю стабильным приёмником этого сигнала, дать его вам не могу. Лично я считаю, что уязвимость какая-никакая есть.

А также, хочу напомнить Wylsacom, Rozetked, и другим блогерам о необходимости регулярной смены пароля. По крайней мере я знаю, какой у вас был на момент обзора Яндекс.Станции)

Что в итоге?

Разработчики из Яндекса сделали крутую штуку. Они разукрасили процесс активации Станции, сделали его необычным. Единственная проблема, на мой взгляд — открытый пароль.

Это навело меня на мысли, что в данном случае не так важна безопасность или скорость. А ведь тот же процесс можно было сделать безопаснее с использованием Bluetooth. Активация через звуки, напоминающие R2-D2 из «Звездных войн», впечатляет и выглядит необычно. Важно шоу.

Что, если для модуляции hex символов использовать частоты нот? Такая позиция вдохновила меня развить идею разработчиков Яндекса и сделать протокол, ориентированный на впечатление. Получилось очень интересно, но об этом — уже в следующей статье. Почему бы не передать данные в До-мажоре?

Спасибо, что дочитали, успехов!

Показать больше

Похожие публикации

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

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

Кнопка «Наверх»