背景
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的方式来达到目的,感兴趣的朋友可以参考。