天天看點

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

溫馨提示

     建議你先了解一下上一篇博文([Android L]SEAndroid增強Androd安全性背景概要及帶來的影響)所講的内容,先對SEAndroid窺個全貌,然後再繼續本節内容。

1 現象描述

基于Android L版本源碼環境進行開發時,根據項目需求,APP層需要操作sys/xxx 或 proc/xxx下面的檔案結點,但是會報出以下權限異常,無法直接操作這些結點 L edLightFileUtil( 4671): java.io.FileNotFoundException: /sys/class/leds/green/brightness: open failed: EACCES (Permission denied) LedLightFileUtil( 4671): at libcore.io.IoBridge.open(IoBridge.java:456) LedLightFileUtil( 4671): at java.io.FileOutputStream.<init>(FileOutputStream.java:87) LedLightFileUtil( 4671): at java.io.FileOutputStream.<init>(FileOutputStream.java:127) LedLightFileUtil( 4671): at java.io.FileOutputStream.<init>(FileOutputStream.java:116)

【聲明】歡迎轉載,但請保留文章原始出處: http://blog.csdn.net/yelangjueqi/article/details/46761987

2 問題原因

自Android L版本,Google對源碼環境普遍啟用SELinux安全通路機制,APP及framework層預設情況下再無權限通路裝置節點如(sys/xxx,proc/xxx)

3 解決方法

下面以三種常用操作角度闡述為system app程序或system server程序開放權限的方法 1) SEAndroid 為sys裝置檔案結點開放通路(讀或寫)權限的方法(如:/sys/class/leds/green/brightness) 2) SEAndroid 為proc裝置檔案結點開放通路(讀或寫)權限的方法(如:/proc/touchscreen_feature/gesture_data) 3) SEAndroid 為SystemProperties的自定義屬性開放set(寫)權限的方法

3.1 SEAndroid 為sys裝置檔案結點開放通路(讀或寫)權限的方法(如:/sys/class/leds/green/brightness)

以操作LED燈的裝置檔案節點為例進行說明,如綠燈:/sys/class/leds/green/brightness,為APP層system app程序開放該節點通路權限(讀或寫) 綠燈: /sys/class/leds/green/brightness //快捷方式 /sys/devices/soc.0/gpio-leds.66/leds/green/brightness //實際節點

PS:預設是在external/sepolicy目錄下面,但是MTK平台和QCOM平台都建立了自己管理SELinux policy的目錄: MTK:alps/device/mediatek/common/sepolicy QCOM:android/device/qcom/sepolicy/common 是以建議你在其平台的相應目錄下面去操作,下面以QCOM平台為例,MTK平台配置步驟方法是一樣的(alps/device/mediatek/common/sepolicy)

3.1.1 在android/device/qcom/sepolicy/common/file.te,定義selinux type:sysfs_wingtk_leds,如下:

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

type sysfs_wingtk_leds, fs_type, sysfs_type;

3.1.2 在android/device/qcom/sepolicy/common/file_contexts,綁定sysfs_wingtk_leds到對應的實際節點,注意是實際節點

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

/sys/devices/soc.0/gpio-leds.66/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0

PS:可以把/sys/class/leds/green/brightness也聲明下,該句不是必須的:

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

/sys/class/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0

彙總:file_contexts的修改如下:

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

/sys/class/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0 /sys/devices/soc.0/gpio-leds.66/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0

3.1.3 在android/device/qcom/sepolicy/common/system_app.te,申請權限:

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

allow system_app sysfs_wingtk_leds:file rw_file_perms;

PS:也可以為其他process申請相關的權限,如:system_server,在android/device/qcom/sepolicy/common/system_server.te

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

allow system_server sysfs_wingtk_leds:file rw_file_perms;

PS:配置第2步的實際節點時,怎麼擷取實際節點,方法如下:

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

[email protected]:/sys/class/leds # ll -Z lrwxrwxrwx root root u:object_r:sysfs:s0 flashlight -> ../../devices/soc.0/flashlight.64/leds/flashlight lrwxrwxrwx root root u:object_r:sysfs:s0 green -> ../../devices/soc.0/gpio-leds.66/leds/green lrwxrwxrwx root root u:object_r:sysfs:s0 lcd-backlight -> ../../devices/soc.0/1a00000.qcom,mdss_mdp/qcom,mdss_fb_primary.124/leds/lcd-backlight lrwxrwxrwx root root u:object_r:sysfs:s0 mmc0:: -> ../../devices/soc.0/7824900.sdhci/leds/mmc0:: lrwxrwxrwx root root u:object_r:sysfs:s0 mmc1:: -> ../../devices/soc.0/7864900.sdhci/leds/mmc1:: lrwxrwxrwx root root u:object_r:sysfs:s0 red -> ../../devices/soc.0/gpio-leds.66/leds/red lrwxrwxrwx root root u:object_r:sysfs:s0 torch-light0 -> ../../devices/soc.0/qcom,camera-led-flash.65/leds/torch-light0 [email protected]:/sys/class/leds #

通過 ll -Z 指令就可以查到。

3.1.4 在AndroidManifest.xml,配置:android:sharedUserId="android.uid.system",該步時必須的,因為第三步是: allow system_app sysfs_wingtk_leds:file rw_file_perms; //僅允許system_app程序通路.

經過以上四步,APP層就可以正常讀寫:/sys/class/leds/green/brightness

為了更好地控制通路權限,如果存在APP層和framework層都要通路某個裝置節點,筆者認為最好以此模式來通路裝置節點,即不讓system_app程序通路,僅僅允許system_server程序來通路,如下: allow system_server sysfs_wingtk_leds:file rw_file_perms;

缺點:需要在framework層添加随系統啟動的service,增加代碼量 優點:1.可以自由控制哪些應用可以通路,哪些應用禁止通路已經開放的裝置節點,可以更好的保護安全問題        2.framework層和APP層都可以通路該裝置節點.不用再另外進行權限申請

3.2 SEAndroid 為proc裝置檔案結點開放通路(讀或寫)權限的方法(如:/proc/touchscreen_feature/gesture_data),以MTK平台為例

修改記錄

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

細節展開

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

3.2.1 在alps/mediatek/common/sepolicy/file.te 定義selinux type: proc_quick_gesture,如下: type proc_quick_gesture, fs_type;

3.2.2 在 alps/mediatek/common/sepolicy/genfs_contexts,綁定proc_quick_gesture到對應的實際節點 genfscon proc /touchscreen_feature/gesture_data   u:object_r:proc_quick_gesture:s0

3.2.3 在alps/mediatek/common/sepolicy/common/system_app.te,申請權限 allow system_app proc_quick_gesture:file rw_file_perms;

3.2.4 在AndroidManifest.xml,配置:android:sharedUserId="android.uid.system" 經過以上4步,system_app程序就具備權限(讀或寫)通路 /proc/touchscreen_feature/gesture_data等節點啦

3.3 SEAndroid 為SystemProperties的自定義屬性開放set(寫)權限的方法

問題描述 SystemProperties對自定義屬性沒有寫權限,即set時提示沒有權限,導緻寫不成功 解決方法 以"persist.backgrounddata.enable"為例介紹開放屬性權限方法

以QCOM平台為例 3.3.1 android/device/qcom/sepolicy/common/property.te

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

type persist_backgrounddata_prop, property_type;

3.3.2 android/device/qcom/sepolicy/common/property_contexts

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

persist.backgrounddata.enable u:object_r:persist_backgrounddata_prop:s0

3.3.3 android/device/qcom/sepolicy/common/system_app.te,為system_app程序開放權限

[Android L]SEAndroid開放裝置檔案結點權限(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門幹貨1 現象描述2 問題原因3 解決方法

allow system_app persist_backgrounddata_prop:property_service set;

3.3.4 在AndroidManifest.xml,配置:android:sharedUserId="android.uid.system"

經過以上4步,就可以使用SystemProperties.set("persist.backgrounddata.enable"", xx)設定屬性了。

延伸閱讀

如果通過以上步驟正确配置之後,你仍沒有權限讀寫sys或proc節點,是不是DAN都碎了。再告訴你下,你需要到init.rc裡面配置: chown system system 檔案結點,然後chmod下檔案結點。兩個平台配置路徑,項目不同略有差異 MTK:alps/device/mediatek/mt6735/init.mt6735.rc QCOM:xx/xx/init.target.rc

繼續閱讀