[FAQ11414]android KK 4.4 版本后,user 版本su 权限严重被限制问题说明
2016-08-15 09:28
399 查看
[Description]
android KK 4.4 版本后,user 版本su 权限严重被限制, 如无法直接访问data 区域,无法直接remount system image, 无法设置system property
[Keyword]
KK, 4.4, user 版本, su, root
[Solution]
Google 不遗余力的提高android系统的安全性, 而针对su 这个即令人恨,又令人爱的命令,就痛下杀手。下面我从三个方面说明.
1. 限制user 版本adbd process 的capabilities bound set. 循环CAPBSET_DROP 动作,将Process 的root capabilities 进行了强行限制。仅仅保留了CAP_SETUID, CAP_SETGID 这两项,用于run-as 使用,可参考alps/system/core/adb/adb.c 中的 drop_capabilities_bounding_set_if_need 函数。
这样导致的情况是,在user 版本中usb debug 的su 受到极大的限制,仅仅能够模拟对应的uid/gid, 而无法拿去真正的root 权限.
2. 限制所有app 的capabilities bound set, 在android 4.4 上,zygote fork app 时,特意对所有fork 出来的子进程,进行了CAPBSET_DROP 动作,将Process 的root capabilities 进行了强行限制。 使得即使这些APK 徒有Root 权限,而无真实的capabilites. 在4.4.4 以及L 版本上, 还会使用prctl 下PR_SET_NO_NEW_PRIVS 指令,
限制子进程权限的提升.
这样导致的情况是, app 执行su 时,其权限受到了严格的管控,比如无法逃脱DAC 权限管控。但因为依旧具有root uid/gid, 所以在framework 层的permission 限制上依旧畅通无阻。
详情请参考FAQ: https://online.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ11538
3. SElinux 权限限制。 在user 版本上,没有导入有效的SU SElinux policy, 这样一旦本身受SElinux 限制的process 使用su 时,同样会受到SElinux 的限制。
(3.1). 在KK 版本只有4个process 会受到此影响,即zygote, netd, installd, vold.
消除这种限制的手法即是external/sepolicy/android.mk 里面的
ifeq ($(TARGET_BUILD_VARIANT),user)
BOARD_SEPOLICY_IGNORE+=external/sepolicy/su.te
else
BOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.te
endif
更新成:
ifeq ($(TARGET_BUILD_VARIANT),user)
BOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.te
else
BOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.te
endif
(3.2). 在L 版本则所有的Process 都会受到这样的影响.
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) : $(call build_policy, $(sepolicy_build_files))
@mkdir -p $(dir $@)
$(hide) m4 -D mls_num_sens=$(PRIVATE_MLS_SENS) -D mls_num_cats=$(PRIVATE_MLS_CATS) \
-D target_build_variant=$(TARGET_BUILD_VARIANT) \
-D force_permissive_to_unconfined=$(FORCE_PERMISSIVE_TO_UNCONFINED) \
-s $^ > $@
$(hide) sed '/dontaudit/d' $@ > $@.dontaudit
将-D target_build_variant=$(TARGET_BUILD_VARIANT) 改成 -D target_build_variant=eng
android KK 4.4 版本后,user 版本su 权限严重被限制, 如无法直接访问data 区域,无法直接remount system image, 无法设置system property
[Keyword]
KK, 4.4, user 版本, su, root
[Solution]
Google 不遗余力的提高android系统的安全性, 而针对su 这个即令人恨,又令人爱的命令,就痛下杀手。下面我从三个方面说明.
1. 限制user 版本adbd process 的capabilities bound set. 循环CAPBSET_DROP 动作,将Process 的root capabilities 进行了强行限制。仅仅保留了CAP_SETUID, CAP_SETGID 这两项,用于run-as 使用,可参考alps/system/core/adb/adb.c 中的 drop_capabilities_bounding_set_if_need 函数。
这样导致的情况是,在user 版本中usb debug 的su 受到极大的限制,仅仅能够模拟对应的uid/gid, 而无法拿去真正的root 权限.
2. 限制所有app 的capabilities bound set, 在android 4.4 上,zygote fork app 时,特意对所有fork 出来的子进程,进行了CAPBSET_DROP 动作,将Process 的root capabilities 进行了强行限制。 使得即使这些APK 徒有Root 权限,而无真实的capabilites. 在4.4.4 以及L 版本上, 还会使用prctl 下PR_SET_NO_NEW_PRIVS 指令,
限制子进程权限的提升.
这样导致的情况是, app 执行su 时,其权限受到了严格的管控,比如无法逃脱DAC 权限管控。但因为依旧具有root uid/gid, 所以在framework 层的permission 限制上依旧畅通无阻。
详情请参考FAQ: https://online.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ11538
3. SElinux 权限限制。 在user 版本上,没有导入有效的SU SElinux policy, 这样一旦本身受SElinux 限制的process 使用su 时,同样会受到SElinux 的限制。
(3.1). 在KK 版本只有4个process 会受到此影响,即zygote, netd, installd, vold.
消除这种限制的手法即是external/sepolicy/android.mk 里面的
ifeq ($(TARGET_BUILD_VARIANT),user)
BOARD_SEPOLICY_IGNORE+=external/sepolicy/su.te
else
BOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.te
endif
更新成:
ifeq ($(TARGET_BUILD_VARIANT),user)
BOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.te
else
BOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.te
endif
(3.2). 在L 版本则所有的Process 都会受到这样的影响.
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) : $(call build_policy, $(sepolicy_build_files))
@mkdir -p $(dir $@)
$(hide) m4 -D mls_num_sens=$(PRIVATE_MLS_SENS) -D mls_num_cats=$(PRIVATE_MLS_CATS) \
-D target_build_variant=$(TARGET_BUILD_VARIANT) \
-D force_permissive_to_unconfined=$(FORCE_PERMISSIVE_TO_UNCONFINED) \
-s $^ > $@
$(hide) sed '/dontaudit/d' $@ > $@.dontaudit
将-D target_build_variant=$(TARGET_BUILD_VARIANT) 改成 -D target_build_variant=eng
相关文章推荐
- 关于Android 4.4 后没有WRITE_SMS权限以及指定Android Studio2.3.3 SDK版本的问题
- KK版本上应用权限无法获取的问题
- Android Webview的使用中,onPageFinished方法和onReceivedError方法,onPageFinished在4.4版本会被多次执行的问题
- 解决设置Android 23.0以上版本对SD卡的读写权限无效的问题
- android版本sdk动态获取权限问题
- Android 关于各版本悬浮窗权限的问题
- 为什么 Android 4.4 KitKat 限制第三方应用的 SD 卡读写权限?
- Android 6.0以上版本添加录音权限checkSelfPermission报错问题
- Android 4.4及以上版本写入外置SD卡问题
- Android不同系统版本的悬浮窗权限问题
- Android 4.4 的权限问题,导致App 裁剪图片不能保存(已解决)
- 相机拍照功能之权限和Android版本问题
- 【Android】图片剪裁类库,解决com.android.camera.action.CROP在4.4版本以上遇到的intent类型问题
- Android工具之解决安卓6.0以上版本不能读取外部存储权限的问题
- android user用户版本提高adb权限
- Android 4.4 eng版本 红框问题
- 关于android 4.4以上版本从相册选取图片加载不了图片的问题
- Android中使用"hacker"方式解决ServiceManager的权限限制问题(1)
- 相机拍照功能之权限和Android版本问题
- Android 8.0 user版本adb remount后系统卡死问题分析