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

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

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

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


person asudhak    schedule 30.10.2012    source источник


Ответы (3)


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

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);  

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

person Checksum    schedule 14.11.2012
comment
Согласно вашему объяснению, кажется, что su транслирует сообщение с просьбой к Superuser.apk сообщить, должен ли он разрешать root-доступ или нет. Вот мне интересно, что мешает другому приложению ответить на этот запрос вместо Superuser.apk? (что было бы огромной уязвимостью, если бы это было возможно, поэтому я думаю, что это не так; просто любопытно) Кроме того, какая защита существует, чтобы приложение не запрашивало root под вымышленным именем? (т. е. вредоносный.apk запрашивает root под именем awesome-root-only-app.apk, чтобы обманом заставить пользователя предоставить доступ) - person youen; 31.01.2016

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

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

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

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

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

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

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

person Suraj Bajaj    schedule 30.10.2012
comment
и как/почему приложение Superuser действует только как поставщик прав Su? Что заставляет его быть ответственным? - person waqaslam; 30.10.2012
comment
@Waqas Это может ответить на ваш вопрос androidsu.com/superuser Просто изучите сайт. Я обновлю ссылку в ответе. Может быть полезным для других. :) - person Suraj Bajaj; 30.10.2012
comment
Да, я наблюдал за поведением. Но все же неясно, как приложение «SuperUser» находит это. Является ли SuperUser чем-то вроде монитора, который проверяет поведение всех других запущенных приложений? - person asudhak; 30.10.2012
comment
@asudhak Я бы сказал, что это больше похоже на брандмауэр. Все запросы su проходят через него. - person Suraj Bajaj; 30.10.2012
comment
Двоичный файл su делает это за вас: двоичный файл su вызывается другими приложениями, когда им нужны права суперпользователя. Двоичный файл проверяет базу данных, поддерживаемую Superuser.apk, чтобы определить, предоставили ли вы уже права запрашивающему приложению, и, если нет, указывает Superuser.apk отобразить запрос на разрешение. - person Wolfram Rittmeyer; 30.10.2012
comment
@Waqas Ну, как я уже говорил. Приложение Superuser больше похоже на брандмауэр. Таким образом, все запросы su будут проходить через него. Когда вы рутируете устройство или устанавливаете ПЗУ с root-доступом, это указывается. Вы сообщаете Android, что приложение Superuser теперь будет действовать как брандмауэр su. (Это МОЕ понимание. Я хотел бы, чтобы меня поправили, если я ошибаюсь.) - person Suraj Bajaj; 30.10.2012
comment
su просто вызывает superuser.apk. Это все. - person Wei Liu; 04.03.2014

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

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

person Amaron    schedule 14.11.2012