Эксплуатация прошивки Android — неподписанная прошивка в SoC Samsung CVE-2020-10831
TL, д-р
Мы объясним, как мы использовали прошивку Android, используя недокументированный API-интерфейс ядра, который был обнаружен в результате обратного проектирования приложения Samsung «Скрытые заводские настройки».
Этот API позволяет прошивать неподписанную прошивку сенсорного экрана Samsung.
CVE затрагивает все серии Samsung S7-S10, использующие чипсет exynos.
Вдохновение
После прочтения нулевого проекта большая статья об использовании прошивки WiFi для получения RCE, я решил, что должен попытаться провести собственное исследование прошивки.
Общий обзор SoC
В наши дни телефоны имеют гораздо больше, чем просто 1 процессор, работающий под управлением ОС Android, что делает их чрезвычайно сложными системами.
В большинстве телефонов Android есть от 10 до 30 разных «компьютеров», каждый со своим процессором, памятью и хранилищем.
Все эти устройства обмениваются данными по различным аппаратным протоколам связи, таким как IPC, I2C и т. д.
Основными процессорами в телефонах Android являются:
AP / Процессор приложений – Это основной ЦП, известный вам по характеристикам телефона, который взаимодействует со всеми остальными процессорами и управляет ими, а также работает под управлением ОС Android.
БП / Процессор основной полосы частот / Радио / Модем – BP отвечает за преобразование всех сотовых данных, полученных от радиоволн, в информацию, используемую программным обеспечением, путем реализации стека LTE.
GPU - Графический процессор отвечает за обработку всех задач, связанных с графикой.
Есть больше блоков обработки, таких как Wi-Fi, Crypto, Camera, Audio и т. д.
Все эти компоненты вместе называются «Система на кристалле» — SoC.
Поиск уязвимой цели
Эксплуатация прошивки Android сложна, поскольку у нас очень мало предварительных знаний об архитектуре прошивки и о том, как ОС взаимодействует с ней.
Следовательно, использование информации от производителя может значительно облегчить исследование.
После поиска в Google упомянутых зацепок многие форумы упоминали о проблеме с сенсорным экраном Samsung и о том, как ее исправить.
Метод был относительно прост:
«Сначала перейдите к скрытым настройкам, написав * # 2663 # в приложении телефона, а затем нажмите «Обновить FW».
Поиск способов связи с прошивкой
Как упоминалось ранее, использовать знания производителя было бы намного проще, чем придумывать все самому.
Запустив strace в Android-приложении, отвечающем за обновление прошивки, можно легко увидеть, что после нажатия кнопки обновления приложение пишет по следующему пути
«/sys/класс/sec/tsp/cmd»
Этот путь является частью механизма sysfs ядра.
sysfs — это псевдофайловая система, предоставляемая ядром Linux, которая экспортирует информацию о связанных драйверах устройств.
Здесь мы можем увидеть, как общаться с ядром из файла cmd:
Написание имени функции, например, «fw_update», а затем параметра «1» приведет к обновлению прошивки сенсорного экрана, используемому в официальном приложении заводских настроек.
Но чтобы полностью понять функционал механизмов обновления прошивки нам нужно скачать ядро и посмотрите на код драйвера устройства.
После изучения исходного кода ядра, обрабатывающего приведенную выше команду, в следующем комментарии была обнаружена очень интересная функциональность.
Видимо, при написании:
«echo -n «обновление_прошивки: 0» > /sys/class/sec/tsp/cmd»
Параметр 0 сообщает ядру, откуда обновлять прошивку.
Как видно из комментария к коду ядра, передача 2 заставит ядро обновить прошивку с UMS (sdcard).
Дальнейший поиск в исходниках ядра покажет требуемый путь:
Процесс эксплуатации
Чтобы проверить, можем ли мы прошить неподписанную / поврежденную прошивку, все, что нам нужно сделать, это попробовать и посмотреть, что произойдет.
(Вообще лучше модифицировать только читаемые человеком строки, такие как сообщение журнала, чтобы не нарушать процесс выполнения программы, к сожалению, я выбрал более глупый путь)
Команда
Результат печатается в журнале ядра (kmsg)
В этой части исследования я не был на 100 процентов уверен, что это сработало, но после попытки щелкнуть на моем личном устройстве и увидеть множество ошибок ввода-вывода в kmsg (вместо простого нажатия), я понял, что просто успешно прошиваю искаженную прошивку сенсорного экрана. , вуала!
Интересное замечание о фаззинге
Когда я нашел API-интерфейс cmd-файла, моей первой мыслью было: «Давайте начнем его и найдем переполнения!»
Но в журнале четко указано, что ввод слишком длинный и удален, чтобы предотвратить переполнение.
Этот патч связан с уязвимость найден тем же исследователем статьи проекта нулевой, который вдохновил меня на исследование.
Хотите услышать больше?
Включена бесплатная консультационная встреча.