Найти в Дзене

Root shell с отключенным SELinux на большинстве устройств Motorola

Загрузчик Motorola поддерживает несколько специальных команд, которые после загрузки превращаются в аргументы ядра Linux. Например, после выполнения команды $ fastboot oem config carrier abc и последующей загрузки смартфона с помощью fastboot continue ядру будет передан аргумент carrier=abc. Пока ничего криминального. Но, конечно же, здесь есть проблема валидации входных данных, то есть возможность передать ядру дополнительные параметры с помощью особым образом сформированной команды. Например, выполнение такой команды: $ fastboot oem config carrier "a rdinit=/sbin/foo" приведет к передаче ядру параметров carrier=a и rdinit=/sbin/foo. Это уже намного интереснее. С помощью того же параметра rdinit можно заставить ядро запустить любой бинарник из initramfs (RAM-диск Android). Но есть другая проблема: в initramfs нет бинарных файлов, подходящих для получения root-шелла. Исследователи выкрутились и из этой ситуации. Дело в том, что с помощью fastboot можно не только прошивать и разлочива

Загрузчик Motorola поддерживает несколько специальных команд, которые после загрузки превращаются в аргументы ядра Linux. Например, после выполнения команды

$ fastboot oem config carrier abc

и последующей загрузки смартфона с помощью fastboot continue ядру будет передан аргумент carrier=abc. Пока ничего криминального. Но, конечно же, здесь есть проблема валидации входных данных, то есть возможность передать ядру дополнительные параметры с помощью особым образом сформированной команды. Например, выполнение такой команды:

$ fastboot oem config carrier "a rdinit=/sbin/foo"

приведет к передаче ядру параметров carrier=a и rdinit=/sbin/foo. Это уже намного интереснее. С помощью того же параметра rdinit можно заставить ядро запустить любой бинарник из initramfs (RAM-диск Android). Но есть другая проблема: в initramfs нет бинарных файлов, подходящих для получения root-шелла.

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

Чтобы использовать эту возможность, достаточно собрать debug-версию initramfs, которая включает в себя работающий с правами root ADB, не требующий авторизации. Загрузить этот initramfs в смартфон, дампнуть оперативную память смартфона, чтобы узнать адрес загрузки, и передать этот адрес ядру с помощью аргумента initrd:

$ fastboot oem config fsg-id "a initrd=0x11000000,1518172"
$ fastboot flash aleph malicious.cpio.gz
... загрузчик сообщит, что прошить файл не удалось, но файл останется в памяти ...
$ fastboot continue
$ adb shell
shamu:/ # id
uid=0(root) gid=0(root) groups=0(root),[...] context=u:r:su:s0
shamu:/ # setenforce permissive
shamu:/ # getenforce
Permissive
shamu:/ #

Получив права root, атакующий также может перезаписать boot-раздел, внедрив в него эксплоит (на Nexus 6 такое возможно из-за неполной реализации verified boot), произвести даунгрейд загрузчика, раздела TrustZone, разблокировать загрузчик, если такая процедура уже проводилась, и перезаписать некоторые разделы.

Разблокировка загрузчика и отключение verified boot в OnePlus 3/3T

Здесь все намного проще, с помощью такой команды разблокируем загрузчик без сброса до заводских настроек:

$ fastboot oem 4F500301

С помощью такой — отключаем механизм verified boot:

$ fastboot oem disable dm verity