Android 4.3 安全提升,Set-UID-Root 权限提升不再起作用,原先的ROOT方法将失效

文章深入分析了Android 4.3版本中针对ROOT权限机制所做的重大调整,特别是对su命令和superUser.apk的影响。详细解释了新加入的代码如何阻止了Set-UID-Root机制的运作,导致传统的ROOT方案失效,并对未来ROOT方案的制定提出了挑战。对于依赖ROOT权限的应用如360和腾讯等,文章强调了需要重新考虑和调整提升权限的方式。

Android目前的ROOT的基本原理,是通过系统漏洞获取ROOT SHELL权限,然后往手机里面push 最核心的两个文件,su可执行文件和superUSer.apk。 后者用于管理对应用的授权,而前者则真正用来提升权限至ROOT。 当APK需要进行高权限操作时,使用Shell方式进行: su xxxxx 即可,此时(假设用户授权了,通过superUser.apk)xxxx的命令就会以ROOT用户权限方式执行。

之所以push到手机中的su可以提升权限,其核心原理是su是Set-UID-Root的。具体原理分析,可参见本博客的 关于ROOT原理的文档,说明的非常详细了。


但是,在Android4.3中,从如下的open Source Code :

dalvik_system_Zygote.cpp-》forkAndSpecializeCommon:


  1. #ifdef HAVE_ANDROID_OS
  2. extern int gMallocLeakZygoteChild;
  3. gMallocLeakZygoteChild = 1;

  4. /* keep caps across UID change, unless we're staying root */
  5. if (uid != 0) {
  6. err = prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);

  7. if (err < 0) {
  8. ALOGE("cannot PR_SET_KEEPCAPS: %s", strerror(errno));
  9. dvmAbort();
  10. }
  11. }

  12. for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {
  13. err = prctl(PR_CAPBSET_DROP, i, 0, 0, 0);
  14. if (err < 0) {
  15. if (errno == EINVAL) {
  16. ALOGW("PR_CAPBSET_DROP %d failed: %s. "
  17. "Please make sure your kernel is compiled with "
  18. "file capabilities support enabled.",
  19. i, strerror(errno));
  20. } else {
  21. ALOGE("PR_CAPBSET_DROP %d failed: %s.", i, strerror(errno));
  22. dvmAbort();
  23. }
  24. }
  25. }

  26. #endif /* HAVE_ANDROID_OS */

注意红色斜体的代码,这是4.3新加入的。新加入的这些代码,会导致set-uid-root不再起作用,也就是,原先的ROOT方案中的su+superUser.apk的模式不再工作了!!黑客们需要重新考虑新的ROOT方案了!360,腾讯等等一系列使用了ROOT权限的应用需要等待新的ROOT方案然后基于新的ROOT方案来调整提升权限的方式了,SU不再起作用了。


这里简单说明一下原因,详细的请参见Linux的Capacity机制。  


Android中每个APK的进程是Zygote Fork出来的,默认Fork出来的进程的Real UID和EUID都是继承自Zygote,也就是ROOT,然后,Zygote会对子进程做一些特殊处理,上面的红色斜体代码的作用是,在新Fork的APK进程中Drop掉所有的BoundSet Capacity,原本Zygote的BoundSet Capacity是全1,然后在APK的子进程中主动的Drop掉所有的这些Capacity,接着会再调用setUID/SetGID将APK进程的UID/GID从ROOT修改为App安装时分配的ID(权限退化)。 

这样,你会看到,APK所在的进程的UID/GID退化成非ROOT了,原本还能通过su来提升权限。但是,4.3里面连所有的BoundsetCapacity也全部Drop掉了,里面包含的SETUID的capacity也Drop了,这样就导致,在APK所在的进程以及任意其子进程中,都无法修改UID了,即便通过set-UID-Root方式也无法修改了。

<think>嗯,用户问的是如何在Android的RC文件中获取Root权限。首先,我得回忆一下Android系统的启动流程和相关组件。RC文件,也就是init.rc文件,属于Android初始化系统的一部分,由init进程解析执行。init进程是Android启动时第一个用户空间进程,负责挂载文件系统、启动服务等。 用户想要通过RC文件获取Root权限,这通常意味着他们想在某些服务或命令中以root身份运行。但Android安全机制比较严格,默认情况下不允许普通进程获得root权限。所以需要了解如何正确配置RC文件中的服务或命令,使其以root权限运行。 首先,在RC文件中定义服务时,可以通过`user`和`group`选项指定运行的用户和组。如果将user设为root,那么该服务就会以root权限运行。例如: ``` service myservice /system/bin/myservice user root group root ... ``` 不过,现代Android系统通常会对这种配置进行限制,因为直接以root运行服务可能存在安全风险。可能需要修改SELinux策略,确保该服务被允许以root身份执行。比如,在SELinux的.te文件中添加相应的权限规则,允许服务访问需要的资源。 另外,用户可能需要通过setuidsetgid的方式提升权限,但这在Android中并不常见,且同样受SELinux限制。还有一种方法是在启动脚本中使用`su`命令,但普通系统可能没有su,或者需要特定权限才能调用。 需要注意的是,修改系统分区和init.rc文件通常需要解锁Bootloader并刷入修改后的系统镜像,这会导致设备保修失效,并可能带来安全风险。此外,不同Android版本和厂商定制系统可能有不同的机制,比如有些厂商会加强init进程的安全策略,阻止普通服务以root运行。 总结下来,步骤大致是:在RC文件中配置服务以root用户运行,处理SELinux策略,必要时修改系统镜像。但必须提醒用户相关风险,以及不同设备和系统版本的差异。同时,生成相关问题需要考虑用户可能遇到的后续问题,比如SELinux配置、系统修改方法等。</think>### Android RC文件获取Root权限的方法Android系统中,`init.rc`文件是初始化进程(init)的配置文件,用于定义系统启动时的服务和动作。若需通过RC文件获取Root权限,需遵循以下步骤: --- #### 1. **修改服务定义** 在`init.rc`中定义服务时,可通过`user`和`group`字段指定以root身份运行: ```rc service my_root_service /system/bin/my_binary user root # 以root用户运行 group root # 以root组运行 class main oneshot # 执行一次后退出 ``` 此配置会使`my_binary`以root权限启动[^1]。 --- #### 2. **SELinux策略调整** 若设备启用SELinux(如Android 4.3+),需在策略文件(`.te`)中添加权限: ```te # 允许服务域访问root权限 allow my_root_service domain:process { transition sigchld }; allow init my_root_service:service_manager add; ``` 编译后需将新策略刷入设备[^2]。 --- #### 3. **使用`setuid`或`setgid`(可选)** 在二进制文件中通过代码提升权限: ```c if (setuid(0) != 0 || setgid(0) != 0) { // 错误处理 } ``` 需确保二进制文件具有`suid`标志: ```bash chmod 4755 /system/bin/my_binary ``` --- #### 4. **修改系统镜像** 因`init.rc`位于只读的`system`分区,需通过以下步骤修改: 1. 解锁Bootloader 2. 提取`boot.img`并解包 3. 修改`init.rc`并重新打包刷入 --- #### 注意事项 - **兼容性问题**:不同Android版本对`init.rc`解析逻辑可能不同,需测试目标设备。 - **安全风险**:Root权限滥用可能导致系统不稳定或安全漏洞。 - **厂商限制**:部分厂商(如华为、小米)会加固init进程,需额外绕过限制。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值