Содержание статьи
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)!
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее