Уязвимость в «Яндекс.Станции» вдохновила меня сделать сервис для музыкальной передачи данных

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

Сергей Крупник

Реверс-инжиниринг

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

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

«Передача информации происходит, ну не по звуку, конечно», — говорит Валентин. Знал бы он, что в этот момент его пароль от Wi-Fi попал в видео практически в открытом виде! Но об этом позже.

Анализ сигнала

Я создал точку доступа Wi-Fi с паролем «012345678» и записал получившийся сигнал. Затем посмотрел на спектрограмму и понял, как устроен сигнал и где лежит пароль от WiFi.

Спектрограмма сигнала

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

Вдохновение

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

Действительно! Ведь протокол связи — всегда компромисс между дальностью, скоростью и надёжностью. А что, если все эти характеристики отойдут на второй план, а определяющим станет фактор впечатления для пользователя? Я решил сделать протокол, в котором для модуляции будут использоваться частоты нот.

За работу!

Мне понравилась простая, как молоток, идея разработчиков «Яндекса» — выбрать 16 частот: по одной для каждого hex-символа. А ещё у меня остались наработки от реверс-инжиниринга, поэтому я решил развить эту идею, а не придумывать всё с нуля.

Глубоко в технику вдаваться не будем: подробнее о разработке я написал в другой статье на «Хабре». А сейчас расскажу в двух словах.

Я избавился от щелчков в сигнале «Яндекс.Станции» и выбрал новые частоты для передачи: 16 нот, начиная с До первой октавы. Вот так:

​Шестнадцатеричные символы соответствуют нотам

Если использовать более высокие ноты, то становится менее комфортно ушам. А более низкие ноты хуже передаются из-за особенностей динамиков и микрофонов.

Получилась своего рода музыкально-частотная модуляция. Назовём её «круп-модуляция» :)

Запускаем!

Как же это звучит? Чтобы можно было попробовать прямо в браузере, я переписал передатчик с круп-модуляцией с Python на JavaScript и сделал простенький интерфейс.

Пользуясь случаем, хочу передать привет:

Кириллические символы и даже эмодзи тоже работают. Но посылки с ними получаются длиннее и менее мелодичными из-за особенностей кодировки.

Можете попробовать любые фразы тут. (Продублирую в конце статьи.)

А как же приёмник?

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

Я сделал прототип приёмника в качестве proof of concept. Вот как он работает:

Видите, передача данных идёт как по нотам! Конечно, ни о каком продакшне сейчас речи не идёт. Тут нет синхронизации, помехоустойчивого кодирования и контроля целостности.

Но если сообщество проявит интерес и подкинет пару вариантов практического применения, я могу реализовать перечисленную функциональность и обернуть в нормальную библиотеку :)

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

Подводя итог

Это был интересный проект на пару вечеров с достаточно эффектным результатом. Такую передачу данных можно использовать, например, как «звуковой QR-code» — расшарить аккаунт с телефона на сайт и прочее.

Как вариант — с её помощью можно создавать мелодии для брендов. Вот, например, как звучит vc.ru.

Все текущие наработки доступны на GitHub — вы можете сами попробовать развить проект.

Дублирую ссылку на демку, работающую в браузере.

Спасибо, что дочитали! Надеюсь, вам было интересно.

Успехов!

0
49 комментариев
Написать комментарий...
Nikolay Kenig

Так вот оказывается как R2-D2 общается!

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Сергей Крупник
Автор

Еще что получилось — В лесу родилась елочка (В начале — пробел): 

 ffUfD ffwUX (!wwfUD ffUfD

Ответить
Развернуть ветку
Прочел это-потратил время зря

xthnjd utybq!

Ответить
Развернуть ветку
Юрий Б.

бНОПНЯ

Ответить
Развернуть ветку
Платон Щукин

Сергей, ваши бы руки в интересные проекты.

Ответить
Развернуть ветку
dss

Период комерциализации уже прошел. 

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Вадим Зуев

Отдай мне.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Вадим Зуев

В Диззи буду играть. :)

Ответить
Развернуть ветку
Make Luv

Можно явно и не таясь координировать толпы людей с включенным приложением.

Ответить
Развернуть ветку
Фан-клуб Валентина Стрыкало

И мелодии приятными выходят, и идея очень интересная. Цистерну чая автору!

Ответить
Развернуть ветку
Сергей Крупник
Автор

Спасибо! Рад, что понравилось)

Ответить
Развернуть ветку
Дмитрий Гладышев

А теперь вспоминаем компьютеры типа "Спектрум", "Радио-86РК", "Орион" и подобные. Когда все программы и данные хранились на аудиокассетах в виде звука. И чтение/запись таких "дисков" производилась с помощью обычных бытовых магнитофонов. Так что идея не нова.

Ответить
Развернуть ветку
Гала Перидоловна

Там несколько иначе идёт кодирование. Основная проблема в том, что могут получить и принять динамик с микрофоном так, чтобы у человека не потекла кровь из ушей. А так обычный qpsk на коленке делается за 5 минут. Да и на гитхабе полно примеров. 

Ответить
Развернуть ветку
Dmitry Ershov

Меняйте последние биты в файлах данных, как в стеганографии. На слух практически не отличить - проверял на WAV файлах

Ответить
Развернуть ветку
Гала Перидоловна

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

Ответить
Развернуть ветку
Dmitry Ershov

Либо я не понял, либо одно из двух. Кодовую последовательность можно в любую мелодию спрятать. Хороший Wav 44 кГц  (Котельников -Найквиста) - 44 тыс выборок в секунду. Если жестко - меняйте 2 последних бита - в секунду можно передать 88 бит. Если 5 сек контейнер -то итого  440 бит

Ответить
Развернуть ветку
one you follow

А было и прикольнее: вот тут про калькулятор Friden EC-132 с акустической памятью – набранные числа хранились в виде стоячих волн в закрученном в спираль проводе!

Ответить
Развернуть ветку
Dima Azizbekov

Вот это да. 🤔 Браво!

Ответить
Развернуть ветку
Danil Garashchenko

Ну и как, посмеялся с пароля Rozetked?)

Ответить
Развернуть ветку
Tim Maev

Можно использовать, как двойную аутентификацию, вместо переписывания длинных рандомных символов. Быстро и просто)

Ответить
Развернуть ветку
Макс Лысюк

Удивил, молоток!

Ответить
Развернуть ветку
Viacheslav B

Пост Агонь!

Ответить
Развернуть ветку
Sergey Kronfeld

Еще в фильме "Неуловимые мстители" , Буба Касторский передавал сообщения в танце). 

Ответить
Развернуть ветку
Сергей Крупник
Автор

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

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Сергей Крупник
Автор

У меня получилось что-то похожее на главную тему из Пиратов Карибского моря.
Строка такая: !"3DUD3"3DUDD3DUD3"3"!" !

Ответить
Развернуть ветку
Коля Павельев

Лет 7-10 назад на сайтах с виртуальными пианино в каментах регулярно писали буквы на клаве, которые надо нажать, чтобы проиграть самые разные мелодии, там их охулиарды. Вообщем, тут простое прямое преобразование будет из них, хотя тогда уже проще готовые миди преобразовывать)

Ответить
Развернуть ветку
Юрий Виль

а где приемник взять, есть принимающая программа?

Ответить
Развернуть ветку
Сергей Крупник
Автор

На гитхабе в папке research есть прототип приемника. Для стабильной работы его нужно дорабатывать. https://github.com/krupnikas/octave

Ответить
Развернуть ветку
Юрий Виль

Сергей, благодарю!

Ответить
Развернуть ветку
Роман Романов

Да кому такое надо, оно же в открытом космосе не будет работать...

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Влад Куряев

Круто.

Ответить
Развернуть ветку
Александр Сёмочкин
Ответить
Развернуть ветку
Максим Мирошник

Дай Бог тебе сил развивать проект!!

Ответить
Развернуть ветку
Nikolay Chudinov

хорошее начало

Ответить
Развернуть ветку
Антон Добрынин

Диалап модем - не то? Уходим в прошлое) 

Ответить
Развернуть ветку
Stanislav Vershinin

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

и наложить полученный сигнал, можно на любое аудио.

Ответить
Развернуть ветку
Yury Y

чувак изобрёл модем, вот это новость))) только вместо проводов - воздух

Ответить
Развернуть ветку
$амурай маркетинга

Пост шикарен! Автору респект и +100500 баллов к карме.

Ответить
Развернуть ветку
Сергей Крупник
Автор

Спасибо! Рад, что понравилось)

Ответить
Развернуть ветку
Юрий Виль

Скорее всего надо как-то в рекламу это внедрять...тогда и спрос будет

Ответить
Развернуть ветку
Алексей Любимов

А нота повтор знака есть? А то сбои гарантированы.

Ответить
Развернуть ветку
Сергей Крупник
Автор

Да, защиты от сбоев нет. Это концепт. В идеале, конечно, нужны и помехоустойчивое кодирование, и контроль целостности.

Ответить
Развернуть ветку
Алексей Любимов

естественно, двухчастное кодирование не вчера придумали.

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

Ответить
Развернуть ветку
Сергей Крупник
Автор

У меня выбрана фиксированная длина символа, поэтому такой проблемы просто нет. Приёмник делит на сегменты по времени, а значит, ему не важно, сменилась частота или нет.

Ответить
Развернуть ветку
46 комментариев
Раскрывать всегда