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