selinux相关命令
// 0--代表Permissive
// 1--代表Enforcing
setenforce 0
// 查看selinux开关状态
getenforce
// 查看进程的sContext
ps -Z
// 查看文件权限
ls -Z
如果设置成permissive mode 后问题依旧,说明还有其他的权限问题约束,否则就是SELinux 方面的问题
抓取SELinux Log
- adb shell dmesg
抓kernel log,使用命令:
adb shell "cat /proc/kmsg | grep avc" > avc_log.txt
可以直接提出avc的log
- adb logcat –b events
搜索关键字:avc: denied
selinux源码及内容
selinux权限在一些contexts及te文件中配置
contexts文件
contexts是权限的上下文,有如下contexts
file_contexts //系统中所有file_contexts安全上下文
seapp_contexts //app安全上下文
property_contexts //属性的安全上下文
service_contexts //service文件安全上下文
genfs_contexts //虚拟文件系统安全上下文
service_contexts定义
oem_lock u:object_r:oem_lock_service:s0
seapp_contexts有些不同,单独说明。列说明如下:
- oem_lock:系统中具体资源,如服务名、设备名、文件目录等
- u: selinux中唯一的用户
- object_r:描述资源类型。r为进程资源,object_r非进程资源
- oem_lock_service:资源在权限规则中所属代表
- s0:selinux中权限级别,一般使用s0
te文件
te文件定义权限规则,不同资源可以定义各自的te文件
te文件内容,示例
allow priv_app surfaceflinger_service:service_manager find;
allow priv_app app_api_service:service_manager find;
allow priv_app system_api_service:service_manager find;
allow priv_app persistent_data_block_service:service_manager find;
te文件内容的语法规则
rule_name source_type target_type : class perm_set
rule_name:赋予权限的规则,包含allow、dontaudit、auditallow、neverallow,命令不可以随意添加。
source_type:访问target_type的主体或主体集合(域),可自定义
target_type:接受主体访问的客体或客体集合(域),可自定义
class:客体资源类型,不同的资源类型具有不同访问权限,可自定义、可继承
perm_set:客体予以主体的权限说明。是class中具有的权限的子集
source_type、target_type使用type、typeattribute、attribute定义。
attribute定义一个代表具有某种相中属性的集合(即域)。
attribute dev_type;
type定义代表一个或一类资源类型,并分配至不同属性(域)中。
# 定义一个类型,属于dev_type属性
type ttyMT_device, dev_type;
以上定义可以拆分为两部分
# 仅定义一个类型
type ttyMT_device;
# 仅把ttyMT_device类型关联到dev_type属性
typeattribute ttyMT_device dev_type;
属性间使用逗号,一个类型可以关联至多个属性
type oem_lock_service, system_api_service, system_server_service, service_manager_type;
class字段使用comm和class定义,comm定义的class可以被class定义的对象继承。
common file {
ioctl read write create getattr setattr lock relabelfrom relabelto
append unlink link rename execute swapon quotaon mounton
}
class类型继承comm类型
class dir
inherits file
{
add_name
remove_name
reparent
search
rmdir
open
audit_access
execmod
}
contexts和te文件间的关系
以oem_lock为例,如下图:
// frameworks\base\core\java\android\content\Context.java
/**
* Use with {@link #getSystemService} to retrieve a {@link
* android.service.oemlock.OemLockManager} instance for managing the OEM lock.
*
* @see #getSystemService
* @see android.service.oemlock.OemLockManager
* @hide
*/
@SystemApi
public static final String OEM_LOCK_SERVICE = "oem_lock";
在这里插入代码片
定义oem_lock权限:
涉及文件
---- oem_lock_service Matches (3 in 3 files) ----
priv_app.te (F:\Android\source_code\android-8.0.0_r1\system\sepolicy\private) line 34 : allow priv_app oem_lock_service:service_manager find;
service.te (F:\Android\source_code\android-8.0.0_r1\system\sepolicy\public) line 100 : type oem_lock_service, system_api_service, system_server_service, service_manager_type;
service_contexts (F:\Android\source_code\android-8.0.0_r1\system\sepolicy\private) line 108 : oem_lock
service_contexts定义
oem_lock u:object_r:oem_lock_service:s0
service.te中定义
type oem_lock_service, system_api_service, system_server_service, service_manager_type;
priv_app.te中定义
allow priv_app oem_lock_service:service_manager find;