Содержание статьи
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 и считать дамп с помощью программатора.

Я работаю с TL866II Plus. Это не самый топовый программатор, но он недорогой и помог мне, когда я начинал разбираться с прошивками «Яндекс Станции». По сути, программатор только считывает и записывает дампы, у него нет функции пересчета ECC или работы с файловыми системами, как, например, у UFPI. Так что здесь нужно немного навыков, чтобы править дампы.
Стоит отдельно упомянуть, что на начальном этапе производства «Яндекс» не ставил пароли на USB-порты своих колонок, таких как «Мини 2» (YNDX-0020/21) и «Лайт» (YNDX-0025). Эти колонки могут работать как программаторы, поскольку поддерживают чтение и запись NAND через утилиту update, контролируя бэд‑блоки и пересчитывая ECC. Это, конечно, удобно, но таких устройств сейчас почти не найти. Если колонка была подключена к умному дому примерно с лета 2024 года, то, скорее всего, на нее уже установлен пароль.
Физическое вмешательство
Подробности разбора колонки я показывать не буду, но в сети полно видеороликов, да и сам процесс несложный. Прежде чем отпаивать NAND, мы «продуем» все ножки микросхемы при помощи флюса и обычного припоя. Не переживай, если между ножками останутся излишки припоя, — они не помешают. Это нужно, чтобы разбавить заводской припой, который обычно более тугоплавкий.
Отпаиваем, прогревая феном одну половину ножек микросхемы, и, когда припой расплавится, поддеваем пинцетом и аккуратно приподнимаем край. То же проделываем с другой стороной. Рекомендую использовать нижний подогрев платы — это делает процесс отпаивания более комфортным. Чтобы не погнуть ножки, убедись, что они достаточно нагрелись, покачивая их вверх‑вниз без сильного нажима.
После отпаивания зачисть плату от бугорков старого припоя с помощью медной оплетки и флюса. Будь аккуратен и не старайся слишком усердно, чтобы не стереть часть маски дорожек! Микросхему затем промоем спиртом и убедимся, что ножки не погнуты и между ними нет остатков припоя. Затем помещаем микросхему в каретку переходника программатора и начинаем считывание.

info
Сразу сделай резервную копию считанного дампа, чтобы не потерять важные данные для авторизации в учетной записи. Особенно это касается области с пометкой AMLSECURITY! и раздела NV, где хранится файл с обфусцированным именем:
416D6C4B65796D61737465724D61737465724B657900
Если его потерять, добавить устройство в учетную запись будет невозможно. Причины я нашел, но метод восстановления еще предстоит доработать.
Правим дамп
Как и в любом Linux, в файловой системе «Станции» есть папка /
, в которой можно найти:
- shadow;
- passwd;
- inittab.


Просмотрев первые два, можно обнаружить, что пользователь root существует и у него нет пароля. В 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.

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

Теперь записываем дамп на NAND и возвращаем ее на плату колонки. Проверяем, чтобы не было никаких «соплей», отмываем флюс спиртом. И... нет! Ничего не выходит!
Все дело в том, что, кроме ECC, необходимо считать CRC для env и UBIFS. Это возможно, но требует больше усилий. Если ты захочешь применить этот метод, придется самостоятельно пересчитать контрольные суммы. В этом очень помогут Stack Overflow и UBIFS Checksumming. Как только все изменения будут внесены, система запустится и выведет подробный лог загрузки.



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

Кстати, насчет UART — подключайся через переходник. Есть универсальный вариант, который подходит к нескольким моделям колонок «Яндекса».
Ура, вошли!
Пароля нет, поэтому просто вводи root
и заходи. Теперь у нас полноценная консоль с блек‑джеком и Алисой. Можно пошариться по системе, заглянуть в папки, стянуть конфиг ядра с помощью команды cat /
. Но учти, через UART это не очень удобно. В процессе копания ты быстро найдешь скрипт /
, который активирует ADB в Linux (по крайней мере, очень похоже на Linux)!
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»