Уязвимость в «Яндекс.Станции» вдохновила меня сделать сервис для музыкальной передачи данных
Всем привет! Недавно друзья подарили мне «Яндекс.Станцию». Для её активации нужно было поднести телефон и проиграть звук из приложения «Яндекс». В этой статье я расскажу, как разобрал этот сигнал, нашёл там пароль в открытом виде и развил идею передачи через звук.
Реверс-инжиниринг
Процесс активации станции
Когда включаешь новую колонку, каким-то образом нужно передать на неё информацию для подключения к 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 — вы можете сами попробовать развить проект.
Дублирую ссылку на демку, работающую в браузере.
Спасибо, что дочитали! Надеюсь, вам было интересно.
Успехов!
Так вот оказывается как R2-D2 общается!
Комментарий недоступен
Еще что получилось — В лесу родилась елочка (В начале — пробел):
ffUfD ffwUX (!wwfUD ffUfD
xthnjd utybq!
бНОПНЯ
Сергей, ваши бы руки в интересные проекты.
Период комерциализации уже прошел.
Комментарий недоступен
Отдай мне.
Комментарий недоступен
В Диззи буду играть. :)
Можно явно и не таясь координировать толпы людей с включенным приложением.
И мелодии приятными выходят, и идея очень интересная. Цистерну чая автору!
Спасибо! Рад, что понравилось)
А теперь вспоминаем компьютеры типа "Спектрум", "Радио-86РК", "Орион" и подобные. Когда все программы и данные хранились на аудиокассетах в виде звука. И чтение/запись таких "дисков" производилась с помощью обычных бытовых магнитофонов. Так что идея не нова.
Там несколько иначе идёт кодирование. Основная проблема в том, что могут получить и принять динамик с микрофоном так, чтобы у человека не потекла кровь из ушей. А так обычный qpsk на коленке делается за 5 минут. Да и на гитхабе полно примеров.
Меняйте последние биты в файлах данных, как в стеганографии. На слух практически не отличить - проверял на WAV файлах
Битрейт меленький получается. Получится что пользователю придётся слушать одну и ту же мелодию несколько минут при каждой настройке или любом другом случае когда идёт передача информации.
Либо я не понял, либо одно из двух. Кодовую последовательность можно в любую мелодию спрятать. Хороший Wav 44 кГц (Котельников -Найквиста) - 44 тыс выборок в секунду. Если жестко - меняйте 2 последних бита - в секунду можно передать 88 бит. Если 5 сек контейнер -то итого 440 бит
А было и прикольнее: вот тут про калькулятор Friden EC-132 с акустической памятью – набранные числа хранились в виде стоячих волн в закрученном в спираль проводе!
Вот это да. 🤔 Браво!
Ну и как, посмеялся с пароля Rozetked?)
Можно использовать, как двойную аутентификацию, вместо переписывания длинных рандомных символов. Быстро и просто)
Удивил, молоток!
Пост Агонь!
Еще в фильме "Неуловимые мстители" , Буба Касторский передавал сообщения в танце).
Кстати, на хабре высказали идею, что можно найти последовательности символов, которые будут звучать, как популярные мелодии)
Комментарий недоступен
У меня получилось что-то похожее на главную тему из Пиратов Карибского моря.
Строка такая: !"3DUD3"3DUDD3DUD3"3"!" !
Лет 7-10 назад на сайтах с виртуальными пианино в каментах регулярно писали буквы на клаве, которые надо нажать, чтобы проиграть самые разные мелодии, там их охулиарды. Вообщем, тут простое прямое преобразование будет из них, хотя тогда уже проще готовые миди преобразовывать)
а где приемник взять, есть принимающая программа?
На гитхабе в папке research есть прототип приемника. Для стабильной работы его нужно дорабатывать. https://github.com/krupnikas/octave
Сергей, благодарю!
Да кому такое надо, оно же в открытом космосе не будет работать...
Комментарий недоступен
Круто.
Было уже https://youtu.be/gvZMSUDpI_o
Дай Бог тебе сил развивать проект!!
хорошее начало
Диалап модем - не то? Уходим в прошлое)
было уже такое, даже по для android есть
передача данных ультразвуком через динамик.
и наложить полученный сигнал, можно на любое аудио.
чувак изобрёл модем, вот это новость))) только вместо проводов - воздух
Пост шикарен! Автору респект и +100500 баллов к карме.
Спасибо! Рад, что понравилось)
Скорее всего надо как-то в рекламу это внедрять...тогда и спрос будет
А нота повтор знака есть? А то сбои гарантированы.
Да, защиты от сбоев нет. Это концепт. В идеале, конечно, нужны и помехоустойчивое кодирование, и контроль целостности.
естественно, двухчастное кодирование не вчера придумали.
да нет, простая защита от одинаковых подряд идущих цифр. добавляется одна нота - повтор и если подряд идут одинаковые цифры, то вместо каждой второй ставится эта нота повтор. Позволяет передавать данные асинхронно. Пока нота не сменилась, это все один знак.
У меня выбрана фиксированная длина символа, поэтому такой проблемы просто нет. Приёмник делит на сегменты по времени, а значит, ему не важно, сменилась частота или нет.