訪問文件的SELinux權限添加

最近做了一個功能:設備首次駐網時,在設備指定目錄創建文件,並在此文件中寫入當前的時間,然後通過暗碼可以讀取這個時間

這個功能挺簡單的,唯一比較麻煩的是添加SELinux權限時的一些問題,在此記錄一下。

首先通過rc文件創建一個目錄

init.rc

mkdir /data/vendor/time_code 0771 radio radio

然後設備首次駐網時在此目錄下創建txt文件,"/data/vendor/time_code/time_code.txt",此時SELinux權限問題就來了,如下所示:
SELinux權限拒絕
ps:如何確認是 SELinux 問題?可以關閉 SELinux(adb shell setenforce 0),確認相關功能是否 ok,如果 ok 是 SELinux 問題,如果nok,說明本身程序有問題

上述的SELinux報的權限並不全,通常SELinux打開時不會一次性打印出所有缺少權限,可以先將SELinux關閉,在通過adb logcat或者adb shell dmesg打印全部缺少權限

SELinux報錯的標準格式是:

  avc: denied  { 操作權限  }  for pid=26382  comm=“進程名” 
  scontext=u:r:源類型:s0  tcontext=u:r:目標類型:s0  
  tclass=訪問類型 permissive=0

添加規則是,在源類型.te文件中添加 :

allow  源類型 目標類型:訪問類型 {操作權限};

例如上圖報出的log:
05-11 16:39:13.249 1950 1950 W SharedPreferenc: type=1400 audit(0.0:99): avc: denied { read } for name=“time_code.txt” dev=“mmcblk0p65” ino=27156 scontext=u:r: radio:s0 tcontext=u:object_r:vendor_data_file:s0 tclass=file permissive=0

我們就應該在radio.te中添加:allow radio vendor_data_file:file { read };

添加SELinux權限的一個原則就是報出來什麼,添加什麼,上述log中缺少權限並沒有報全,最終添加全部缺少權限如下:

allow radio vendor_data_file:dir rw_dir_perms;
allow radio vendor_data_file:file { open write read create rw_file_perms setattr};
allow radio vendor_data_file:file rename;
allow radio vendor_data_file:file unlink;

添加好了之後進行編譯,mmma system/sepolicy/,此時發現編不過,
在這裏插入圖片描述
這是因爲我們添加的SELinux權限違反了google的neverallow規則,google不允許名爲radio源類型訪問標籤名爲vendor_data_file的目標類型,

解決方案是修改我們要訪問的文件的標籤名vendor_data_file,如何修改呢?我們要訪問的目錄是/data/vendor/time_code/,先看一下這個目錄的信息
在這裏插入圖片描述
需要修改的標籤屬於文件類型,另外還有屬性類型和程序類型,對於文件類型標籤的修改就是自定義一個新的標籤,在file.te中定義,在file_contexts中使用,
file.te中添加如下語句:

type tct_time_data_file, file_type, data_file_type, mlstrustedobject;

file_contexts中添加如下語句:

/data/vendor/time_code(/.*)?       u:object_r:tct_time_data_file:s0

標籤就被修改爲了tct_time_data_file,然後再修改radio.te中的目標類型

allow radio tct_time_data_file:dir rw_dir_perms;
allow radio tct_time_data_file:file { open write read create rw_file_perms setattr};
allow radio tct_time_data_file:file rename;
allow radio tct_time_data_file:file unlink;

再進行編譯,mmma system/sepolicy/
在這裏插入圖片描述
編譯成功後push進手機驗證,
adb push out/target/product/dubaivzw/vendor/etc/selinux/ /vendor/etc/

首先ls -Z看看/data/vendor/time_code/的信息,可以看到,標籤名已經被修改
在這裏插入圖片描述
並且log中沒有再報SELinux權限的問題,/data/vendor/time_code/time_code.txt文件也成功創建了,此文件中也成功寫入了當前駐網時間:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章