Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> SEAndroid相關總結

SEAndroid相關總結

編輯:關於Android編程

有時候會遇到selinux相關的問題,今天來做一下總結:

打開和關閉selinux功能

如果出現了selinux相關的權限拒絕,則在kernel log 或者android log中都有對應的”avc: denied”,當然也可能和selinux的模式有關系,我們需要首先要確認當時SELinux 的模式, 是enforcing mode 還是 permissve mode.

如果問題容易復現,我們可以先將SELinux 模式調整到Permissive mode,然後再測試確認是否與SELinux 約束相關.
在ENG 版本中:

adb shell setenforce 0

setenforce 0 設置SELinux 成為permissive模式 臨時關閉selinux
setenforce 1  臨時打開selinux 

另外當出現selinux相關問題,我們可以通過下面的命令來抓取對應的log

adb shell dmesg | grep avc
adb shell "cat /proc/kmsg | grep avc" > avc_log.txt

根據log來寫出需要缺少的權限

07-06 05:09:22.397 I/auditd  (  627): avc:  denied  { find } for service=ext_telephony_service_impl pid=11765 uid=10024 scontext=u:r:priv_app:s0:c512,c768 tcontext=u:object_r:ext_telephony_service_server:s0 tclass=service_manager permissive=1 

缺少什麼權限:  缺少 find 權限
誰缺少權限: scontext=u:r:priv_app:s0                                    
對哪個文件缺少權限: tcontext=u:object_r:ext_telephony_service_server               
什麼類型的文件:  tclass=service_manager   

allow priv_app ext_telephony_service_server:service_manager {find}

可以看到上面我們根據log,以及scontext,tcontext,tclass的值反推出當前缺少的權限以及那個類型的文件缺少什麼權限,進而可以寫出當前的配置。

audit(0.0:53): avc: denied { execute } for path="/data/data/com.mofing/qt-reserved-files/plugins/platforms/libgnustl_shared.so" dev="nandl" ino=115502 scontext=u:r:platform_app:s0 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=0  

缺少什麼權限:  缺少 execute 權限
誰缺少權限: scontext=u:r:platform_app:s0                                  
對哪個文件缺少權限: tcontext=u:object_r:app_data_file             
什麼類型的文件: tclass=file   

allow platform_app app_data_file:file execute

如果是多個權限的添加可以使用下面方式:
allow mediaserver acdb_delta_file:file { create open read append getattr };

需要注意的是:
1. 有時候avc denied的log不是一次性顯示所有問題,要等解決一個權限問題之後,才會提示另外一個權限問題, 比如提示確實某個目錄的read權限,你加入read之後,再顯示缺少write權限,要你一次次一次試,一次一次加。
這時你可以簡單粗暴寫個rw_dir_perms,這個權限包含了{open search write …}等等很多權限,我們可以查看external/sepolicy/global_macros來了解更多權限聲明;
2. 要加入的權限很多時,可以用中括號,比如
allow engsetmacaddr vfat:dir { search write add_name create};

使修改生效

在sourcecode/external/sepolicy 目錄下的對應模塊的policy.mk做更改,添加或者移除我們修改的.te文件

BOARD_SEPOLICY_UNION += \
    audioserver.te \
    chargemon.te \
    config_linker.te \
    display_cc.te \
    priv_app.te \
    qns.te \
    rild.te \
    secd.te \
    system_app.te \
    system_server.te \
    thermal-engine.te \
    wvkbd.te

查看文件和進程的權限配置

查看進程的權限

ps -Z 

查看文件的權限

ls -Z

u:object_r:app_data_file:s0:c512,c768 appmetadata 
u:object_r:app_data_file:s0:c512,c768 fileinternal
u:object_r:app_data_file:s0:c512,c768 gaClientId  

SEAndroid框架

在SEAndroid中,每一個進程和文件都會關聯有一個安全上下文。這個安全上下文由用戶、角色、類型、安全級別四個部分組成,每一部分通過一個冒號來分隔,
分別是SELinux用戶、SELinux角色、類型、安全級別,格式為“user:role:type:sensitivity”。

users定義在這裡:

source/system/sepolicy/users

roles定義在這裡:

source/system/sepolicy/roles

在SEAndroid中:
file_type 用來標注文件的安全上下文中的類型
domain 用來標注進程的安全上下文的類型
並且每一個用來描述文件安全上下文的類型都將file_type設置為其屬性,每一個用來進程安全上下文的類型都將domain設置為其屬性。

sepolicy結構

a. App進程 -> mac_permissions.xml
b. App數據文件 -> seapp_contexts
c. 系統文件 -> file_contexts
d. 系統屬性 -> property_contexts
以上文件均位於external/sepolicy目錄中。

te文件常見的四種命名規則

allow:賦予某項權限。 allowaudit:audit含義就是記錄某項操作。默認情況下是SELinux只記錄那些權限檢查失敗的操作。allowaudit則使得權限檢查成功的操作也被記錄。注意,allowaudit只是允許記錄,它和賦予權限沒關系。賦予權限必須且只能使
用allow語句。 dontaudit:對那些權限檢查失敗的操作不做記錄。 neverallow:前面講過,用來檢查安全策略文件中是否有違反該項規則的allow語句

在te文件中,我們一般遇到的語法是這樣的:

rule_name source_type target_type:class perm_set
解讀為: 為source_type設置一個rule_name的規則,規則是對target_type的class 進行 perm_set的操作。

下面拿些栗子給大家嘗嘗:

neverallow { appdomain -unconfineddomain } kmem_device:chr_file { read write };
絕對不允許app(除了有unconfineddomain屬性的app)對kmem_device類型的字符設備進行讀寫的操作

neverallow { appdomain -unconfineddomain } self:capability2 *;
絕對不允許除了unconfineddomain以外的app對self類型的capability2進行任何的操作

type httpd_user_content_t, file_type, httpdcontent;
聲明一個httpd_user_content_t的類型,具有file_type和httpdcontent的屬性

type httpd_user_content_t;
聲明一個httpd_user_content_t的類型
typeattribute httpd_user_content_t file_type, httpdcontent;
定義httpd_user_content_t具有file_type, httpdcontent的屬性

allow user_t bin_t:file ~{ write setattr ioctl };
允許user_t對bin_t類型的file進行除了write setattr ioctl相關的操作

type_transition system wifi_data_file:sock_file system_wpa_socket;
當一個類型為system的類別去進行wifi_data_file類型的sock_file訪問時,類型默認切換到system_wpa_socket

allow {user_t domain} {bin_t file_type sbin_t}:file execute ;
允許user_t和domain屬性的類對bin_t, file_type, sbin_t類型的file進行可執行的操作

allow init unlabeled:filesystem mount;
允許init類型對unlabeled類型的filesystem進行mount的操作

allow init fotad:unix_stream_socket { bind create };
允許init類型對fotad類型的unix_stream_socket 進行bind和create的操作

type和class命令

一個Type所具有的權限是通過allow語句來描述的,

allow unconfineddomain domain:binder { call transfer set_context_mgr };  

表明domain為unconfineddomain的進程可以與其它進程進行binder ipc通信(call),並且能夠向這些進程傳遞Binder對象(transfer),以及將自己設置為Binder上下文管理器(set_context_mgr)

type命令格式

type的命令如下:

type type_id [alias alias_id,] [attribute_id] 

將type_id(別名為alias)關聯到attribute. 這樣的話,方便用attribute來管理不同的type中包含相同的屬性的部分。


type init, domain;
將init關聯到domain,即將domain設置為init類型的屬性

class命令的格式

class class_name [ inherits common_name ] { permission_name ... }

inherits表示繼承了common定義的權限,然後自己額外實現了permission_name的權限

以上就是最近關於SEAndroid的記錄,以後會不斷更新該篇,或者等到自己相對理清了SEAndroid,會分開來記錄學習。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved