Содержание статьи
Разработанный мной метод подойдет:
- для «Станции Mini2» (YNDX-00020/21);
- «Станции Lite» (YNDX-00025);
- «Станции Max» (YNDX-00053/0008);
- других устройств на Amlogic S905X2 (G12) и A113X (AXG).
В процессе я расскажу о паре интересных плагинов для IDA: с помощью Diaphora мы позаимствуем информацию из схожего опенсорсного проекта, а FindCrypt поможет нам отыскать криптографические константы.
U-Boot login
Кто подключался к UART «Яндекс Станций», тот наверняка встречал надписи «RH challenge» и «RH response». На том загрузка колонки прекращается, девайс нужно перезагрузить или ввести ответ. Запрос всегда разный и является не чем иным, как авторизацией при входе в консоль U-Boot.

Вход в консоль U-Boot происходит прерыванием по какой‑либо клавише, например Enter или Ctrl-C (классический вариант), далее уже может потребоваться авторизация. Поддерживается стандартный тип авторизации — bootstopkeysha256 (по хешу пароля). Отличное описание способов приведено в статье I hack, U-Boot. «Яндекс» пошел немного дальше стандартного варианта и добавил свой способ авторизации, дав ему имя Rabbit Hole. Давай посмотрим, как он устроен.
Для начала нужно получить прошивку устройства — считать ее с помощью программатора или любым другим способом. В качестве примера будем изучать колонку Lite (YNDX-00025). Для извлечения прошивки я использовал утилиту update, разработанную Amlogic для работы со своими загрузчиками через USB. Она подходит для устройств без пароля. Загрузчик состоит из двух частей — BL2 и TPL, что соответствует стандартной структуре U-Boot.
Если ты соберешь U-Boot вручную для чипа A113X, то на выходе получишь два файла: u-boot.
и u-boot.
, оба незашифрованные. У нас же, к сожалению, используются зашифрованные версии.
Расшифровать их все‑таки возможно благодаря известной уязвимости.
Она позволяет расшифровывать загрузочные файлы при подключении через USB-порт без пароля. На колонках Lite, Mini2 и Max пароль по умолчанию отсутствует, хотя со временем «Яндекс» начал устанавливать его удаленно. Мне повезло: платы, с которыми я работаю, пока не защищены. Поэтому я смогу воспользоваться уязвимостью и расшифровать файл TPL, а BL2 для анализа не потребуется.
Строение загрузчика
Для защиты процесса загрузки используется Trusted Firmware с дополнительными элементами, в основном касающимися аппаратных особенностей, добавляемыми производителем процессора. Первым стартует BL1 (Boot ROM), жестко прошитый в процессор с завода, — замене он не подлежит. Следом за ним стартуют другие части:
- BL2 готовит систему к старту;
- BL31, BL32 — защищенная часть для обеспечения безопасности;
- BL33 (U-Boot), который нам и нужен.
Загрузчик начального уровня BL2 нам сейчас неинтересен, а вот TPL содержит остальные уровни загрузки, в том числе BL33 (U-Boot).
У колонок Max с процессором Amlogic S905X2 загрузчик представлен одним файлом — bootloader.
, который включает все этапы загрузки: от начальной инициализации до запуска U-Boot. В моделях на чипах A113X (например, Lite и Mini2) загрузчик разделен на два отдельных файла — с расширениями .bl2 и .tpl.
info
Такое объединение связано с особенностями разметки разделов на устройствах с памятью eMMC. У Max загрузчик хранится в разделе bootloader, тогда как в колонках Lite и Mini2, использующих NAND-память, эти части разделены на два независимых раздела — bootloader (содержит BL2) и TPL.
Каждый этап загрузки в прошивке помечен сигнатурой @AML, за которой следует заголовок со служебной информацией. Изучив несколько файлов загрузчиков, я заметил, что последняя по порядку сигнатура @AML соответствует компоненту BL33. Его отличительная особенность — наличие строки LZ4C, что указывает на использование сжатия алгоритмом LZ4. Еще один косвенный признак сжатия — «рваные» строки в теле файла.


Дополнительное подтверждение я нашел в статье Фредерика Бассе, в которой выполняется упаковка U-Boot через стандартные инструменты Amlogic со сжатием LZ4.
aml_encrypt_g12a --bl3sig --input u-boot.bin --compress lz4 --output u-boot.enc --level v3 --type bl33
Пытаемся извлечь U-Boot BL33
Перед нами компонент BL33, давай попробуем извлечь его. Готовых решений в сети не нашлось, поэтому пришлось разбираться самостоятельно. В качестве первого шага — самый простой способ: с помощью утилиты dd отрезаем нужную область файла, а затем пробуем распаковать полученное архиватором LZ4.

Но нет, данные не подошли, архиватор ругается на испорченный заголовок. Попытки распаковать другими утилитами или дописать заголовок вручную не увенчались успехом, метод не подходит. Но в процессе я заглянул в исходники LZ4, с целью найти возможные способы сжатия и примерить к своим данным.

Изучение я начал с заголовка, попытавшись определить его формат и получить полезные для распаковки данные. В разделе Doc исходников есть описание двух форматов:
- LZ4 Block Format — блоки данных;
- LZ4 Frame Format — заголовки данных.
Описания, которые удалось найти, касаются в основном структуры данных до и после сжатия, но не содержат информации о начальном заголовке. Тем не менее кое‑что полезное все же выяснилось: LZ4-распаковка может работать не только с файлами, но и с буферами, для чего необходимо явно указывать размеры до и после сжатия. А значит, эти значения должны где‑то храниться.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее