• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Как работает рутинг (rooting)

neopaket

Переводчик
Пользователь
Регистрация
14.05.2019
Сообщения
185
Реакции
205
Как работает рутинг: техническое объяснение процесса рутирования Android.

Мне всегда было любопытно, как рутирование работает за кулисами. После недавнего приобретения нового Eee Pad Slider, сотового планшета, в который до сих пор никто не смог внедрить права суперпользователя, получаемые с помощью того самого рутинга, для этого удивительного оборудования с таким большим потенциалом и это заставило меня наконец сесть и выяснить, что именно рутирование означает, что это влечет за собой с технической точки зрения, и как хакеры в дикой природе приближаются к укоренению (root - корень (с англ.) нового устройства. Хотя вся эта информация существует, я не смог найти хорошую статью, в которой был бы уровень технической детализации, который я ожидал, и соответствующее введение в общую картину, и поэтому я решил написать свою собственную.

Это не руководство по рутированию определенного устройства Android. Скорее, это общее объяснение того, как стандартные ПЗУ (Постоянное запоминающее устройство) Android пытаются предотвратить непривилегированный доступ (Доступ обычного пользователя без привилегий), как хакеры атакуют эту проблему и как рутирующее программное обеспечение использует различные эксплойты для защиты от этих механизмов безопасности.

I. Цель

Давайте сначала сделаем шаг назад и рассмотрим , что именно мы подразумеваем под «Рутингом». Забудьте о перепрошивке пользовательских ПЗУ, включении модема WiFi или установке Superuser.apk; По сути, рутинг - это получение корневого доступа к базовой системе Linux под Android и, таким образом, получение абсолютного контроля над программным обеспечением, которое работает на устройстве. Вещи, которые требуют root-доступа в типичной системе Linux - внедрение и ликвидация файловых систем, запуск ваших любимых SSH (cетевой протокол прикладного уровня, позволяющий производить удалённое управление операционной системой ) или HTTP (протокол прикладного уровня передачи данных ) или DHCP (сетевой протокол, позволяющий сетевым устройствам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP) или DNS (компьютерная распределённая система для получения информации о доменах) или прокси-серверов (промежуточный сервер (комплекс программ) в компьютерных сетях, выполняющий роль посредника между пользователем и целевым сервером) и т. д., - также требуют root-доступ на Android , Возможность выполнять произвольные команды от имени пользователя root позволяет вам делать абсолютно все в системе Linux / Android, и это настоящая цель рутинга.

Стандартные сборки Android обычно не позволяют юзерам выполнять произвольный код от имени пользователя root. По сути это означает, что вам как пользователю предоставляется только ограниченный контроль над вашим собственным устройством; Вы можете заставить свое устройство выполнять задачу X, только если производитель явно разрешил это и отправил программу для этого. Вы не сможете использовать сторонние приложения для выполнения задачи, которую ваш производитель не желает выполнять. WiFi модем является хорошим примером этого. Операторы сотовой связи, очевидно, не хотят, чтобы вы подключали свой телефон без дополнительной оплаты. Таким образом, многие телефоны поставляются с собственными проприетарными приложениями для модема WiFi, которые требуют дополнительных затрат. Но без корневого доступа вы не сможете установить бесплатную альтернативу, такую как Wireless Tether For Root Users (Эта программа включает модем (через wifi ) для «рутированных» телефонов, работающих под управлением Android), Почему это общепринятая практика (рутировние), для меня загадка? Единственная разница между мобильными телефонами, планшетами и компьютерами заключается в их форм-факторе; но в то время как поставщик ПК потерпел бы колоссальный провал, если бы попытался помешать пользователям запускать произвольные программы на своих машинах, о поставщиках сотовых телефонов явно не судят по тому же принципу. Но такие аргументы принадлежат другой статье.

II. Враг: механизмы защиты OEM ROM для Android

Загрузчик и Восстановление


Загрузчик, первый фрагмент кода, выполняемый при включении устройства, отвечает за загрузку ОС Android и системы восстановления и прошивку нового ПЗУ. Люди называют некоторые загрузчики «разблокированными», если пользователь может прошивать и загружать произвольные ПЗУ без взлома; К сожалению, многие устройства Android имеют заблокированные загрузчики, которые вам придется взломать, чтобы заставить их делать что-то кроме загрузки стандартного ПЗУ. Смартфон Samsung, которым я пользовался несколько месяцев назад, имел разблокированный загрузчик; Я мог бы нажать определенную комбинацию аппаратных клавиш на телефоне, подключить его к компьютеру и перенести на него любое пользовательское ПЗУ с помощью утилит Samsung без необходимости обходить какие-либо механизмы защиты. То же самое не относится к моей Motorola Droid 2 Global; загрузчик, насколько я знаю, взломать нельзя. Слайдер Eee Pad, с другой стороны, интересный зверь; как и с другими устройствами на базе nVidia Tegra 2, его загрузчик управляется через nvflash утилиту, но только если вы знаете безопасный ключ загрузки (SBK) устройства. (SBK - это закрытый ключ AES, используемый для шифрования команд, отправляемых загрузчику; загрузчик примет команду только в том случае, если она была зашифрована определенным ключом устройства.) В настоящее время, поскольку SBK Eee Pad Slider публично неизвестный, загрузчик остается недоступным.

Восстановление системы - это вторая часть низкоуровневого кода на борту любого устройства Android. Он отделен от пользовательского интерфейса Android и обычно находится в своем собственном разделе; обычно он загружается загрузчиком при нажатии определенной комбинации аппаратных клавиш. Важно понимать, что это абсолютно независимая программа; Linux и пользовательская область Android не загружаются при загрузке в recovery, и здесь не существует какой-либо концепции высокого уровня, такой как root. Это простая программа, которая на самом деле является очень примитивной для ОС, и она имеет абсолютный контроль над системой и будет делать все, что угодно, пока в нее встроен код. Восстановление запасов зависит от производителя, но часто включает в себя такие функции, как переформатирование /data раздела (возврат к заводским настройкам) и прошивка обновленного ПЗУ (update.zip, расположенный в корне внешней карты microSD), подписанный производителем. Примечание подписано производителем ; Как правило, пользовательские файлы обновлений не могут быть прошиты, если вы не получите закрытый ключ производителя и не подпишете им свое пользовательское обновление, что в большинстве случаев является невозможным и незаконным в определенных юрисдикциях. Однако, поскольку восстановление хранится в разделе /system, /data и /cache (об этом позже), вы можете заменить его на заказ восстановления, если у вас есть доступ к корневой оболочке Linux / Android. Большинство людей делают это только после рутирования своего устройства; ClockworkMod Recovery - это популярный сторонний образ для восстановления, который позволяет прошивать произвольные ПЗУ, создавать резервные копии и восстанавливать разделы и многое другое.

АДБ

ADB (см. Официальную документацию по ADB ) позволяет ПК или Mac подключаться к устройству Android и выполнять определенные операции. Одной из таких операций является запуск простой оболочки на устройстве с помощью команды adb shell. Реальный вопрос в том, от какого пользователя выполняются команды, выполняемые этим процессом оболочки. Оказывается, это зависит от значения системного свойства Android, названного ro.secure. (Вы можете просмотреть значение этого свойства, набрав getprop ro.secureлибо через оболочку ADB, либо через эмулятор терминала на устройстве.) Если ro.secure=0, оболочка ADB будет выполнять команды от имени пользователя root на устройстве. Но если ro.secure=1, оболочка ADB будет запускать команды на устройстве как непривилегированный пользователь. Угадайте, почему ro.secure установлено практически на каждой стандартной сборке Android Android. Но можем ли мы изменить значение ro.secureв системе? Ответ - нет, как подразумевается ro в названии объекта недвижимости. Значение этого свойства устанавливается во время загрузки из default.prop файла в корневом каталоге. Содержимое корневого каталога по существу копируется из раздела во внутреннее хранилище при загрузке, но вы не можете записать раздел, если вы еще не являетесь пользователем root. Другими словами, это свойство запрещает корневой доступ через ADB, и единственный способ изменить его - это получить корневой доступ в первую очередь. Таким образом, это безопасно.

Android-интерфейс

В системе Android все приложения, которые вы можете видеть или взаимодействовать напрямую, выполняются как _un_privileged. По логике вещей, программа, работающая как непривилегированный пользователь, не может запустить другую программу, которая запускается как привилегированный пользователь; в противном случае любая программа может просто запустить другую копию в привилегированном режиме и получить привилегированный доступ ко всему. С другой стороны, программа, работающая от имени пользователя root, может запустить другую программу от имени пользователя root или непривилегированного пользователя. В Linux привилегии обычно осуществляются с помощью su и sudo программ; они часто являются единственными программами в системе, которые способны выполнять системный вызов setuid(0) это изменяет текущую программу с запуска в качестве непривилегированного пользователя на запуск от имени пользователя root. Приложения, которые обозначают себя как требующие root, на самом деле просто выполняют другие программы (часто просто собственные двоичные файлы, поставляемые вместе с приложением) su. Неудивительно, что стандартные OEM-диски никогда не поставляются с этими su, Вы не можете просто скачать или скопировать его; для него должен быть установлен бит SUID, который указывает системе, что программы, которым разрешено повышать свои привилегии времени выполнения до root. Но, конечно, если вы не являетесь пользователем root, вы не можете установить бит SUID в программе. Подводя итог, можно сказать, что это означает, что любая программа с которой вы можете взаимодействовать на Android (и, следовательно, работающая в непривилегированном режиме), не может либо 1) получить привилегированный доступ и выполнить в привилегированном режиме, либо 2) запустить другую программу, которая выполняется в привилегированном режиме. Если это так, система Android сама по себе в значительной степени защищена от попыток повышения привилегий. Мы увидим лазейку, используемую приложениями рутинга на устройстве в следующем разделе.

III. Борьба с системой


Если на вашем устройстве установлен разблокированный загрузчик, вы почти закончили. Примером является телефон Samsung, который у меня был. Поскольку загрузчик допускал перепрошивку произвольных ПЗУ, кто-то по существу вытащил из телефона стандартное ПЗУ (используя dd (Программа UNIX, предназначенная как для копирования, так и для конвертации файлов )), добавил su и перепаковал его в измененное ПЗУ. Все, что мне, как пользователю, нужно было сделать, это выключить телефон, нажать определенную комбинацию аппаратных клавиш, чтобы запустить телефон в режиме прошивки, и использовать утилиты Samsung для прошивки модифицированного ПЗУ на телефон.

Верьте или нет, некоторые производители на самом деле не устанавливают ro.secure. Если это так, укоренение еще проще; Просто подключите телефон к компьютеру и запустите ADB, и теперь у вас есть оболочка, которая может выполнять любую программу от имени пользователя root. Затем вы можете задать /system функцию как read-write (чтение и написание), установить su и все ваши мечты сбудутся ;). (Рутируется устройство)

Но многие другие устройства Android заблокировали загрузчики и ro.secure настроены. Как объяснено выше, они не должны иметь root-права, поскольку вы можете взаимодействовать только с непривилегированными программами в системе, и они не могут помочь вам выполнить какой-либо привилегированный код. Так в чем же решение?

Мы знаем, что ряд важных программ, включая низкоуровневые системные службы, должны запускаться с правами root даже на Android, чтобы получить доступ к аппаратным ресурсам. Набрав ps на оболочке Android (либо через ADB, либо через эмулятор терминала на устройстве), вы получите доступ. Эти программы запускаются init процессом, первым процессом, запускаемым ядром (я часто чувствую, что ядро и initпроцесс аналогичны Адаму и Еве - ядро порождается init определенным образом, а init затем запускается и порождает все остальные процессы (Довольно странное объяснение)), который должен запускаться от имени пользователя root, потому что он должен запускать другие привилегированные системные процессы.

Ключевая идея: если вы можете взломать или обмануть один из этих системных процессов, работающих в привилегированном режиме, для выполнения произвольного кода, вы получите привилегированный доступ к системе. Вот как работают все методы одним щелчком мыши, включая z4root, gingerbreak и так далее. Если вам действительно любопытно, я настоятельно рекомендую эту превосходную презентацию о различных эксплойтах, используемых текущими инструментами рутирования, но детали здесь не так актуальны, как простая идея, лежащая в их основе. Эта идея заключается в том, что в системных процессах, выполняющихся с правами суперпользователя в фоновом режиме, существуют уязвимости, которые, если их использовать, позволят нам выполнить произвольный код от имени пользователя root. Ну, этот «произвольный код», безусловно, представляет собой фрагмент кода, который проникает в /system в режиме чтения-записи и устанавливает копию su в системе, так что с этого момента нам не нужно прыгать через обручи (Использовать сложные методы) для запуска программ, которые мы хотели запустить в первую очередь.

Поскольку Android является открытым исходным кодом, так же как и Linux, люди занимались тщательным изучением и анализом исходного кода различных системных служб, пока не обнаружат дыру в безопасности, которую они могут использовать. Это становится все труднее, поскольку Google и сопровождающие различные части кода исправляют эти конкретные уязвимости, когда они обнаруживаются и публикуются, что означает, что эксплойты со временем станут устаревшими с более новыми устройствами. Но хорошая новость заключается в том, что производители не настолько глупы, чтобы продвигать OTA-обновления, чтобы исправить уязвимость только для предотвращения рутирования, поскольку это очень дорого для них; Кроме того, устройства на рынке всегда отстают от последних выпусков программного обеспечения. Таким образом, пройдет довольно много времени, прежде чем эти инструменты рутинга станут бесполезными из-за новых патчей, и к тому времени, надеюсь, будут обнаружены другие эксплойты.

Спасибо вам за прочтение данной статьи.
Переведено специально для xss.pro
neopaket
Оригинальная статья: https://jichu4n.com/posts/how-rooting-works-a-technical-explanation-of-the-android-rooting-process/
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх