標籤:android root su 許可權
android 4.4 版本後,su 許可權嚴重被限制, 如無法直接存取data 地區,無法直接remount system image, 無法設定system property。
Google 不遺餘力的提高android系統的安全性, 而針對su 這個即令人恨,又令人愛的命令,就痛下殺手。主要體現在三個方面:
1. 限制user 版本adbd process 的capabilities bound set。迴圈CAPBSET_DROP 動作,將Process的root capabilities 進行了強行限制。僅僅保留了CAP_SETUID, CAP_SETGID 這兩項,用於run-as使用,可參考源碼中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.
這樣導致的情況是, app 執行su 時,其許可權受到了嚴格的管控,比如無法逃脫DAC 許可權管控。但因為依舊具有root uid/gid, 所以在framework 層的permission 限制上依舊暢通無阻。
3. SElinux 許可權限制。 在user 版本上,沒有匯入有效SElinux policy, 這樣一旦本身受SElinux 限制的process 使用su 時,同樣會受到SElinux 的限制。 目前只有4個process 會受到此影響,即zygote, netd, installd, vold.消除這種限制的手法即是external/sepolicy/android.mk 裡面的
ifeq ($(TARGET_BUILD_VARIANT),user)BOARD_SEPOLICY_IGNORE+=external/sepolicy/su.teelseBOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.teendif
更新成:
ifeq ($(TARGET_BUILD_VARIANT),user)BOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.teelseBOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.teendif
轉載請註明出處:周木水的CSDN部落格 http://blog.csdn.net/zhoumushui
我的GitHub:周木水的GitHub https://github.com/zhoumushui
Android 4.4限制Root許可權的邏輯