Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
«Они следят за тобой через нее!» — наверняка каждый владелец умной колонки слышал это от кого‑то или даже сам так думает. Производители, конечно, опровергают подобные домыслы, но, даже если они шпионских функций не закладывали, теоретически такая возможность есть. Я решил поставить эксперимент и посмотреть, может ли колонка обернуться шпионом. warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем, нарушение тайны переписки, прослушивание разговоров и чтение переписки граждан без их согласия преследуется по закону.
Отчасти это продолжение прошлой статьи про Rabbit Hole, потому‑то конец норы найдем в системе.
Все опыты я буду делать, как и в прошлой статье, на колонке «Яндекс Лайт» (YNDX-0025), но все точно так же сработает на моделях «Лайт 2», «Мини 2», «Станция 2» и «Мини 3». Опыты провожу с одной оговоркой: в целях безопасности все методы неустойчивы к полному сбросу устройства! То есть достаточно зажать кнопку сброса прошивки при включении, и все изменения сотрутся.
info
На самом деле все колонки «Яндекса» при полном сбросе откатывают свою прошивку до начальной версии, записанной при производстве.
Колонки «Яндекса» имеют два режима сброса:
Мы будем рассматривать второй режим по следующему плану:
Поскольку 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
Просмотрев первые два, можно обнаружить, что пользователь 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