userdebug 和 user 版本
1. 关闭 selinux
system/core
diff -- git a / init / selinux . cpp b / init / selinux . cpp index 5 a0255acd .. 787917274 100644 --- a / init / selinux . cpp +++ b / init / selinux . cpp @@ - 104 , 6 + 104 , 8 @@ EnforcingStatus StatusFromCmdline () { } bool IsEnforcing () { + return false ; + if ( ALLOW_PERMISSIVE_SELINUX ) { return StatusFromCmdline () == SELINUX_ENFORCING ; }
3. 修改 su.cpp ,注释用户组权限检测
system/extras/su/su.cpp diff -- git a / su / su . cpp b / su / su . cpp index 1 a1ab6bf .. af3d2a68 100644 --- a / su / su . cpp +++ b / su / su . cpp @@ - 80 , 8 + 80 , 8 @@ void extract_uidgids ( const char* uidgids , uid_t * uid , gid_t * gid , gid_t * gids , i } 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" ); + //uid_t current_uid = getuid(); + //if (current_uid != AID_ROOT && current_uid != AID_SHELL) error(1, 0, "not allowed"); // Handle -h and --help. ++ argv ;
4. 给 su 文件默认授予 root 权限
system/core/libcutils/fs_config.cpp diff -- git a / libcutils / fs_config . cpp b / libcutils / fs_config . cpp index 5805 a4d19 .. 92e93 e76f 100644 --- a / libcutils / fs_config . cpp +++ b / libcutils / fs_config . cpp @@ - 86 , 7 + 86 , 7 @@ static const struct fs_path_config android_dirs [] = { { 00751 , AID_ROOT , AID_SHELL , 0 , "system/bin" }, { 00755 , AID_ROOT , AID_ROOT , 0 , "system/etc/ppp" }, { 00755 , AID_ROOT , AID_SHELL , 0 , "system/vendor" }, - { 00750 , AID_ROOT , AID_SHELL , 0 , "system/xbin" }, + { 00755 , AID_ROOT , AID_SHELL , 0 , "system/xbin" }, { 00751 , AID_ROOT , AID_SHELL , 0 , "system/apex/*/bin" }, { 00751 , AID_ROOT , AID_SHELL , 0 , "system_ext/bin" }, { 00751 , AID_ROOT , AID_SHELL , 0 , "system_ext/apex/*/bin" }, @@ - 190 , 7 + 190 , 7 @@ static const struct fs_path_config android_files [] = { // the following two files are INTENTIONALLY set-uid, but they // are NOT included on user builds. { 06755 , AID_ROOT , AID_ROOT , 0 , "system/xbin/procmem" }, - { 04750 , AID_ROOT , AID_SHELL , 0 , "system/xbin/su" }, + { 06755 , AID_ROOT , AID_SHELL , 0 , "system/xbin/su" },
frameworks/base/core/jni/com_android_internal_os_Zygote.cpp diff -- git a / core / jni / com_android_internal_os_Zygote . cpp b / core / jni / com_android_internal_os_Zygote . cpp index 9 eede83e21e5 .. 694 eec2a40ac 100644 --- a / core / jni / com_android_internal_os_Zygote . cpp +++ b / core / jni / com_android_internal_os_Zygote . cpp @@ - 656 , 6 + 656 , 7 @@ static void EnableKeepCapabilities ( fail_fn_t fail_fn ) { } 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) { @@ -666,6 +667,7 @@ static void DropCapabilitiesBoundingSet(fail_fn_t fail_fn) { } } } + */ }
kernel/security/commoncap.c diff -- git a / security / commoncap . c b / security / commoncap . c index f86557a8e43f6 .. 19124 dd6239a1 100644 --- a / security / commoncap . c +++ b / security / commoncap . c @@ - 1147 , 12 + 1147 , 12 @@ int cap_task_setnice ( struct task_struct * p , int nice ) static int cap_prctl_drop ( unsigned long cap ) { struct cred * new ; - + /* if (!ns_capable(current_user_ns(), CAP_SETPCAP)) return -EPERM; if (!cap_valid(cap)) return -EINVAL; - +*/ new = prepare_creds (); if ( ! new ) return - ENOMEM ;
5. user 版本需要把 su 编进系统
或者build/make/target/product/base_system.mk build/core diff -- git a / target / product / base_system . mk b / target / product / base_system . mk index 4569 bceff9 .. 5 c8eaaa87c 100644 --- a / target / product / base_system . mk +++ b / target / product / base_system . mk @@ - 273 , 6 + 273 , 7 @@ PRODUCT_PACKAGES += \ wificond \ wifi . rc \ wm \ + su \ # VINTF data for system image PRODUCT_PACKAGES += \ @@ - 378 , 7 + 379 , 6 @@ PRODUCT_PACKAGES_DEBUG : = \ ss \ start_with_lockagent \ strace \ - su \ sanitizer - status \ tracepath \ tracepath6 \