編輯:關於Android編程
有時候會遇到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
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中,每一個進程和文件都會關聯有一個安全上下文。這個安全上下文由用戶、角色、類型、安全級別四個部分組成,每一部分通過一個冒號來分隔,
分別是SELinux用戶、SELinux角色、類型、安全級別,格式為“user:role:type:sensitivity”。
users定義在這裡:
source/system/sepolicy/users
roles定義在這裡:
source/system/sepolicy/roles
在SEAndroid中:
file_type 用來標注文件的安全上下文中的類型
domain 用來標注進程的安全上下文的類型
並且每一個用來描述文件安全上下文的類型都將file_type設置為其屬性,每一個用來進程安全上下文的類型都將domain設置為其屬性。
a. App進程 -> mac_permissions.xml b. App數據文件 -> seapp_contexts c. 系統文件 -> file_contexts d. 系統屬性 -> property_contexts 以上文件均位於external/sepolicy目錄中。
在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所具有的權限是通過allow語句來描述的,
allow unconfineddomain domain:binder { call transfer set_context_mgr }; 表明domain為unconfineddomain的進程可以與其它進程進行binder ipc通信(call),並且能夠向這些進程傳遞Binder對象(transfer),以及將自己設置為Binder上下文管理器(set_context_mgr)
type的命令如下:
type type_id [alias alias_id,] [attribute_id] 將type_id(別名為alias)關聯到attribute. 這樣的話,方便用attribute來管理不同的type中包含相同的屬性的部分。 type init, domain; 將init關聯到domain,即將domain設置為init類型的屬性
class class_name [ inherits common_name ] { permission_name ... } inherits表示繼承了common定義的權限,然後自己額外實現了permission_name的權限
以上就是最近關於SEAndroid的記錄,以後會不斷更新該篇,或者等到自己相對理清了SEAndroid,會分開來記錄學習。
1.view的滑動,六種滑動方式:一:通過layout來實現滑動效果package com.example.testdragview;import android.con
有段時間沒寫博客了,可能寫博客的時間都用去把妹了吧。說到把妹,偶爾也會在無意間了解一些把妹的技巧,比如雲擒故縱啊什麼的。可能這些技巧前期會有一定的作用,可能會讓妹子對你產
版本控制是項目開發過程中必不可少的部分,不管是個人還是團隊,靈活的使用版本控制將會使項目開發變得更加輕松。Android Studio集成了版本控制系統,目前支持CVS、
在網絡加載數據的時候通常需要很多時間,這個時候程序裡面經常需要寫一個提示正在加載數據的彈窗,這篇文章用兩種方式實現帶動畫效果的Dialog:幀動畫實現和GIF動態圖實現,