User版本的root权限

本文档的一些实现是基于Android7.0 ,其他android版本可能会有一些差异。

adbd 的root 权限

使用adb命令连接手机,手机中的守护进程adbd的权限为root权限,它的子进程也具有root权限。

执行adb shell ,如果包含#,表示adb的连接是root权限,如下所示:

test:/#
复制代码

反之,如果看到是$ 即表明是shell 权限,如下所示:

test:/$
复制代码
app 的root 权限

Android 的APK 本身都是不具备root 权限的,如果想启用root 权限,那么就必须借助具有root权限的进程或者具有s bit (+s权限)的文件。

目前比较通用的手法是,手机root 后,内置了su到system/bin, 然后普通APP 即可借助su 命令来达到root 权限切换。

注意:任何在最终user版本上打开root权限的手法都会给用户带来安全风险, 请仔细评估确认。

adbd 的root 权限(user)

1、修改build/core/main.mk

ifneq (,$(user_variant))
 # Target is secure in user builds.
 ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1 
 
复制代码

ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1 改为 ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0

2、修改system/core/adb/Android.mk

ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
LOCAL_CFLAGS += -DALLOW_ADBD_DISABLE_VERITY=1
LOCAL_CFLAGS += -DALLOW_ADBD_ROOT=1
endif
复制代码

ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))

改为ifneq (,$(filter userdebug user eng,$(TARGET_BUILD_VARIANT)))

3、修改system/sepolicy/Android.mk

sepolicy_policy.conf := $(intermediates)/policy.conf
$(sepolicy_policy.conf): PRIVATE_MLS_SENS := $(MLS_SENS)
$(sepolicy_policy.conf): PRIVATE_MLS_CATS := $(MLS_CATS)
$(sepolicy_policy.conf): PRIVATE_ADDITIONAL_M4DEFS := $(LOCAL_ADDITIONAL_M4DEFS)
$(sepolicy_policy.conf): $(call build_policy, $(sepolicy_build_files))
	@mkdir -p $(dir $@)
	$(hide) m4 $(PRIVATE_ADDITIONAL_M4DEFS) \
		-D mls_num_sens=$(PRIVATE_MLS_SENS) -D mls_num_cats=$(PRIVATE_MLS_CATS) \
		-D target_build_variant=eng \
		-s $^ > $@
	$(hide) sed '/dontaudit/d' $@ > $@.dontaudit
复制代码

-D target_build_variant=$(TARGET_BUILD_VARIANT) 改成 -D target_build_variant=eng

app 的root 权限

1、内置Google default su

在device.mk中添加su,系统默认是不编译su的

PRODUCT_PACKAGES += su
复制代码

修改system/extras/su路径下的Android.mk 文件,将su编译到system/bin 下

LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/bin
复制代码
放开Google default su 只准shell/root 用户使用的限制。

system/extras/su/su.c 中删除下面3行代码

if (myuid != AID_ROOT && myuid != AID_SHELL) {
    fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
    return 1;
}
复制代码
2、修改su 的内置权限,启用sbit 位

路径:system/core/libcutils/fs_config.c 在fs_path_config android_files[]数组中增加

{ 06755, AID_ROOT,      AID_ROOT,      0, "system/bin/su" },

复制代码

需要放在下面一行之前

{ 00755, AID_ROOT,      AID_SHELL,     0, "system/bin/*" },
复制代码
3、其他修改

1、路径:frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

将 DropCapabilitiesBoundingSet(JNIEnv* env) 这个函数置空。

static void DropCapabilitiesBoundingSet(JNIEnv* env) {
  /* for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {
    int rc = prctl(PR_CAPBSET_DROP, i, 0, 0, 0);
    if (rc == -1) {
      if (errno == EINVAL) {
        ALOGE("prctl(PR_CAPBSET_DROP) failed with EINVAL. Please verify "
              "your kernel is compiled with file capabilities support");
      } else {
        RuntimeAbort(env, __LINE__, "prctl(PR_CAPBSET_DROP) failed");
      }
    }
  } */
}
复制代码

2、路径:frameworks/base/cmds/app_process/app_main.cpp

注释掉main函数开始的下面这段代码

    /*if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
        // Older kernels don't understand PR_SET_NO_NEW_PRIVS and return
        // EINVAL. Don't die on such kernels.
        if (errno != EINVAL) {
            LOG_ALWAYS_FATAL("PR_SET_NO_NEW_PRIVS failed: %s", strerror(errno));
            return 12;
        }
    }*/
复制代码

3、路径:system/core/adb/daemon/main.cpp

将should_drop_privileges()函数清空,直接返回 0 即可

static bool should_drop_privileges() {
	return 0;
}
复制代码

4、将SELinux 调整到permissve mode

路径:system/core/init/init.cpp

static bool selinux_is_enforcing(void)
{
	return false; 
    if (ALLOW_PERMISSIVE_SELINUX) {
        return selinux_status_from_cmdline() == SELINUX_ENFORCING;
    }
    return true;
}
复制代码

app 的root 权限验证

查看当前应用(Helloworld)的 uid(u0_a61), 并切到该用户下,然后再运行su就相当于该APP在调用su命令了。

如果app有root权限,$会切换为#,否则执行su会提示权限错误。
root@android:/ # ps
u0_a61 12218 120 1259632 40368 ffffffff b6e2da80 S com.example.helloworld
root@android:/ # su u0_a61
root@android:/ $ su
root@android:/ # 
复制代码
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值