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

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

В закладки
Аудио
Сергей Крупник

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

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

Когда включаешь новую колонку, каким-то образом нужно передать на неё информацию для подключения к 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 — вы можете сами попробовать развить проект.

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

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

Успехов!

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Сергей Крупник", "author_type": "self", "tags": [], "comments": 48, "likes": 179, "favorites": 96, "is_advertisement": false, "subsite_label": "tribuna", "id": 87454, "is_wide": false, "is_ugc": true, "date": "Fri, 11 Oct 2019 09:51:50 +0300", "is_special": false }
0
{ "id": 87454, "author_id": 163868, "diff_limit": 1000, "urls": {"diff":"\/comments\/87454\/get","add":"\/comments\/87454\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/87454"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199116, "last_count_and_date": null }
48 комментариев
Популярные
По порядку
Написать комментарий...
45

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

Ответить
14

Делайте приложение типа Shazam, с возможностью экспорта полученного текста в png, pdf, … и в буфер обмена.
И генератор звука в него же зашейте.
А мы уже подумаем как применять.

Ответить
12

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

 ffUfD ffwUX (!wwfUD ffUfD

Ответить
12

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

Ответить
8

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

Ответить
7

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

Ответить
1

У меня до сих пор хранится Spectrum с коробкой кассет с играми, и литературой по программированию на basic и assembler.

И никому это уже не надо.

Ответить
0

Отдай мне.

Ответить
0

На хранение? ))

Ответить
1

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

Ответить
5

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

Ответить
0

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

Ответить
4

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

Ответить
0

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

Ответить
1

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

Ответить
–1

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

Ответить
2

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

Ответить
2

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

Ответить
2

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

Ответить
1

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

Ответить
1

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

Ответить
1

Пост Агонь!

Ответить
0

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

Ответить
1

Достаточно сделать таблицу: какой символ за какую ноту и в какой октаве отвечает

Ответить
1

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

Ответить
1

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

Ответить
0

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

Ответить
1

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

Ответить
0

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

Ответить
0

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

Ответить
0

Комментарий удален по просьбе пользователя

Ответить
0

Круто.

Ответить
0

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

Ответить
0

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

Ответить
0

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

Ответить
0

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

Ответить
0

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

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

Ответить
0

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

Ответить
0

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

Ответить
0

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

Ответить
0

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

Ответить
0

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

Ответить
0

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

Ответить
0

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

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

Ответить
0

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

Ответить
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cgxmr", "p2": "gnwc" } } } ] { "page_type": "default" }