1. 问题
如题,Android运行的时候看log发现了如下的selinux权限相关的log,尝试将这个问题解决,下面记录一下解决的步骤。
行 804: E000001 01-01 08:00:02.700 311 311 I auditd : type=1400 audit(0.0:4): avc: denied { search } for comm="mke2fs" name="ext4" dev="sysfs" ino=19653 scontext=u:r:e2fs:s0 tcontext=u:object_r:sysfs_fs_ext4:s0 tclass=dir permissive=0
行 805: M000001 01-01 08:00:02.700 311 311 W mke2fs : type=1400 audit(0.0:4): avc: denied { search } for name="ext4" dev="sysfs" ino=19653 scontext=u:r:e2fs:s0 tcontext=u:object_r:sysfs_fs_ext4:s0 tclass=dir permissive=0
2. 分析
从上面的log可以得到如下信息:
scontext: u:r:e2fs:s0 // 谁缺少权限
tcontext: u:object_r:sysfs_fs_ext4:s0 // 对什么文件缺权限
tclass: dir // 缺权限的文件是什么类型
denied{search} // 缺少什么权限
有了这些信息,可以知道我们需要找到e2fs.te
的文件添加如下语句:
allow e2fs sysfs_fs_ext4:dir search;
3. 解决问题
3.1 添加权限
有了前面的分析,现在需要找到系统中这个e2fs.te
文件在什么位置,全局搜索了一下,应该是这个文件:
system/sepolicy/public/e2fs.te
# 同时还有当前使用的api下的文件也是需要做相应的修改
system/sepolicy/prebuilts/api/30.0/public/e2fs.te
注意上面的两个文件内容是相同的,为了不出差错,修改的时候也在同一个位置进行改动,修改后内容如下:
type e2fs, domain, coredomain;
type e2fs_exec, system_file_type, exec_type, file_type;
allow e2fs devpts:chr_file { read write getattr ioctl };
allow e2fs dev_type:blk_file getattr;
allow e2fs block_device:dir search;
allow e2fs userdata_block_device:blk_file rw_file_perms;
allow e2fs metadata_block_device:blk_file rw_file_perms;
allow e2fs dm_device:blk_file rw_file_perms;
allowxperm e2fs { userdata_block_device metadata_block_device dm_device }:blk_file ioctl {
BLKSECDISCARD BLKDISCARD BLKPBSZGET BLKDISCARDZEROES BLKROGET
};
allow e2fs {
proc_filesystems
proc_mounts
proc_swaps
}:file r_file_perms;
# access /sys/fs/ext4/features
allow e2fs sysfs_fs_ext4_features:dir search;
allow e2fs sysfs_fs_ext4_features:file r_file_perms;
# access SELinux context files
allow e2fs file_contexts_file:file r_file_perms;
allow e2fs sysfs_fs_ext4:dir search;
修改完成之后开始编译,此时发现有报错,sysfs_fs_ext4这个类型并没有定义,找不到该类型。
3.2 解决类型未定义问题
现在需要找到定义类型的文件,加上该类型的定义。找了一遍之后发现应该是如下文件定义:
system/sepolicy/public/file.te
system/sepolicy/prebuilts/api/30.0/public/file.te
这里找到的这两个文件还是相同的,因此修改完应该还是一样的。找到这个文件的适当的位置加上类型定义,由于文件较大,就不贴上全部代码了
# 可以找到这个文件其他的定义sysfs_fs相关的类型的地方进行定义
type sysfs_fs_ext4, sysfs_type, fs_type;
修改完成两个文件之后继续编译,此时报错中有关键字:duplicate,由于忘记截图了没法贴上,大概的意思就是这个类型重复定义了,看打印的log和packages/services/Carcar_product/sepolicy/public/file.te
冲突了,找到这个文件去掉了其中的定义。继续编译没有这个报错了。
现在有了新的问题,看log显式其他的26.0、27.0、28.0、29.0的api报错了。
3.3 其他api编译报错问题
大概是因为我给上层的file.te文件加上了新的类型,这些api虽然没有使用到,但是也需要更新进去。做如下修改:
# 对26.0、27.0、28.0、29.0几个文件夹做修改
# 路径: system/sepolicy/prebuilts/api/2?.0/public/file.te
# 加上如下内容
type sysfs_fs_ext4, sysfs_type, fs_type;
整编通过,刷机验证之后问题已经解决,相关的selinux没有了。
4. 总结
这里介绍的方法是在system/sepolicy下添加一个新类型的selinux配置,如果要修改的类型在file.te中已经定义过了,则只需要执行3.1的步骤就修改两个文件就可以了。