В кроличьей норе. Штурмуем отладочную консоль «Яндекс Станции»

Содержание статьи

  • U-Boot login
  • Строение загрузчика
  • Пытаемся извлечь U-Boot BL33
  • Сводка LZ4
  • Извлечение
  • Переходим к дизассемблеру
  • Исследуем и ищем
  • Поиск норы
  • Подготовка среды компиляции U-Boot
  • Среда сборки
  • Запускаем Diaphora
  • Теперь уже точно анализ
  • Выводы

Эта статья появи­лась в про­цес­се ревер­са про­шивок «Яндекс Стан­ций». Я про­вел реверс U-Boot про­цес­сора умной колон­ки и соз­дал ути­литу для его извле­чения из рас­шифро­ван­ного заг­рузчи­ка. Спо­соб уни­вер­сален для всех подоб­ных устрой­ств и, воз­можно, дру­гих гад­жетов с чипом Amlogic.

Раз­работан­ный мной метод подой­дет:

  • для «Стан­ции 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.bin.bl2 и u-boot.bin.tpl, оба незашиф­рован­ные. У нас же, к сожале­нию, исполь­зуют­ся зашиф­рован­ные вер­сии.

Рас­шифро­вать их все‑таки воз­можно бла­года­ря извес­тной уяз­вимос­ти.

Она поз­воля­ет рас­шифро­вывать заг­рузоч­ные фай­лы при под­клю­чении через 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.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  

Пытаемся извлечь U-Boot BL33

Пе­ред нами ком­понент BL33, давай поп­робу­ем извлечь его. Готовых решений в сети не наш­лось, поэто­му приш­лось раз­бирать­ся самос­тоятель­но. В качес­тве пер­вого шага — самый прос­той спо­соб: с помощью ути­литы dd отре­заем нуж­ную область фай­ла, а затем про­буем рас­паковать получен­ное архи­вато­ром LZ4.

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

Изу­чение я начал с заголов­ка, попытав­шись опре­делить его фор­мат и получить полез­ные для рас­паков­ки дан­ные. В раз­деле Doc исходни­ков есть опи­сание двух фор­матов:

  • LZ4 Block Format — бло­ки дан­ных;
  • LZ4 Frame Format — заголов­ки дан­ных.

Опи­сания, которые уда­лось най­ти, каса­ются в основном струк­туры дан­ных до и пос­ле сжа­тия, но не содер­жат информа­ции о началь­ном заголов­ке. Тем не менее кое‑что полез­ное все же выяс­нилось: LZ4-рас­паков­ка может работать не толь­ко с фай­лами, но и с буфера­ми, для чего необ­ходимо явно ука­зывать раз­меры до и пос­ле сжа­тия. А зна­чит, эти зна­чения дол­жны где‑то хра­нить­ся.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *