[Android L]SEAndroid開放裝置檔案結點許可權(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)

來源:互聯網
上載者:User

標籤:

 

溫馨提示     建議你先瞭解一下上一篇博文([Android L]SEAndroid增強Androd安全性背景概要及帶來的影響)所講的內容,先對SEAndroid窺個全貌,然後再繼續本節內容。 1 現象描述 基於Android L版本源碼環境進行開發時,根據項目需求,APP層需要操作sys/xxx 或 proc/xxx下面的檔案結點,但是會報出以下許可權異常,無法直接操作這些結點LedLightFileUtil( 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)  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/sepolicyQCOM: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,如下:type sysfs_wingtk_leds, fs_type, sysfs_type; 3.1.2 在android/device/qcom/sepolicy/common/file_contexts,綁定sysfs_wingtk_leds到對應的實際節點,注意是實際節點/sys/devices/soc.0/gpio-leds.66/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0 PS:可以把/sys/class/leds/green/brightness也聲明下,該句不是必須的:/sys/class/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0 匯總:file_contexts的修改如下:/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,申請許可權:allow system_app sysfs_wingtk_leds:file rw_file_perms; PS:也可以為其他process申請相關的許可權,如:system_server,在android/device/qcom/sepolicy/common/system_server.teallow system_server sysfs_wingtk_leds:file rw_file_perms; PS:配置第2步的實際節點時,怎麼擷取實際節點,方法如下:[email protected]:/sys/class/leds # ll -Zlrwxrwxrwx root root u:object_r:sysfs:s0 flashlight -> ../../devices/soc.0/flashlight.64/leds/flashlightlrwxrwxrwx root root u:object_r:sysfs:s0 green -> ../../devices/soc.0/gpio-leds.66/leds/greenlrwxrwxrwx root root u:object_r:sysfs:s0 lcd-backlight -> ../../devices/soc.0/1a00000.qcom,mdss_mdp/qcom,mdss_fb_primary.124/leds/lcd-backlightlrwxrwxrwx 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/redlrwxrwxrwx 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平台為例修改記錄細節展開 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.tetype persist_backgrounddata_prop, property_type; 3.3.2 android/device/qcom/sepolicy/common/property_contextspersist.backgrounddata.enable u:object_r:persist_backgrounddata_prop:s0 3.3.3 android/device/qcom/sepolicy/common/system_app.te,為system_app進程開放許可權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.rcQCOM:xx/xx/init.target.rc 轉自:http://blog.csdn.net/yelangjueqi/article/details/46761987 

[Android L]SEAndroid開放裝置檔案結點許可權(讀或寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.