Как приложение Android SuperUser обнаруживает, что приложение запрашивает root? - программирование

Как приложение Android SuperUser обнаруживает, что приложение запрашивает root?

Я пишу приложение, которое будет использовать su для выполнения некоторых команд в ядре linux. Мне было интересно, как SuperUser выясняет, что приложение запрашивает права root? Кроме того, существуют ли какие-либо известные способы (через обфускацию), в которых эта проверка может быть обойдена?

Другими словами: Как Android/(SuperUser) знает, что для приложения требуются привилегии root, несмотря на то, что в файле манифеста Android нет явных запросов.

Я задаю этот вопрос с точки зрения безопасности. Я хочу знать, как это работает, чтобы быть уверенным, что вредоносное приложение не может обойти SuperUser.

4b9b3361

Ответ 1

В систему суперпользователя есть две части: бинарный файл суперпользователя (su на терминале) и SuperUser.apk (приложение Android для управления приложениями с помощью su). Рассматривая исходный код su binary, когда вы запрашиваете доступ через

Process p = Runtime.getRuntime().exec("su");

он публикует намерение через диспетчер сообщений Android, который приложение запросило для доступа суперпользователя.

sprintf(command, "/system/bin/am broadcast -a '%s' --es socket '%s' --ei caller_uid '%d' --ei allow '%d' --ei version_code '%d' > /dev/null",action, socket_path, ctx->from.uid, allow, VERSION_CODE);  

Приложение-менеджер прослушивает это намерение и просит пользователя обработать запрос (разрешить/запретить).

Ответ 2

Когда вы запустите это:

Process p = Runtime.getRuntime().exec("su");

Вы пытаетесь выполнить "su", которое может выполнять только приложение с правами суперпользователя! Поэтому всякий раз, когда Android обнаруживает, что вы пытаетесь запустить "su", он получит, что для приложения потребуются права суперпользователя.

Кроме того, у Android есть зарезервированная область, доступ к которой может получить только система Android. Если ваше приложение пытается что-то получить там, Android поймет, что суперпользователь необходим.

Например, скажем, вы пытаетесь изменить файл хоста или изменить некоторые сетевые конфигурации, такие как DHCP. Или вы пытаетесь получить доступ к файлам из системной области, например. /data Android проверит, имеет ли приложение права суперпользователя, а затем предоставит ему доступ к таким вещам.

О вредоносном программном обеспечении, когда приложение нуждается в доступе суперпользователя, система предложит пользователю предоставить или запретить права суперпользователя на приложение. Только тогда приложение может получить доступ root. Таким образом, пользователь может решить, принимать или запрещать доступ к корню для любого приложения. (Система будет запрашивать пользователя каждый раз, когда приложение пытается получить доступ к чему-то, что требует доступа root, ЕСЛИ вы не сообщите системе о своем выборе принятия или отказа в отношении конкретного приложения.)

PS: Вы можете рассмотреть возможность проверки веб-сайта для приложения Superuser.

Ответ 3

На самом деле это довольно просто. У Vanilla Android даже нет su или superuser. Когда вы запускаете устройство, вы запускаете оболочку как root. Затем вы устанавливаете двоичный файл su и superuser.apk. После установки вы установите оболочку обратно к нормальным разрешениям. Все эти корневые приложения теперь могут вызывать su для запроса доступа root.

Когда выполняется su, он вызывает superuser.apk с сообщением о том, хотите ли вы повысить привилегии. Двоичные файлы su и superuser.apk защищены через обычную песочницу Android. Обратите внимание, что как только вы даете привилегии для root приложения, он может делать все, что захочет, включая перезапись su с собственной версией.