Android 系統添加SELinux權限

本文爲博主原創文章,轉載請註明出處:https://i.cnblogs.com/EditPosts.aspx?postid=11185476ios

 

CPU:RK3288git

系統:Android 5.1shell

 

SELinux 主要由美國國家安全局開發。2.6 及以上版本的 Linux 內核都已經集成了 SELinux 模塊。安全

 

經過虛擬文件系統 proc 來讀寫 gpio 的方法很是受歡迎,不只由於其省去了 hal 層、 jni 層的代碼,並且能夠直接經過 adb shell 來讀寫 gpio。app

在 user 版本,雖然驅動代碼中已經將節點權限設置爲 777 或者 666,可是在 adb shell 中寫 gpio 時會報出權限不足的問題。dom

 

最快的解決辦法是將系統編譯成 userdebug 版本或者 eng 版本,也能夠對系統 root。ide

 

下面是編譯成 user 版本的解決方法,前提是驅動已經OK。post

cust_gpios 是驅動中經過 proc_mkdir 建立的目錄,relay 是經過 proc_create 建立的節點,對應一個方向爲輸出 gpioui

一、在 adb 中讀,沒有問題,可是寫 gpio 會報出權限不足spa

shell@rk3288:/proc/cust_gpios $ cat relay
cat relay
1
shell@rk3288:/proc/cust_gpios $ echo 0 > relay
echo 0 > relay
/system/bin/sh: can't create relay: Permission denied

kenel 中打印出的錯誤信息以下

type=1400 audit(1358758415.820:7): avc: denied { write } for pid=1229 comm="sh" name="relay" dev="proc" ino=4026533065 scontext=u:r:shell:s0 tcontext=u:object_r:proc:s0 tclass=file permissive=0

解釋:

write:表示沒有 write 權限

shell:shell 中缺乏權限,文件名與此相同,xxx.te

proc:proc 文件系統缺乏權限

file:file 類型的文件

 

二、添加 shell 權限,scontext 對應的是 shell ,因此須要在 shell.te 最後面中添加

path:\device\rockchip\common\sepolicy\shell.te

allow shell proc:file write;

 

三、添加後編譯會報錯以下,這是由於添加了不容許的規則

libsepol.report_failure: neverallow on line 344 of external/sepolicy/app.te (or line 4313 of policy.conf) violated by allow shell proc:file { write };

須要在 app.te 中的 344 行中不容許的規則中刪除添加的權限,用大括號括起來

path:\external\sepolicy\app.te

neverallow {appdomain -shell}
    proc:dir_file_class_set write;

 

此時能夠在 adb 來經過 proc 虛擬文件系統正常讀寫 gpio

 

四、操做 gpio 最終要由上層 apk 來讀寫,一樣寫 gpio 時,kernel 和 logcat 都會報出權限不足,解決方法與上面相似

type=1400 audit(1358758857.090:8): avc: denied { write } for pid=1208 comm="ron.gpiocontorl" name="relay" dev="proc" ino=4026533065 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:proc:s0 tclass=file permissive=0

 

添加權限

path:device\rockchip\common\sepolicy\untrusted_app.te

allow untrusted_app proc:file write;

添加後編譯報錯

libsepol.report_failure: neverallow on line 344 of external/sepolicy/app.te (or line 4313 of policy.conf) violated by allow untrusted_app proc:file { write };


刪除不容許的權限

path:\external\sepolicy\app.te

neverallow {appdomain -shell -untrusted_app}
    proc:dir_file_class_set write;

 

此時 adb 和 apk 中都能正常讀寫 gpio。

 

下面是 RK3288 Android 5.1 添加權限的完整補丁

diff --git a/device/rockchip/common/sepolicy/shell.te b/device/rockchip/common/sepolicy/shell.te
index be7a221..f382240 100644
--- a/device/rockchip/common/sepolicy/shell.te
+++ b/device/rockchip/common/sepolicy/shell.te
@@ -3,3 +3,4 @@ allow shell toolbox_exec:file { read getattr open execute execute_no_trans };
 allow shell logcat_exec:file { read getattr open execute execute_no_trans };
 allow shell serial_device:chr_file rw_file_perms;
 allow shell proc_cpuinfo:file mounton;
+allow shell proc:file write;

diff --git a/device/rockchip/common/sepolicy/untrusted_app.te b/device/rockchip/common/sepolicy/untrusted_app.te
index 8c0f740..69cfc0d 100644
--- a/device/rockchip/common/sepolicy/untrusted_app.te
+++ b/device/rockchip/common/sepolicy/untrusted_app.te
@@ -6,3 +6,4 @@ allow untrusted_app kernel:system { module_request };
 allow untrusted_app binfmt_misc:dir { search };
 allow untrusted_app binfmt_misc:file { read open };
 allow untrusted_app video_device:chr_file { read write open ioctl };
+allow untrusted_app proc:file write;

diff --git a/external/sepolicy/app.te b/external/sepolicy/app.te
index ca08d74..0400047 100644
--- a/external/sepolicy/app.te
+++ b/external/sepolicy/app.te
@@ -340,7 +340,7 @@ neverallow { appdomain -shell } efs_file:dir_file_class_set read;
 # Write to various pseudo file systems.
 neverallow { appdomain -bluetooth -nfc }
     sysfs:dir_file_class_set write;
-neverallow appdomain
+neverallow {appdomain -shell -untrusted_app}
     proc:dir_file_class_set write;
 
 # Access to syslog(2) or /proc/kmsg.
相關文章
相關標籤/搜索