1.SElinux三种权限:
enforcing:强制模式、代表SELinux运行中,且已经正确的开放限制 domain/type。
permissive:宽容模式、代表SELinux运行中,不过金会有警告信息并不会直接限制 domian/type。
disabled:关闭模式、SELinux 关闭状态
2.基础权限的配置
比如内核报这样的错:
[ 172.554381] type=1400 audit(22611.739:4): avc: denied { getattr } for pid=257 comm="demo" path="/system/rfs" dev="mmcblk0p42" ino=2070 scontext=u:r:recovery:s0 tcontext=u:object_r:rfs_system_file:s0 tclass=dir permissive=0
[ 173.287498] type=1400 audit(22612.479:5): avc: denied { relabelfrom } for pid=257 comm="demo" name="rfs" dev="mmcblk0p42" ino=2070 scontext=u:r:recovery:s0 tcontext=u:object_r:rfs_system_file:s0 tclass=dir permissive=0123
在相应的te、文件中增加语句,语句格式为:
allow sourcecontext targetcontext:class 许可;
sourcecontext指的是“scontext=u:r:recovery:s0”的recovery
targetcontext指的是“tcontext=u:object_r:rfs_system_file:s0”中的rfs_system_file
class指的是“tclass=dir”中的dir
许可指的是“{}”中的getattr
所以在demo.te中增加语句:
allow recovery rfs_system_file:dir getattr;
另外的下一行的报错语句增加权限的是
allow recovery rfs_system_file:dir relabelfrom;
3.特殊权限Ioctl配置
08-07 10:49:20.149 4795 4795 I iwpriv : type=1400 audit(0.0:3457): avc: denied { ioctl } for path="socket:[1607798]" dev="sockfs" ino=1607798 ioctlcmd=8bfc scontext=u:r:system_app:s0 tcontext=u:r:system_app:s0 tclass=udp_socket permissive=1
从上面的日志来看,按照我们通用的添加权限的方式规则,应该如下:
allow system_app self:udp_socket ioctl;
但是实际效果如何???
操作依然被denied,这是由于ioctl的控制在底层划分的更细,需要允许对应ioctlcmd操作
具体方法为:
1、查找对应的ioctlcmd在ioctl_defines中的定义,如上文中的8bfc,对应的是SIOCIWFIRSTPRIV_1C(在对应的系统中查看定义)
2、在对应的文件加入如下的配置:
allowxperm system_app self:udp_socket ioctl SIOCIWFIRSTPRIV_1C;
这样,在ioctl操作时,对应的ioctlcmd就会被允许了。
4.新增APP类型
当前系统中app的domain和文件类型默认的分配原则为:
1、platform签名 + share systemuid -> system_app + system_app_data_file;
2、platform签名 + 普通用户-> platform_app + app_data_file;
3、platform签名 + 特定用户 : 如bluetooth,对应的domain为bluetooth + bluetooth_data_file
4、三方应用 -> untrusted_app + app_data_file
根据特性需求,需要新增app类型:
1、system/sepolicy/mac_permissions.xml
2、seapp_contexts
user=_app seinfo=theme name=com.nearme.themespace* domain=theme_app type=theme_app_data_file levelFrom=user
3、file.te
type theme_app_data_file, file_type, data_file_type;
4、theme_app.te
type theme_app, domain, mlstrustedsubject;
这样,签名是@THEME(定义在system/sepolicy/keys.conf文件)和包名是comthemespace的应用,domain是theme_app,对应的文件类型是theme_app_data_file
5.新增修改文件类型
如某些需求,需要新增文件类型,只允许特定的domain访问,如存放字体文件的目录,只允许主题应用写入和删除,其他domain只有读的权限。
1、file_contexts
/data/system/font(/.*)? u:object_r:font_data_file:s0
2、file.te
type font_data_file, file_type, data_file_type;
3、system/core/rootdir/init.rc
在restorecon_recursive /data之前加入:
mkdir /data/system/font 0777 system system
chmod 0777 /data/system/font
这样,adb shell ls -l -Z /data/system/font 查看到的就是上面配置的文件类型:
-rwxrwxrwx 1 u0_a18 u0_a18 u:object_r:font_data_file:s0:c512,c768 3553188 2017-08-19 16:40 Regular.ttf
6.新增可执行程序和service
在init.rc中新增service,但没有对应的bin,一般通过sh脚本启动一些功能。这类service,需要在配置rc时,加上seclabel操作,之后,init启动service时,就会根据这个关键字解析出对应的context。以screen_record service为例
1、system/core/rootdir/init.rc
service screen_record /system/bin/sh /autochmod.sh "screen_record”
…
seclabel u:r:screen_record:s0
2、screen_record.te
type screen_record, domain;
type screen_record_exec, exec_type, file_type;
init_daemon_domain(screen_record)
binder_use(screen_record)
allow screen_record shell_exec:file {read open execute_no_trans execute getattr entrypoint};
allow screen_record rootfs:lnk_file {getattr};
allow screen_record rootfs:file {read open};
allow screen_record system_file:file { read open execute_no_trans };
allow screen_record toolbox_exec:file { read open execute_no_trans execute getattr};
allow screen_record self:capability dac_override;
allow screen_record self:process execmem;
如上,新增service需要的默认权限在步骤2中,需要的时候拷贝、修改screen_record为对应的service即可。
7.学会使用audit2allow
我们遇到需要添加权限很多的时候,下面列举一条看下效果:
avc: denied { create } for name="hsdi_tmp" scontext=u:r:system_app:s0 tcontext=u:object_r:protect_f_data_file:s0 tclass=dir permissive=0
当然我们可以一眼就知道怎么去添加了:
allow system_app protect_f_data_file:dir create;
将日志保存在test.txt中,然后执行audit2allow –i test.txt > test.te,打开test.te看到和我们手动得到的是一样的。
#============= system_app ==============
allow system_app protect_f_data_file:dir create;
当需要手动添加的数量比较多的时候,就体现出来audit2allow的方便了。