我正在编写一个应用程序,su
用于在 linux 内核中执行一些命令。我想知道 SuperUser 是如何确定应用程序要求 root 权限的?此外,是否有任何已知的方法(通过混淆)可以绕过此检查?
换句话说:尽管在 android 清单文件中没有明确请求权限,但 Android/(SuperUser) 如何知道应用程序需要 root 权限。
我从安全的角度问这个问题。我想知道这是如何工作的细节,以确保恶意应用程序无法绕过超级用户。
超级用户系统有两个部分 -超级用户二进制文件(终端上的 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);
管理器应用程序侦听此意图并要求用户处理请求(允许/拒绝)。
当你运行这个:
Process p = Runtime.getRuntime().exec("su");
您正在尝试执行只有具有超级用户权限的应用程序才能执行的“su”!因此,每当 Android 检测到您正在尝试运行“su”时,它就会知道该应用程序需要超级用户权限。
此外,Android 还保留了一些只有 Android 系统才能访问的区域。如果您的应用程序试图访问那里的某些内容,Android 会理解需要超级用户。
例如,假设您正在尝试修改主机文件或修改某些网络配置,例如 DHCP。或者您正在尝试从系统区域访问文件,例如/data
Android 将检查应用程序是否具有超级用户权限,然后仅授予它访问此类内容的权限。
关于恶意软件,当应用程序需要超级用户访问权限时,系统会提示用户授予或拒绝超级用户权限。只有这样,应用程序才能获得 root 访问权限。因此,由用户决定是接受还是拒绝任何应用程序的 root 访问。(每次应用程序尝试访问需要 root 访问权限的内容时,系统都会提示用户,除非您告诉系统记住您对特定应用程序的接受或拒绝选择。)
PS:您可以考虑查看Superuser app 的网站。
其实很简单。Vanilla Android 甚至没有su
或superuser
. 当你 root 设备时,你以 root 身份运行 shell。然后安装su
二进制文件和superuser.apk
. 安装后,您将 shell 设置回其正常权限。所有这些仅限 root 的应用程序现在都可以调用su
以请求 root 访问权限。
运行时su
它会调用superuser.apk
一条消息,询问您是否要提升权限。su
二进制文件 和superuser.apk
通过 Android 的正常沙盒保护。请注意,一旦您授予应用程序 root 权限,它就可以自由地做任何它想做的事情,包括用它自己的版本覆盖 su。