Recovery from boot p что это

Копаем глубже. Как работают механизмы прошивки, рутинга и восстановления Android

Recovery from boot p что это. android skeleton. Recovery from boot p что это фото. Recovery from boot p что это-android skeleton. картинка Recovery from boot p что это. картинка android skeleton

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

Тот, кто когда-либо прошивал свой смартфон или хотя бы разблокировал загрузчик, наверняка имел дело если не с инструментами командной строки, то хотя бы со специальными графическими приложениями для Windows, которые делают всю магию. Но как на самом деле происходит разблокировка загрузчика, установка новой прошивки или сброс до заводских настроек? Что скрыто, так сказать, под капотом?

Aboot, fastboot и tamper-бит

Если не брать в расчет небольшой код инициализации, располагающийся в ROM-памяти устройства и специфичный для каждого чипа, то загрузка Android начинается с aboot. Это стандартный загрузчик устройств на базе Android, разработкой которого занимается сама Google. Задача aboot — выполнить первичную инициализацию железа и передать управление либо коду, расположенному в разделе boot (это ядро Linux), либо, если юзер включил смартфон с зажатой клавишей увеличения (или уменьшения, где как) громкости, в recovery.

Ключевая особенность aboot в том, что это модульный загрузчик и к нему при сборке можно подключать разные сопрограммы, каждая из которых будет исполняться в отдельном потоке (что делает aboot миниатюрной ОС). Одна из таких сопрограмм — fastboot, реализация протокола и механизмов для записи разделов внутренней NAND-памяти. В среде энтузиастов fastboot обычно используется для установки кастомного recovery. Для этого достаточно включить смартфон с зажатыми клавишами управления громкостью (на большинстве смартфонов), затем с их же помощью выбрать в меню пункт Fastboot, подключить смартфон с помощью USB-кабеля к компу и выполнить такую команду (она входит в комплект Android SDK):

Причем recovery можно даже не прошивать, а запустить прямо с компа (эту функцию, кстати, использует инструмент CF-Auto-Root, но о нем позже):

Recovery from boot p что это. 1441612609 dcc7 fastboot. Recovery from boot p что это фото. Recovery from boot p что это-1441612609 dcc7 fastboot. картинка Recovery from boot p что это. картинка 1441612609 dcc7 fastboot Справка по командам fastboot

Xakep #200. Тайная жизнь Windows 10

Однако эти команды не сработают, если загрузчик залочен. Чтобы его разблокировать, на смартфонах линейки Nexus и OnePlus достаточно выполнить такую команду (все, что начинается с oem, — это команды, встроенные производителем смартфона):

Что делает эта команда? В нексусах она выполняет сброс до заводских настроек и записывает один бит в специальный раздел в памяти устройства, служащий индикатором разлочки для самого загрузчика. В Nexus 4 и 5 это раздел misc и адрес 16400, в других нексусах это может быть раздел param (Nexus 10) или даже aboot (Nexus 7/2013 и OnePlus One). Начиная с Nexus 6 и 9, Google навела в этом бардаке порядок и ввела понятие Persistent-раздела для хранения не зависящих от Android настроек. Имя этого раздела хранится в системной переменной ro.frp.pst, и его в любой момент можно получить с помощью такой команды (запускать на самом устройстве):

Как видно, все довольно просто, и, если говорить о нексусах, здесь «залоченный загрузчик» — это просто защита от дурака (собственно, как и должно быть в референсных смартфонах). Загрузчики в обычных смартфонах разработки Samsung, HTC, LG, Motorola и других серьезных контор защищены гораздо лучше, и с помощью команды oem unlock или записи бита по определенному адресу их не вскроешь. Сам бит записывается в недоступную пользователю память, а разблокировка возможна только с помощью цифрового ключа, полученного на сайте производителя (ну или взлома загрузчика, если это возможно).

И в нексусах, и в смартфонах других компаний при разблокировке загрузчика всегда устанавливается так называемый tamper-бит. Сервисные центры смотрят именно на него, решая, признать ли случай гарантийным: даже если впоследствии загрузчик был заблокирован, tamper-бит однозначно свидетельствует о факте разблокировки. Однако иногда этот бит можно сбросить. В нексусах все решается опять же простой записью бита по нужному адресу в нужный раздел, в других смартфонах это либо вообще невозможно сделать, либо приходится использовать специальные инструменты типа приложения Triangle Away (для Samsung’ов без KNOX).

Recovery from boot p что это. 1441612625 ca50 tamper. Recovery from boot p что это фото. Recovery from boot p что это-1441612625 ca50 tamper. картинка Recovery from boot p что это. картинка 1441612625 ca50 tamper Выясняем, установлен ли загрузчиком tamper-бит

Чтобы окончательно тебя запутать, скажу, что производители часто используют модульную архитектуру aboot для встраивания в него собственных средств прошивки и управления, работающих совместно с fastboot или даже вместо него. Наиболее яркий пример — это Odin в смартфонах Samsung. А некоторые производители идут еще дальше и вообще отказываются от aboot, заменяя его собственным или сторонним загрузчиком.

Recovery from boot p что это. 1441612635 6c72 rk. Recovery from boot p что это фото. Recovery from boot p что это-1441612635 6c72 rk. картинка Recovery from boot p что это. картинка 1441612635 6c72 rk Исследуем таблицу разделов планшета на базе Rockchip 3066

С загрузчиками закончим и перейдем к следующему компоненту загрузки.

Раздел boot и ядро

Если во время включения устройства ты не зажимал клавишу увеличения громкости либо не перезагружал смартфон в режим recovery намеренно (например, с помощью расширенного меню перезагрузки в кастомных прошивках), на последнем этапе своей работы aboot загружает в память устройства ядро Linux и RAM-диск из раздела boot, а после этого передает управление ядру.

Благодаря простой структуре образ раздела boot (boot.img) довольно легко распаковать. Это можно сделать даже с помощью HEX-редактора, но проще воспользоваться инструментом imgtool. Пример для Linux (x86_64):

Запакованные ядро и RAM-диск окажутся в каталоге extracted, а содержимое RAM-диска — в подкаталоге ramdisk_ext. Это в идеале. На самом деле, как и в случае с загрузчиком, никакого стандарта для формата раздела boot нет, и производитель может проявить фантазию. Нередко ядро и RAM-диск располагаются на разных разделах. Такую конфигурацию можно найти в старых моделях Samsung и устройствах на базе Rockchip.

Тем не менее в 95% формат раздела boot стандартный, и если ты когда-либо прошивал на свой аппарат кастомное ядро, то наверняка внутри ZIP-архива с ядром был именно образ boot.img, так что вместе с ядром ты прошивал также и RAM-диск. Когда ты это делал, тебе приходилось быть осторожным, ведь RAM-диск стоковой прошивки отличается от RAM-диска того же CyanogenMod. Прошив ядро для AOSP в CyanogenMod, ты мог получить bootloop и много других неприятностей.

Чтобы обойти эту проблему, разработчик CyanogenMod и автор ClockworkMod Recovery Кушик Дутта (Koushik Dutta, или Koush) создал систему AnyKernel, которая позволяет устанавливать ядра отдельно от RAM-диска (путем пересборки раздела boot на лету). Сегодня ее используют многие разработчики кастомных ядер, но далеко не все. Так что перед прошивкой ядра рекомендую либо найти его версию для того кастома, который установлен у тебя, либо убедиться, что оно использует механизм AnyKernel.

Какое бы ядро ты ни выбрал, тебе в любом случае понадобится кастомный recovery для его установки.

Recovery, Edify и Aroma Installer

Обнаружив зажатую клавишу увеличения громкости, aboot делает почти то же самое, что и при обычной загрузке, но использует вместо boot раздел recovery. Разделы идентичны по своему формату и зачастую включают в себя одно и то же ядро, однако содержимое RAM-диска существенно отличается. Если в случае с разделом boot назначение RAM-диска — создать начальные условия для дальнейшей загрузки системы, то recovery — это мини-ОС, способная работать обособленно.

Кастомные recovery намного сложнее. Это уже не просто меню с фоновым рисунком, но целая операционная система, способная устанавливать какие угодно прошивки, делать бэкап, форматировать разделы и многое другое. Современные версии TWRP так и вообще поддерживают управление с помощью тач-интерфейса, сменные шкурки, полностью изменяющие внешний вид recovery, пароль для входа и эмулятор терминала вместе с экранной клавиатурой. Плюс ко всему кастомные recovery включают в себя BusyBox (набор утилит командной строки Linux) и сервер ADB, работающий с правами root. Так что режим recovery очень удобно использовать для отладки и таких операций, как, скажем, дамп разделов. Например, раздела boot (пример для чипов Qualcomm):

Но главная задача recovery — это, конечно же, установка прошивок. Точнее, она была бы главной задачей, если бы в recovery была такая функция. На самом деле все, что делает recovery, когда ты нажимаешь «Install ZIP. » и выбираешь прошивку, — распаковывает ZIP-файл (обычно в раздел cache) и запускает файл /META-INF/com/google/android/update-binary внутри него. Именно update-binary выполняет установку прошивки, руководствуясь инструкциями из файла updater-script (он лежит рядом).

Сами инструкции написаны на языке Edify, включающем в себя набор команд, которые могут понадобиться при установке: mount, unmount, package_extract_file, symlink, run_program и другие. Мы не будем обсуждать здесь все эти команды, они достаточно просты, и, чтобы ознакомиться с ними, достаточно распаковать любую прошивку и открыть updater-script в текстовом редакторе. Скажу лишь, что обычно такие файлы генерируются автоматически при сборке системы из исходников и только авторы узкоспециализированных прошивок (содержащих только ядро, например) пишут их самостоятельно.

Recovery from boot p что это. 1441612749 00f4 dd. Recovery from boot p что это фото. Recovery from boot p что это-1441612749 00f4 dd. картинка Recovery from boot p что это. картинка 1441612749 00f4 dd Фрагмент updater-script из CyanogenMod 12.1

Recovery не накладывает никаких ограничений на файл update-binary — главное, чтобы его можно было запустить. Это дает производителям возможность использовать вместо него любое приложение, способное запуститься поверх ядра Linux. Совсем не обязательно, чтобы оно вообще выполняло установку прошивки. В рамках проекта Aroma Installer развивается вариант update-binary, который позволяет создателям кастомных прошивок реализовать графический инсталлятор с выбором тех или иных вариантов и опций установки.

Автор Aroma Installer также создал Aroma Filemanager — полноценный менеджер файлов со встроенным эмулятором терминала. Чтобы его запустить, необходимо перезагрузиться в recovery и «прошить» ZIP-файл. Естественно, никакая прошивка выполнена не будет, ведь update-binary внутри ZIP-файла — это только файловый менеджер, он не выполняет никаких операций установки.

Recovery from boot p что это. 1441612758 a7bc aromafm. Recovery from boot p что это фото. Recovery from boot p что это-1441612758 a7bc aromafm. картинка Recovery from boot p что это. картинка 1441612758 a7bc aromafm Эмулятор терминала, встроенный в Aroma Filemanager

«Фиктивный» update-binary часто используется для распространения разного рода скриптов. Гораздо проще переименовать скрипт в update-binary, запаковать в ZIP-файл и попросить человека «прошить» его, чем объяснять, как запускать скрипты с помощью ADB. Именно так поступил osm0sis со своим скриптом разблокировки загрузчика аппаратов линейки Nexus. Если ты скачаешь его ZIP-файл и взглянешь внутрь, то найдешь updater-binary, внутри которого обычный sh-скрипт.

Root insecure adb

Чтобы иметь возможность выполнять операции с правами root (например, устанавливать софт или управлять сервисами), можно использовать разные приложения (команды), одна из которых носит имя su. Она позволяет получить права root или любого другого пользователя в системе, пароль которого тебе известен. И все благодаря специальному SUID-биту, который позволяет su работать с правами root, даже если оно было запущено обычным пользователем.

В Android с правами root работает исключительно сама система (и то далеко не вся), тогда как сервер ADB и приложения исполняются с правами непривилегированных пользователей (по одному пользователю Linux на каждое приложение, серьезно), а команды su нет вообще. Поэтому единственный способ получить права root в такой ситуации — воспользоваться уязвимостью в одном из системных компонентов, работающих с правами root. Таким образом можно не просто временно заполучить права root, но и использовать их, чтобы разместить в системе бинарник su (скопировать в /system/xbin, например) и поставить на него SETUID-бит. Именно так работают все наиболее популярные инструменты рутинга, от Super One Click до framaroot.

Второй вариант — прошить бинарник su с помощью кастомной консоли восстановления. Известный Android-разработчик Chainfire уже много лет занимается разработкой и поддержкой инструмента для управления root-доступом SuperSU, а также ZIP-архива, прошив который, ты получишь рутованный смартфон (при установке он копирует в систему su и приложение SuperSU.apk ). Кстати, инструменты типа Framaroot вместе с бинарником su также устанавливают SuperSU или его аналог SuperUser, чтобы пользователь мог управлять тем, каким приложениям следует давать права root, а каким нет.

Recovery from boot p что это. 1441612782 3606 supersu. Recovery from boot p что это фото. Recovery from boot p что это-1441612782 3606 supersu. картинка Recovery from boot p что это. картинка 1441612782 3606 supersu SuperSU собственной персоной

Есть у Chainfire и другой интересный проект — CF-Auto-Root. Он тоже устанавливает в систему su и SuperSU, но делает это весьма оригинальным способом: без задействования recovery. Инструмент CF-Auto-Root существует в двух вариантах, для Odin и для fastboot, причем в последнем случае он представляет собой модифицированную версию recovery, которую не надо прошивать. Ее следует запускать с помощью описанной в начале статьи команды fastboot boot. Пример для Nexus 4:

Подавляющему большинству пользователей root уровня ядра никогда не понадобится. Однако его могут использовать некоторые скрипты и графические инструменты, работающие со смартфоном по ADB (яркий пример: PatchROM от MIUI). В CyanogenMod и многих других кастомных прошивках по умолчанию доступны все виды root (их можно выбрать в «Настройках для разработчиков»). Для получения root уровня ядра в других прошивках можно использовать приложение adbd Insecure за авторством все того же Chainfire.

Recovery from boot p что это. 1441612797 1404 adb ins. Recovery from boot p что это фото. Recovery from boot p что это-1441612797 1404 adb ins. картинка Recovery from boot p что это. картинка 1441612797 1404 adb ins Adbd Insecure и стоковая прошивка HTC

Выводы

Надеюсь, эта статья помогла тебе разобраться в том, как работают механизмы разблокировки, прошивки и восстановления Android. В целом в этом нет ничего сложного, и, поняв, как именно все это работает, ты избежишь многих проблем, связанных с разблокировкой и перепрошивкой устройства. И даже если они возникнут — теперь ты сможешь их решить без посторонней помощи.

Recovery from boot p что это. Evgenij Zobnin 1. Recovery from boot p что это фото. Recovery from boot p что это-Evgenij Zobnin 1. картинка Recovery from boot p что это. картинка Evgenij Zobnin 1

Евгений Зобнин

Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.

Источник

Мобильные устройства изнутри. Исследование режимов загрузки планшета YB1-X90L

1. Введение

Давайте продолжим рассматривать планшет YB1-X90L, который я начал исследовать в предыдущей публикации:

Recovery from boot p что это. rj6r7mwbp6a4zekr38s 2t5cc8a. Recovery from boot p что это фото. Recovery from boot p что это-rj6r7mwbp6a4zekr38s 2t5cc8a. картинка Recovery from boot p что это. картинка rj6r7mwbp6a4zekr38s 2t5cc8a
Рис.1. Общий вид планшета

Поиск в Google выдал, что планшет создан на процессоре Intel Atom x5-Z8550, имеющем 4 ядра [1,2]. Для пользователя, как всегда, имеются 2 внешних элемента управления стандартного назначения:

2. Режимы загрузки планшета

2.1. Режим BOOT (загрузка ОС)

Этот режим используется чаще всего, т.к. позволяет загрузить планшет для работы обычного пользователя. При этом производится стандартная загрузка прошивки МУ: BOOTLOADER->BOOT->SYSTEM.

Для загрузки в этот режим нужно нажать на выключенном планшете кнопку включения питания Power и подержать ее до появления звукового сигнала (примерно 1 сек). Через 3-5 сек на экране появится логотип фирмы производителя:

Recovery from boot p что это. image loader. Recovery from boot p что это фото. Recovery from boot p что это-image loader. картинка Recovery from boot p что это. картинка image loader
Рис.2. Логотип lenovo

Дальнейшие Ваши действия обусловлены только желаниями и фантазией как пользователя.

Перейдем к следующему режиму.

2.2. Режим FASTBOOT

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

Для входа в него на выключенном планшете нужно зажать кнопку увеличения громкости Vol+ и следом нажать кнопку включения питания Power. Подержите их вместе до появления звукового сигнала. Затем кнопку питания можно отпустить (это примерно 1 сек после начала загрузки), но продолжать держать нажатой кнопку Vol+ до появления на экране логотипа фирмы производителя (примерно еще 3-5 сек). Через несколько секунд после появления логотипа производителя появится окно с надписью FASTBOOT MODE, в котором можно выбрать один из режимов работы, указанных в окне выбора, выделенным на рис.3 желтой линией:

Recovery from boot p что это. image loader. Recovery from boot p что это фото. Recovery from boot p что это-image loader. картинка Recovery from boot p что это. картинка image loader
Рис.3. Режимы работы из FASTBOOT

Это окно дополнительно выводит также некоторую служебную информацию: серийный номер, состояние блокировки загрузчика, состояние режима защиты и др. Из этого режима можно выполнить любую fastboot-команду самостоятельно. Если планшет, находящийся в этом режиме, подключить к ПК, то используя любой терминал можно, например, совершить прошивку планшета или какого-либо одного раздела, снять или установить блокировку загрузчика и т.д.

Если изменить состояние окна выбора, то можно выполнить следующие команды:

Давайте рассмотрим каждый из режимов по отдельности.

2.2.1. Режим RECOVERY MODE

При выборе этой команды планшет загрузится в режим восстановления, т.е. RECOVERY. Доступность по ADB и наличие ROOT-доступа в этом режиме обусловливается только настройками самого режима восстановления. Стоковый вариант не богат на возможности, поэтому многие пользователи в качестве recovery устанавливают custom-recovery, например TWRP.

2.2.2. Режим REBOOT

При выборе этой команды произойдет полная перезагрузка планшета в режим загрузки ОС, аналогично режиму BOOT (см. п.2.1).

2.2.3. Режим RESTART BOOTLOADER

При выборе этой команды произойдет перезагрузка опять в режим BOOTLOADER.

2.2.4. Режим POWER OFF

При выборе этой команды произойдет полное выключение питания планшета.

2.2.5. Режим NORMAL BOOT

При выборе этой команды продолжится загрузка ОС без перезагрузки.

2.3. Загрузка в режим TEST

Для входа в режим тестирования на выключенном планшете зажмите кнопку уменьшения громкости Vol- и нажмите кнопку включения питания Power. Подержите их до появления звукового сигнала. Затем кнопку питания можете отпустить (это примерно 1 сек от начала загрузки), но продолжать держать нажатой кнопку Vol- до появления на экране логотипа фирмы производителя (примерно еще 3-5 сек). До полной загрузки в режим TEST пройдет еще, примерно, 5 сек.:

Recovery from boot p что это. image loader. Recovery from boot p что это фото. Recovery from boot p что это-image loader. картинка Recovery from boot p что это. картинка image loader
Рис.4. Меню команд TEST

В этом режиме возможно выполнение следующих команд тестирования:

Чтобы выйти из этого режима выполните команду Reboot — произойдет загрузка ОС, или зажмите кнопку Power примерно на 10 сек. до полного выключения.

2.4. Загрузка в режим DNX FASTBOOT

Этот режим предназначен для восстановления загрузчиков планшета.

Для входа в этот режим на выключенном планшете зажмите одновременно обе кнопки качельки управления громкостью Vol+ и Vol- и нажмите кнопку включения питания Power. Подержите их до появления звукового сигнала. Затем кнопку питания можете отпустить (это примерно 1 сек от начала загрузки), но продолжать держать нажатыми кнопки Vol+ и Vol- до появления на экране логотипа фирмы производителя (примерно еще 3-5 сек). На экране под логотипом появится надпись DNX FASTBOOT MODE:

Recovery from boot p что это. image loader. Recovery from boot p что это фото. Recovery from boot p что это-image loader. картинка Recovery from boot p что это. картинка image loader
Рис.5 DNX режим

и планшет зависнет, ожидая ввода команд для работы с DNX.

Выйти из этого режима можно только через выключение планшета, т.е. зажав кнопку POWER на 5-10 сек.

3. Заключение

Мы изучили режимы загрузки и разметку памяти планшета, в следующей публикации продолжим выполнение практических действий и попробуем, например, разблокировать загрузчик, чтобы установить custom-recovery и получить ROOT-доступ.

Источник

Ломаем Android. Как глубока кроличья нора?

Recovery from boot p что это. 8OYhX. Recovery from boot p что это фото. Recovery from boot p что это-8OYhX. картинка Recovery from boot p что это. картинка 8OYhX

Мой первый Android телефон Galaxy Note N7000 был приобретен сразу после анонса в октябре 2011 года. Благодаря одному немецкому умельцу под ником bauner, у меня была возможность использовать последнюю версию CyanogenMod (ныне LineageOS). До тех пор, пока полтора года назад телефон не умер от китайской автомобильной зарядки.

Замену искал долго и остановился на Kyocera (да, они и телефоны выпускают) KC-S701. Он отличается брутальным внешним видом и отсутствием сенсорных кнопок. О root доступе к телефону я тогда даже и не задумывался, полагая, что нынче каждый телефон тем или иным способом имеет возможность получения root. И найдется умелец, который сможет под него портировать CyanogenMod. Я ошибался.

За полтора года было выпущено всего одно обновление — фикс падения ядра от специально сформированного ping пакета. А Android KitKat уже год назад был не первой свежести. Root доступ на этот телефон так никто и не получил, и никакой информации о нем не было. Отмечу, что тоже самое железо используется в американской версии телефона Kyocera Brigadier E6782, в котором по-умолчанию активизирован режим fastboot и нет ограничения на запуск неподписанных ядер (именно запуск, а не прошивку, и только при использовании непропатченного bootloader’а, CVE-2014-4325) и присутствует возможность загружаться в эти режимы путём зажатия кнопок телефона. Стараниями Verizon (а может Kyocera?) версия Android на Brigadier была обновлена до Lollipop.

Итак, я решил разобраться с процессом получения root на Android самостоятельно.

Два месяца назад я ничего не знал об устройстве Android (а сейчас я еще больше не знаю). Большую часть знаний пришлось добывать изучением исходных кодов и экспериментами, т.к. информации о взломе Android в интернете очень мало. Последующее описание справедливо для Android 4.4 KitKat, но не исключено, что оно заработает и на более новых версиях.

Хочу обратить ваше внимание на то, что в данном обзоре описан исключительно мой конкретный опыт взлома Android на конкретной модели телефона, поэтому будьте предельно осторожны с его применением в своей практике, если не хотите внезапно получить мертвый телефон. Перед началом исследований я рекомендую забыть о том, что вы пользуетесь взламываемым телефоном в повседневной жизни и сделать backup с последующим hard reset. Это обезопасит ваши данные при совершении ошибки.

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

Все исследования проводились в Linux окружении.

Dirtycow (CVE-2016-5195)

Простыми словами dirtycow (рабочий эксплойт под Android) позволяет заменить память любого процесса (полезно, если хорошо знаешь ASM) или любой доступный для чтения файл, даже если он находится на readonly файловой системе. Желательно, чтобы подменяемый файл был меньше либо равен по размеру заменяемому. Основная атака в dirtycow для Android — подмена /system/bin/run-as — подобие sudo для отладки приложений. Начиная с API android-19 (таблица соответствия версий API и Android) /system/bin/run-as имеет CAP_SETUID и CAP_SETGID capabilities флаги (в старых версиях используется обычный suid bit — 6755).

Если файловая система будет примонтирована в режиме read-write, то всё, что dirtycow подменяет, окажется на файловой системе. Потому необходимо сделать backup оригинального файла и восстановить его после получения доступа, либо не перемонтировать файловую систему в режиме read-write. Как правило раздел /system в Android по умолчанию примонтирован в режиме read-only.

Не зря dirtycow считается одной из серьезнейших уязвимостей, обнаруженных в Linux. И при наличии знаний с помощью dirtycow можно обойти все уровни защиты ядра, в том числе и SELinux.

SELinux

adbd и консоль

Получаем root доступ

root, да не тот

Первым делом я сделал дамп всей прошивки, boot и recovery:

Перезагружаюсь в обычный режим, запускаю эксплойт, проверяю hash recovery раздела — hash соответствует оригинальному. Пробую записать данные опять — hash поменялся! Вспоминаю про page cache, чищу ( echo 3 > /proc/sys/vm/drop_caches ) — hash старый. Т.е. всё, что я пишу в блочное устройство улетает без ошибок в /dev/null и иногда оседает в Linux cache. Но обновление прошивки ведь как-то происходит? И пользовательские данные как-то записываются во внутреннюю память. Надо копать дальше.

Пробуем отключить SELinux

На тот момент я думал, что все ошибки об отсутствии привилегий вызваны SELinux (я полностью забыл о том, что могут быть урезаны capabilities). Логов dmesg я не видел, logcat ничего релевантного не показывал. И я начал думать как отключить SELinux.

Первая зацепка, которую я смог найти:

Т.е. я при помощи dirtycow могу перезаписать /sepolicy и командой setprop selinux.reload_policy 1 загрузить обновленную политику.

В моём случае /sepolicy содержал только allow, что значит — при enforcing режиме SELinux в Android разрешено делать только то, что объявлено в политике. А процессу init разрешалось только загружать политику, но не отключать:

Моей задачей было — разрешить init контексту задать selinux->enforce в permissive (setenforce 0).

Первая же мысль: стоковая политика не подходит этому телефону и он при отсутствии прав начинает тупить.

Я собрал новую политику, в которой просто описал все существующие SELinux context и объявил их permissive. Тоже не помогло.

Потом я решил пересобрать политику и по возможности добавить привилегии для shell контекста.

Чуть позже я нашел утилиту sepolicy-inject, которая добавляет привилегии в уже скомпилированный sepolicy файл. Если правило уже существует, то добавление максимальных привилегий не увеличивает конечный размер политики. К сожалению запуск утилиты добавляет всего одно правило за раз. Написал скрипт, который добавляет максимальные привилегии для каждого правила. Результатом был файл с политикой, в которой каждое правило содержало максимальные привилегии. Размер файла совпадал с оригинальным. И это опять не помогло.

Можно было добавить любой permissive домен, загрузить новую политику и работать в контексте этого домена (кстати, supersu от chainfire для новых версий Android так и работает). Но даже это не дало возможности отключить SELinux. Я решил копать в другом направлении.

Копаем recovery

Recovery from boot p что это. image loader. Recovery from boot p что это фото. Recovery from boot p что это-image loader. картинка Recovery from boot p что это. картинка image loader

Выясняю, что initramfs содержит публичный ключ res/keys в формате minicrypt, которым проверяется цифровая подпись ZIP файла. Оказалось это стандартный тестовый ключ Android, и что я могу подписать этим ключём любой архив. Проверить это можно следующим образом:

Моя 64Gb флэшка была отформатирована в exfat. Нашел старую sdcard на 2Gb, отформатировал её как vfat, записал ZIP, вставил её в телефон. Recovery в этот раз смог примонтировать карточку и я мог просматривать её содержимое на телефоне. Однако при установке ZIP опять возникла ошибка: E:failed to set up expected mounts for install; aborting.

Т.е. перед тем как применить ZIP, recovery отмонтирует все разделы, но в моём случае что-то идёт не так.

Копаем исходники ядра

Лицензия GPL обязывает производителей смартфонов выкладывать исходники ядра. Спасибо Линусу и Столлману за это. Иногда производители выкладывают что-то левое, иногда правильные исходники, но без defconfig файла, иногда правильные и очень редко с инструкцией как их собирать (например LG).

В моём случае были исходники с правильным defconfig но без инструкции. Немного попотев я смог собрать ядро и убедился, что это не полная липа.

Через продолжительное время я остановился на двух файлах:

hooks

restart

Тоже интересный для изучения файл. В нем описываются возможные варианты загрузки телефона:

Немного о том, как происходит загрузка на телефонах с процессором Qualcomm:

Встроенный ROM загрузчик Qualcomm (pbl — primary bootloader) загружает раздел sbl1 (secondary bootloader). sbl1 загружает tz (trust zone), затем aboot (android boot, little kernel, lk). Aboot в свою очередь загружает boot, recovery или fota.

Описание разделов, участвующих при загрузке:

Все эти разделы подписаны цепочкой сертификатов.

В некоторых случаях полезно игнорировать обновления прошивки.

На мой телефон имелось обновление. Отважиться на него я мог потому, что я уже имел возможность писать в /cache и прервать обновление в любой момент.

Изучив исходники отвечающего за обновление Java приложения, мне стало ясно как оно происходит:

Перезагрузка происходит не моментально, значит у меня есть возможность удалить файл перед перезагрузкой и посмотреть что происходит с разделом fotamng.

Начинаю изучать данные, которые сдампил. В разделе /cache бонусом получаю логи fota, в которых даже есть логи dmseg! Сама перезагрузка в fota инициализируется байтами «1» в разделе fotamng:

После перезагрузки они обнуляются. В dmesg я обратил внимание на наличие параметра ядра kcdroidboot.mode=f-ksg. Вот оно! Т.е. загрузчик снимает защиту для fota. И чисто теоретически, если я запишу раздел boot в fota и перезагружу телефон в этот режим, то я получу ядро с отключенной защитой Kyocera. Но писать в системные разделы я всё еще не могу.

Изучение исходников little kernel (lk)

То, что находится в разделе aboot — загрузчик Android, ванильные исходники которого находятся по адресу: https://source.codeaurora.org/quic/la/kernel/lk/

Там можно найти и информацию как происходит загрузка в некоторые из режимов. Например я нашел информацию о том, что если в раздел misc записать «boot-recovery», то перезагрузиться в recovery можно без adb reboot recovery. При загрузке в recovery эта метка обнуляется. И если recovery загрузиться не может, то телефон попадёт в boot loop и вы его потеряете. Так что будьте осторожны, а лучше избегайте этого варианта перезагрузки.

Первые успехи

dmesg

uevent_helper

Патченный adbd

Recovery from boot p что это. image loader. Recovery from boot p что это фото. Recovery from boot p что это-image loader. картинка Recovery from boot p что это. картинка image loader

WiFi в моем телефоне работает через модуль ядра. WiFi включен — модуль загружен. WiFi выключен — модуль выгружен. Если подменить модуль на свой, то при включении WiFi должен загрузиться подставной модуль. На моё счастье цифровая подпись модулей не проверялась. Первое, что я попробовал, это собрать и загрузить модуль, который отключает SELinux путем замены памяти ядра на Amazon Fire Phone: https://github.com/chaosmaster/ford_selinux_permissive

Если при загрузке модуля ядро будет ругаться (disagrees about version of symbol module_layout), то потребуется извлечь Module.symvers из boot раздела. Это можно сделать, используя скрипт https://github.com/glandium/extract-symvers:

Нельзя просто так взять и собрать свой модуль для телефона Kyocera.

Recovery from boot p что это. 4410570f50904b67afab8278a6145e19. Recovery from boot p что это фото. Recovery from boot p что это-4410570f50904b67afab8278a6145e19. картинка Recovery from boot p что это. картинка 4410570f50904b67afab8278a6145e19

Помните список доступных для загрузки модулей? Модуль должен называться wlan и никак иначе. Решается это просто:

Модуль на удивление загрузился (память, которую занимает модуль wlan сократилась, проверяется командой lsmod), но SELinux не отключился.

Единственное, что я не уяснил, как программно вызвать отключение и включение WiFi. Мне приходится выключать/включать WiFi вручную через интерфейс Android.

Пишем свой модуль

Снимаем защиту

SELinux отключить не удалось, но по аналогии с модулем https://github.com/chaosmaster/ford_selinux_permissive можно попробовать сделать тоже самое, но с Kyocera hooks. Мне нужно лишь задать переменную kc_bootmode или kc_kbfm в единицу.

Получив адрес нужной функции, я мог передать в неё параметр и функция задаст переменную в 1. Опытным путем выяснил, что не все ядра отображают kallsyms для переменных (тип d или D, регистр говорит глобальная переменная или нет), поэтому в примерах я использую указатели на функции. Возможно это определяется опцией CONFIG_KALLSYMS_ALL при компиляции ядра.

Описываю функцию в модуле:

Можно адреса найти динамически:

Загрузка подставного модуля отключила встроенную защиту! Теперь я могу монтировать /system и загружать любой модуль ядра независимо от его имени.

Системная область emmc всё еще доступна только для чтения и не позволяет редактировать /system раздел на постоянной основе. Файлы редактируются, но при очистке cache все возвращается в исходное состояние.

Всё-таки отключаем SELinux

Это делается вызовом функции reset_security_ops :

После этого защита SELinux работать не будет, но система всё еще будет думать, что она включена. Потому возможны некоторые ошибки в работе системы.

Перезагружаемся в download mode

Пришлось ограничить скорость записи, иначе телефон отваливается и запись прекращается. Возможно это результат переполнения кэша mass storage загрузчика. Пришлось написать хак:

При помощи этого же способа я примонтировал /system раздел к компьютеру и вручную записал на него supersu. Первоначальная задача выполнена: перманентный root доступ получен. Осталось автоматизировать загрузку подставного WiFi модуля, который отключает hooks. И хорошо бы, чтобы WiFi после этого оставался работоспособным. А еще лучше разблокировать загрузчик, чтобы загружать своё ядро.

Для начала можно изучить какие средства применялись для разблокировки других телефонов. При беглом поиске я обнаружил лишь следующие два, к тому же устаревшие:

Цифровая подпись aboot и boot разделов

В качестве эксперимента я попробовал записать boot раздел в раздел fota, зная, что при загрузке fota снимаются все ограничения. Здесь я сильно рисковал, т.к. мог получить bootloop, похожий на bootloop recovery. Метка загрузки в fota записывается в раздел fotamng и если раздел не загрузится, то я получу бесконечную перезагрузку.

К сожалению, boot раздел, записанный в fota не загрузился, а bootloop я, к счастью, не получил. Не понятно почему тогда boot раздел, записанный в recovery успешно загрузился. Толку от этого конечно нет, для recovery используется та же защита, что и для boot. Не знаю чем вызвано подобное поведение. Возможно различными смещениями ramdisk и tags:

В Secure boot whitepaper от Qualcomm говорится о том, что подписывается sha256 hash от sha256 hash’ей нескольких сегментов ELF загрузчика. Количество сегментов определено в Subject’е сертификата. Например OU=05 00002000 SW_SIZE говорит о том, что в подписи содержится sha256 hash от первых 256 hash’ей областей по 32 байта (0x2000/32=256). Сам по себе aboot не содержит ELF заголовка и описание больше подходит к sbl1 (secondary boot loader).

Есть описание работы little kernel от Qualcomm, но и там нет ничего про алгоритм создания подписи aboot. Задача определить алгоритм все еще актуальна.

Эксперименты с загрузчиками

Для проведения экспериментов я заказал из штатов за символическую сумму Kyocera Brigadier с разбитым экраном.

Я проверил цифровые подписи aboot загрузчиков. Subject’ы сертификатов оказались идентичными, следовательно они могут быть взаимозаменяемыми. Решился на эксперимент: прошить aboot от KC-S701 в Brigadier. Загрузчик заработал. На удивление, защита emmc от записи с этим загрузчиком не включилась и я смог спокойно восстановить загрузчик от Brigadier. Понимая все риски, я решил прошить загрузчик от Brigadier на KC-S701. Я бы получил возможность загружать любое неподписанное ядро и использовать fastboot. В этот раз телефон не загрузился.

То, что еще требует работы или выяснить не удалось

Загрузка Fota

Почему boot раздел не грузится из раздела fota? Ведь они подписаны одним ключём. Если бы загрузка произошла, то я бы получил разлоченный телефон, в котором не пришлось бы подменять модули.

Расшифровка Kyocera properties

Kyocera наряду с android system properties использует свой внутренний механизм properties, который мне тоже не удалось выяснить. Наверняка там хранятся интересные опции, которые могут влиять в том числе и на снятие защиты bootloader’а. В телефоне есть библиотека libkcjprop_jni.so и демон kcjprop_daemon. Библиотеку можно подключить и использовать её функции, но у меня пока не нашлось времени этого сделать.

Опции пишутся на файловую систему, внутри бинарные данные:

Kexec

Kexec позволяет из ядра Linux загрузить другое ядро. По умолчанию в production релизах ядер отключают поддержку Kexec, но его можно включить через модуль ядра. Затем из user-end можно загрузить любое ядро, которое заменит текущее. Это выглядит как хак, но если хочется загружать своё ядро — этот вариант имеет своё место под солнцем.

Уязвимость в QSEE

QSEE — защита в процессорах Qualcomm, в которой недавно уже достаточно давно обнаружили уязвимость. Суть уязвимости — полный доступ к выполнению команд на уровне Trust Zone. Вплоть до загрузки любого ядра.

Пока еще разбираюсь в этом вопросе. Насколько я понял мне необходимо получить доступ к области emmc, называющейся RPMB. Этого можно добиться отправкой специально сформированной SCM командой. В области RPMB (Replay Protected Memory Block) содержатся биты, которые отвечают за lock/unlock статус.

Заключение

Recovery from boot p что это. img 20150218172850 120. Recovery from boot p что это фото. Recovery from boot p что это-img 20150218172850 120. картинка Recovery from boot p что это. картинка img 20150218172850 120

Код модулей, aboot загрузчики и библиотека для работы с Kyocera Propertiies находятся в моём репозитории на github: https://github.com/kayrus/break_free.

С каждым решением очередной проблемы, процесс всё больше напоминает апорию об Ахиллесе и черепахе. Не знаю на сколько еще хватит моего энтузиазма. Возможно здесь есть знающие люди, которые помогут достичь дна кроличьей норы.

Пользуясь случаем, выражаю благодарность разработчикам из компании Kyocera за прекрасные устройства и их защиту. В противном случае этой статьи бы не было. С другой стороны отсутствие регулярных обновлений сильно огорчает. Если у вас появится модель телефона с возможностью разблокировки загрузчика, я непременно его приобрету.

Источник

Добавить комментарий

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