Злая колонка. Как «Яндекс Станция» может превратиться в шпионский гаджет

Содержание статьи

  • Физическое вмешательство
  • Правим дамп
  • Ура, вошли!
  • Неожиданно — OSINT!
  • Шелл
  • Туннель в обход
  • Щупаем Bluetooth
  • Сканируем сети
  • Слушаем
  • Слушаем сеть
  • Итоги

«Они сле­дят за тобой через нее!» — навер­няка каж­дый вла­делец умной колон­ки слы­шал это от кого‑то или даже сам так дума­ет. Про­изво­дите­ли, конеч­но, опро­вер­гают подоб­ные домыс­лы, но, даже если они шпи­онских фун­кций не зак­ладыва­ли, теоре­тичес­ки такая воз­можность есть. Я решил пос­тавить экспе­римент и пос­мотреть, может ли колон­ка обер­нуть­ся шпи­оном. warning

Статья име­ет озна­коми­тель­ный харак­тер и пред­назна­чена для спе­циалис­тов по безопас­ности, про­водя­щих тес­тирова­ние в рам­ках кон­трак­та. Автор и редак­ция не несут ответс­твен­ности за любой вред, при­чинен­ный с при­мене­нием изло­жен­ной информа­ции. Рас­простра­нение вре­донос­ных прог­рамм, наруше­ние работы сис­тем, наруше­ние тай­ны перепис­ки, прос­лушива­ние раз­говоров и чте­ние перепис­ки граж­дан без их сог­ласия прес­леду­ется по закону.

От­части это про­дол­жение прош­лой статьи про Rabbit Hole, потому‑то конец норы най­дем в сис­теме.

Все опы­ты я буду делать, как и в прош­лой статье, на колон­ке «Яндекс Лайт» (YNDX-0025), но все точ­но так же сра­бота­ет на моделях «Лайт 2», «Мини 2», «Стан­ция 2» и «Мини 3». Опы­ты про­вожу с одной ого­вор­кой: в целях безопас­ности все методы неус­той­чивы к пол­ному сбро­су устрой­ства! То есть дос­таточ­но зажать кноп­ку сбро­са про­шив­ки при вклю­чении, и все изме­нения сот­рутся.

info

На самом деле все колон­ки «Яндекса» при пол­ном сбро­се отка­тыва­ют свою про­шив­ку до началь­ной вер­сии, записан­ной при про­изводс­тве.

Ко­лон­ки «Яндекса» име­ют два режима сбро­са:

  • пол­ный сброс, при котором откат идет до самой началь­ной вер­сии;
  • сброс акка­унта: про­шив­ка оста­ется, но ста­рый акка­унт уда­ляет­ся, и колон­ка готова к новой при­вяз­ке.

Мы будем рас­смат­ривать вто­рой режим по сле­дующе­му пла­ну:

  • Получе­ние root-дос­тупа к устрой­ству.
  • Уда­лен­ное управле­ние через SSH или Tuna.
  • Ска­ниро­вание сетевых интерфей­сов, вклю­чая Bluetooth.
  • Запись аудио с помощью arecord.
  • Перех­ват тра­фика колон­ки через tcpdump, Wireshark или sshdump.
  • Пос­коль­ку YNDX-0025 работа­ет на ядре Linux с некото­рыми фун­кци­ями от Android, пер­вым делом нуж­но получить root-дос­туп к сис­теме.

    Прог­рамма баг­хантин­га «Яндекса» не при­нима­ет отче­ты, где обна­ружен­ные проб­лемы тре­буют физичес­кого вме­шатель­ства в устрой­ство, осо­бен­но пай­ки мик­росхем.

    Но в этот раз я в баг­баун­ти не учас­твую, поэто­му сра­зу орга­низо­вал себе root с помощью переп­рограм­мирова­ния NAND. Для это­го пот­ребу­ется «сдуть» NAND и счи­тать дамп с помощью прог­рамма­тора.

    Пла­та с NAND

    Я работаю с TL866II Plus. Это не самый топовый прог­рамма­тор, но он недоро­гой и помог мне, ког­да я начинал раз­бирать­ся с про­шив­ками «Яндекс Стан­ции». По сути, прог­рамма­тор толь­ко счи­тыва­ет и записы­вает дам­пы, у него нет фун­кции перес­чета ECC или работы с фай­ловыми сис­темами, как, нап­ример, у UFPI. Так что здесь нуж­но нем­ного навыков, что­бы пра­вить дам­пы.

    Сто­ит отдель­но упо­мянуть, что на началь­ном эта­пе про­изводс­тва «Яндекс» не ста­вил пароли на USB-пор­ты сво­их колонок, таких как «Мини 2» (YNDX-0020/21) и «Лайт» (YNDX-0025). Эти колон­ки могут работать как прог­рамма­торы, пос­коль­ку под­держи­вают чте­ние и запись NAND через ути­литу update, кон­тро­лируя бэд‑бло­ки и перес­читывая ECC. Это, конеч­но, удоб­но, но таких устрой­ств сей­час поч­ти не най­ти. Если колон­ка была под­клю­чена к умно­му дому при­мер­но с лета 2024 года, то, ско­рее все­го, на нее уже уста­нов­лен пароль.

     

    Физическое вмешательство

    Под­робнос­ти раз­бора колон­ки я показы­вать не буду, но в сети пол­но виде­оро­ликов, да и сам про­цесс нес­ложный. Преж­де чем отпа­ивать NAND, мы «про­дуем» все нож­ки мик­росхе­мы при помощи флю­са и обыч­ного при­поя. Не пережи­вай, если меж­ду нож­ками оста­нут­ся излишки при­поя, — они не помеша­ют. Это нуж­но, что­бы раз­бавить завод­ской при­пой, который обыч­но более тугоп­лавкий.

    От­паиваем, прог­ревая феном одну полови­ну ножек мик­росхе­мы, и, ког­да при­пой рас­пла­вит­ся, под­дева­ем пин­цетом и акку­рат­но при­под­нима­ем край. То же про­делы­ваем с дру­гой сто­роной. Рекомен­дую исполь­зовать ниж­ний подог­рев пла­ты — это дела­ет про­цесс отпа­ива­ния более ком­фор­тным. Что­бы не пог­нуть нож­ки, убе­дись, что они дос­таточ­но наг­релись, покачи­вая их вверх‑вниз без силь­ного нажима.

    Пос­ле отпа­ива­ния зачисть пла­ту от бугор­ков ста­рого при­поя с помощью мед­ной оплетки и флю­са. Будь акку­ратен и не ста­рай­ся слиш­ком усер­дно, что­бы не сте­реть часть мас­ки дорожек! Мик­росхе­му затем про­моем спир­том и убе­дим­ся, что нож­ки не пог­нуты и меж­ду ними нет остатков при­поя. Затем помеща­ем мик­росхе­му в карет­ку переход­ника прог­рамма­тора и начина­ем счи­тыва­ние.

    Мик­росхе­ма в прог­рамма­торе info

    Сра­зу сде­лай резер­вную копию счи­тан­ного дам­па, что­бы не потерять важ­ные дан­ные для авто­риза­ции в учет­ной записи. Осо­бен­но это каса­ется области с помет­кой AMLSECURITY! и раз­дела NV, где хра­нит­ся файл с обфусци­рован­ным име­нем:

    416D6C4B65796D61737465724D61737465724B657900

    Ес­ли его потерять, добавить устрой­ство в учет­ную запись будет невоз­можно. При­чины я нашел, но метод вос­ста­нов­ления еще пред­сто­ит дорабо­тать.

     

    Правим дамп

    Как и в любом Linux, в фай­ловой сис­теме «Стан­ции» есть пап­ка /etc, в которой мож­но най­ти:

    • shadow;
    • passwd;
    • inittab.

    Shadow

    Passwd

    Прос­мотрев пер­вые два, мож­но обна­ружить, что поль­зователь root сущес­тву­ет и у него нет пароля. В inittab есть стро­ка ини­циали­зации кон­соли, которая отли­чает­ся от стан­дар­тной.

    Inittab

    А имен­но getty_rabbit_hole (Rabbit Hole час­тично обсужда­ли в пре­дыду­щей статье) вмес­то getty. Даль­ше сле­дуем по пред­став­ленно­му пути и изу­чаем содер­жимое.

    info

    По­ка я писал эту статью, на «Хаб­рахаб­ре» вышел пост про похожий флаг, но в дру­гом мес­те и для дру­гой колон­ки («Мини 1»), да и содер­жимое нем­ного дру­гое. Но суть та же.

    Ока­зыва­ется, если попасть в сис­тему через Rabbit Hole, то допол­нитель­но акти­виру­ется воз­можность вой­ти в сис­тему через UART-кон­соль Linux, а не толь­ко CLI U-Boot.

    Воз­вра­щаем­ся в inittab и пра­вим стро­ку getty_rabbit_hole на getty. Для это­го в сыром дам­пе прос­то заменим сим­волы пос­ле getty про­бела­ми, что­бы раз­мер фай­ла не изме­нил­ся и дамп остался на мес­те. Это очень важ­но.

    Да­лее нуж­но перес­читать ECC. Спо­соб перес­чета я пока рас­крыть не могу, но сде­лал Telegram-бота @AmlEcc_bot, который поможет перес­читать ECC для бло­ка раз­мером 512 + 2 бай­та (дан­ные и user bytes). Он при­нима­ет фай­лы в фор­мате bin, которые лег­ко сде­лать с помощью любого Hex-редак­тора или коман­дой dd.

    Ра­бота бота warning

    По­жалуй­ста, не наг­ружай бота слиш­ком боль­шими бло­ками тек­ста, ина­че я его отклю­чу.

    У фай­ловой сис­темы system (rootfs) нет про­вер­ки вро­де vbmeta, так что все изме­нения про­ходят без проб­лем!

    С нас­трой­кой сис­темы закон­чили, теперь нам нуж­но раз­решить кон­соль UART в U-Boot. Флаг silent огра­ничи­вает вывод логов и зап­реща­ет ввод через UART-кон­соль. Этот параметр нас­тра­ивает­ся в скрип­тах U-Boot, называ­емых env (environment), для бло­киров­ки он выг­лядит так: silent=1.

    www

    Под­робнее — в до­кумен­тации U-Boot.

    Лог затыка­ется пос­ле silent=1

    В этом слу­чае, как толь­ко U-Boot счи­тыва­ет эти зна­чения, он перес­тает выводить логи в кон­соль. Скрип­ты env хра­нят­ся в нес­коль­ких копи­ях в дам­пе, поэто­му меня­ем зна­чение на silent=0 и перес­читыва­ем ECC через бота. Поп­равь все копии или поп­робуй оста­вить одну рабочую, испортив осталь­ные. Экспе­римен­тируй!

    Те­перь записы­ваем дамп на NAND и воз­вра­щаем ее на пла­ту колон­ки. Про­веря­ем, что­бы не было никаких «соп­лей», отмы­ваем флюс спир­том. И… нет! Ничего не выходит!

    Все дело в том, что, кро­ме ECC, необ­ходимо счи­тать CRC для env и UBIFS. Это воз­можно, но тре­бует боль­ше уси­лий. Если ты захочешь при­менить этот метод, при­дет­ся самос­тоятель­но перес­читать кон­троль­ные сум­мы. В этом очень помогут Stack Overflow и UBIFS Checksumming. Как толь­ко все изме­нения будут вне­сены, сис­тема запус­тится и выведет под­робный лог заг­рузки.

    По­ломан­ная заг­рузка

    Лог успешно­го стар­та с silent=0

    Старт ядра

    В кон­це лога видим завет­ное…

    login:

    Кста­ти, нас­чет UART — под­клю­чай­ся через переход­ник. Есть уни­вер­саль­ный вари­ант, который под­ходит к нес­коль­ким моделям колонок «Яндекса».

     

    Ура, вошли!

    Па­роля нет, поэто­му прос­то вво­ди root и заходи. Теперь у нас пол­ноцен­ная кон­соль с блек‑дже­ком и Али­сой. Мож­но пошарить­ся по сис­теме, заг­лянуть в пап­ки, стя­нуть кон­фиг ядра с помощью коман­ды cat /proc/config.gz. Но учти, через UART это не очень удоб­но. В про­цес­се копания ты быс­тро най­дешь скрипт /system/vendor/quasar/activate_adb.sh, который акти­виру­ет ADB в Linux (по край­ней мере, очень похоже на Linux)!

    Источник: xakep.ru

    Ответить

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