aosp编译的userdebug系统中的su能被三方应用使用

背景

aosp编译的userdebug系统虽然能在shell下访问su(/system/xbin/su)进入root用户,但安装在rom上的普通应用却没法使用这个命令进入root模式。

下面指导通过修改系统源码的方式令普通应用也可以执行su命令。

操作内容

以下内容基于android-13.0.0_r40代码

  • system/extras/su/su.cpp

注释掉开头检查当前执行用户的逻辑,这样普通应用用户也可以执行su了;

int main(int argc, char** argv) {
    // uid_t current_uid = getuid();
    // if (current_uid != AID_ROOT && current_uid != AID_SHELL) error(1, 0, "not allowed");

    ...
}
  • frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

注释掉DropCapabilitiesBoundingSet函数中相关内容,防止孵化的新进程在这里丢弃掉相关的进程能力,如不能通过setgid,setuid来修改用户身份;

static void DropCapabilitiesBoundingSet(fail_fn_t fail_fn) {
  // for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {;
  //   if (prctl(PR_CAPBSET_DROP, i, 0, 0, 0) == -1) {
  //     if (errno == EINVAL) {
  //       ALOGE("prctl(PR_CAPBSET_DROP) failed with EINVAL. Please verify "
  //             "your kernel is compiled with file capabilities support");
  //     } else {
  //       fail_fn(CREATE_ERROR("prctl(PR_CAPBSET_DROP, %d) failed: %s", i, strerror(errno)));
  //     }
  //   }
  // }
}
  • system/core/init/selinux.cpp

修改函数IsEnforcing()另其总是返回false,这样设备启动后会自动取消SELinux的强制模式;SELinux处于强制模式下普通应用仍然不能调用setgid,setuid这些方法;

bool IsEnforcing() {
    // 总是返回false, 不再执行原有逻辑
    return false;

    if (ALLOW_PERMISSIVE_SELINUX) {
        return StatusFromProperty() == SELINUX_ENFORCING;
    }
    return true;
}

其实也可以手动通过android shell命令来取消SELinux的强制模式:

# android shell

# 查看当前模式:Enforecing: 强制模式  Permissive:被动模式
getenfore

# 0:启用被动模式  1:启用强制模式
setenfore 0
  • system/core/libcutils/fs_config.cpp

修改su文件的权限声明,为其增加SGID位,并另其他用户可读可执行;

# 修改前
{ 04750, AID_ROOT,      AID_SHELL,     0, "system/xbin/su" },
# 修改后
{ 06755, AID_ROOT,      AID_SHELL,     0, "system/xbin/su" },

这一步也可以通过手动chmod 06755 /system/xbin/su来完成;

需要注意的是,即使这里重新声明了权限,普通三方app还是无法访问/system/xbin/su这个文件的,不过此时已经可以通过cp /system/xbin/su /system/bin/su将其拷贝到/system/bin这个目录下即可。

引用

Android 源码修改,使第三方应用可以直接使用su命令_android13 开发使用shell 非root-CSDN博客

以上内容参考上面这个链接,其中提到通过修改init.rc的方式可以令普通用户可以访问/system/xbin/su,这里我没有尝试,而且也没看懂相关逻辑;目前的问题是普通应用的PATH环境变量里确实包含/system/xbin路径,但是却无法访问这个路径下的可执行文件,只能通过将其拷贝到/system/bin上使用;有了解相关上下文的朋友,烦请留下宝贵指导意见,后续我会将内容更新上去;

除了修改源代码的方式来令普通应用获得root能力外,上面引用的内容中还提到了通过Supersu的方式来达到目的,感兴趣的朋友可以参考。

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值