15

我正在编写一个应用程序,su用于在 linux 内核中执行一些命令。我想知道 SuperUser 是如何确定应用程序要求 root 权限的?此外,是否有任何已知的方法(通过混淆)可以绕过此检查?

换句话说:尽管在 android 清单文件中没有明确请求权限,但 Android/(SuperUser) 如何知道应用程序需要 root 权限。

我从安全的角度问这个问题。我想知道这是如何工作的细节,以确保恶意应用程序无法绕过超级用户。

4

3 回答 3

18

超级用户系统有两个部分 -超级用户二进制文件(终端上的 su)和SuperUser.apk(使用 su 管理应用程序的 Android 应用程序)。查看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);  

管理器应用程序侦听此意图并要求用户处理请求(允许/拒绝)。

于 2012-11-14T04:49:26.210 回答
15

当你运行这个:

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

您正在尝试执行只有具有超级用户权限的应用程序才能执行的“su”!因此,每当 Android 检测到您正在尝试运行“su”时,它就会知道该应用程序需要超级用户权限。

此外,Android 还保留了一些只有 Android 系统才能访问的区域。如果您的应用程序试图访问那里的某些内容,Android 会理解需要超级用户。

例如,假设您正在尝试修改主机文件或修改某些网络配置,例如 DHCP。或者您正在尝试从系统区域访问文件,例如/dataAndroid 将检查应用程序是否具有超级用户权限,然后仅授予它访问此类内容的权限。

关于恶意软件,当应用程序需要超级用户访问权限时,系统会提示用户授予或拒绝超级用户权限。只有这样,应用程序才能获得 root 访问权限。因此,由用户决定是接受还是拒绝任何应用程序的 root 访问。(每次应用程序尝试访问需要 root 访问权限的内容时,系统都会提示用户,除非您告诉系统记住您对特定应用程序的接受或拒绝选择。)

PS:您可以考虑查看Superuser app 的网站

于 2012-10-30T12:46:05.547 回答
6

其实很简单。Vanilla Android 甚至没有susuperuser. 当你 root 设备时,你以 root 身份运行 shell。然后安装su二进制文件和superuser.apk. 安装后,您将 shell 设置回其正常权限。所有这些仅限 root 的应用程序现在都可以调用su以请求 root 访问权限。

运行时su它会调用superuser.apk一条消息,询问您是否要提升权限。su二进制文件 和superuser.apk通过 Android 的正常沙盒保护。请注意,一旦您授予应用程序 root 权限,它就可以自由地做任何它想做的事情,包括用它自己的版本覆盖 su。

于 2012-11-14T04:31:20.817 回答