Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Эта статья появилась в процессе реверса прошивок «Яндекс Станций». Я провел реверс U-Boot процессора умной колонки и создал утилиту для его извлечения из расшифрованного загрузчика. Способ универсален для всех подобных устройств и, возможно, других гаджетов с чипом Amlogic.
Разработанный мной метод подойдет:
В процессе я расскажу о паре интересных плагинов для IDA: с помощью Diaphora мы позаимствуем информацию из схожего опенсорсного проекта, а FindCrypt поможет нам отыскать криптографические константы.
Кто подключался к 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.bin.bl2
и u-boot.bin.tpl
, оба незашифрованные. У нас же, к сожалению, используются зашифрованные версии.
Расшифровать их все‑таки возможно благодаря известной уязвимости.
Она позволяет расшифровывать загрузочные файлы при подключении через USB-порт без пароля. На колонках Lite, Mini2 и Max пароль по умолчанию отсутствует, хотя со временем «Яндекс» начал устанавливать его удаленно. Мне повезло: платы, с которыми я работаю, пока не защищены. Поэтому я смогу воспользоваться уязвимостью и расшифровать файл TPL, а BL2 для анализа не потребуется.
Для защиты процесса загрузки используется Trusted Firmware с дополнительными элементами, в основном касающимися аппаратных особенностей, добавляемыми производителем процессора. Первым стартует BL1 (Boot ROM), жестко прошитый в процессор с завода, — замене он не подлежит. Следом за ним стартуют другие части:
Загрузчик начального уровня BL2 нам сейчас неинтересен, а вот TPL содержит остальные уровни загрузки, в том числе BL33 (U-Boot).
У колонок Max с процессором Amlogic S905X2 загрузчик представлен одним файлом — bootloader.bin
, который включает все этапы загрузки: от начальной инициализации до запуска 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
Перед нами компонент BL33, давай попробуем извлечь его. Готовых решений в сети не нашлось, поэтому пришлось разбираться самостоятельно. В качестве первого шага — самый простой способ: с помощью утилиты dd отрезаем нужную область файла, а затем пробуем распаковать полученное архиватором LZ4.
Но нет, данные не подошли, архиватор ругается на испорченный заголовок. Попытки распаковать другими утилитами или дописать заголовок вручную не увенчались успехом, метод не подходит. Но в процессе я заглянул в исходники LZ4, с целью найти возможные способы сжатия и примерить к своим данным.
Изучение я начал с заголовка, попытавшись определить его формат и получить полезные для распаковки данные. В разделе Doc исходников есть описание двух форматов:
Описания, которые удалось найти, касаются в основном структуры данных до и после сжатия, но не содержат информации о начальном заголовке. Тем не менее кое‑что полезное все же выяснилось: LZ4-распаковка может работать не только с файлами, но и с буферами, для чего необходимо явно указывать размеры до и после сжатия. А значит, эти значения должны где‑то храниться.
Источник: xakep.ru