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

warning

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

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

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

info

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

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

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

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

  1. Получе­ние root-дос­тупа к устрой­ству.
  2. Уда­лен­ное управле­ние через SSH или Tuna.
  3. Ска­ниро­вание сетевых интерфей­сов, вклю­чая Bluetooth.
  4. Запись аудио с помощью arecord.
  5. Перех­ват тра­фика колон­ки через tcpdump, Wireshark или sshdump.

Пос­коль­ку YNDX-0025 работа­ет на ядре Linux с некото­рыми фун­кци­ями от Android, пер­вым делом нуж­но получить root-дос­туп к сис­теме.

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

Но в этот раз я в баг­баун­ти не учас­твую, поэто­му сра­зу орга­низо­вал себе root с помощью переп­рограм­мирова­ния NAND. Для это­го пот­ребу­ется «сдуть» 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
Shadow
Passwd
Passwd

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

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
Лог затыка­ется пос­ле silent=1

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

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

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

Поломанная загрузка
По­ломан­ная заг­рузка
Лог успешного старта с silent=0
Лог успешно­го стар­та с silent=0
Старт ядра
Старт ядра

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

login:
login:

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

 

Ура, вошли!

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

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    4 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии