Найти в Дзене
mamaich

Яндекс IP камера: Enter to be root

Публикация данной статьи была отложена, так как информация была передана в Яндекс Вug Bounty. На момент публикации в прошивку внесены изменения, так что я рекомендую описанный ниже метод использовать на свежеприобретенном устройстве не выпуская его в Internet для обновления. В конце июня я приобрел Яндекс IP камеру не для видео наблюдения, а просто поиграться. Новое устройство, новая архитектура, очень ограниченные физические размеры и ресурсы, два моторчика - во мне проснулся ребёнок и захотелось ее поломать. В первую очередь я подключил камеру к ПК по USB, но вывод на консоль процесса загрузки u-boot или ядра Linux через UART никак не происходил, даже при установке silent=0 в разделе ENV. Также как в случае с Яндекс Модулем 2, когда я случайно наткнулся на правильный момент его перезагрузки для запуска своего скрипта с USB, на помощь пришел случай - кошка запрыгнула на стол, начала тереться мордой об камеру, и пока я ее отгонял от клавиатуры, я увидел давно ожидаемый мной экран загр

Публикация данной статьи была отложена, так как информация была передана в Яндекс Вug Bounty. На момент публикации в прошивку внесены изменения, так что я рекомендую описанный ниже метод использовать на свежеприобретенном устройстве не выпуская его в Internet для обновления.

В конце июня я приобрел Яндекс IP камеру не для видео наблюдения, а просто поиграться. Новое устройство, новая архитектура, очень ограниченные физические размеры и ресурсы, два моторчика - во мне проснулся ребёнок и захотелось ее поломать.

В первую очередь я подключил камеру к ПК по USB, но вывод на консоль процесса загрузки u-boot или ядра Linux через UART никак не происходил, даже при установке silent=0 в разделе ENV.

Также как в случае с Яндекс Модулем 2, когда я случайно наткнулся на правильный момент его перезагрузки для запуска своего скрипта с USB, на помощь пришел случай - кошка запрыгнула на стол, начала тереться мордой об камеру, и пока я ее отгонял от клавиатуры, я увидел давно ожидаемый мной экран загрузки u-boot и затем Linux:

После этого я начал анализировать свои действия и код u-boot, что же могло привести к такому поведению. И через пару дней нашел.

Если посмотреть в исходниках, то в процессе инициализации u-boot вызывается функция main_loop:

я убрал команды, не попадающие под наши #ifdef
я убрал команды, не попадающие под наши #ifdef

В случае с Яндекс устройствами перед вызовом cli_loop() еще добавлен вызов проверки Rabbit Hole, но сейчас это роли не играет.

Функция autoboot_command выглядит так:

я удалил всё лишнее
я удалил всё лишнее

ее смысл - выполнить команды в переменной 's' если никто не прервал процесс загрузки нажатием спецклавиши (stored_bootdelay у нас не -1). А вот код abortboot* уже интересен:

GD_FLG_SILENT в gd->flags устанавливается в случае установки silent=1 в ENV
GD_FLG_SILENT в gd->flags устанавливается в случае установки silent=1 в ENV

как тут видно, если процесс загрузки пытались прервать - отключается "тихий" режим консоли (GD_FLG_SILENT в gd->flags, он устанавливается в случае silent=1), и, далее этот же бит проверяется функцией fixup_silent_linux (см ее в исходнике, которая очищает параметр "console=" если включен gd->flags & GD_FLG_SILENT).

Собственно, теперь стало понятно, что произошло, когда я прогонял кошку со стола - она наступила лапой на самую объёмную кнопку клавиатуры (Enter) в момент ребута, вызванного ее любопытной мордой, полезшей в провода.

Так что, чтобы получить права root, требуется нажать Enter один или два раза сразу после загрузки IPL_CUST (он грузит u-boot):

времени на нажатие довольно много - больше секунды
времени на нажатие довольно много - больше секунды

Если нажать 3 раза или более - запустится проверка Rabbit Hole, так что Enter надолго зажимать не стоит.

Далее будет загружен Linux. Логин там root, пароля нет.

не забываем сделать dmesg -n 1, так как китайский код сильно гадит на экран
не забываем сделать dmesg -n 1, так как китайский код сильно гадит на экран

Далее - можно уже изнутри операционной системы продолжить исследования устройства. Например, расшифровать загруженное OTA обновление.