[Android开发技巧] 通过avc日志自动生成selinux策略
尊重原创,转载请注明出处!
创作不易,如有帮助请点赞支持~
常规方式
通常,我们添加 selinux 策略的方式是在日志中搜索 avc 相关的报错,然后根据万能公式进行添加:
比如针对以下报错,可以套入公式:
04-03 17:55:58.563 1 1 I /system/bin/init: type=1107 audit(0.0:414): uid=0 auid=4294967295 ses=4294967295 subj=u:r:init:s0 msg='avc: denied { set } for property=af.media.systemready.state pid=495 uid=1041 gid=1005 scontext=u:r:audioserver:s0 tcontext=u:object_r:default_prop:s0 tclass=property_service permissive=1'
scontext | tcontext: | tclass | avc denied的权限 | |
---|---|---|---|---|
allow | audioserver | default_prop: | property_service | set |
然后,将这句代码添加到audioserver.te即可:
allow audioserver default_prop:property_service set;
但是,当我们添加一个新的进程、或者移植一个新的平台时,日志中存在大量的 selinux 报错,这样一个一个策略手动添加的方法就显得很笨且麻烦了-。-
通过avc日志自动生成对应的selinux策略
linux 系统给我们提供了一个 audit2allow 的工具,利用这个工具,我们只需要抓取完整的日志,过滤出 avc 相关的报错,即可根据这些日志一次性生成对应的策略,然后添加到对应的 te 文件即可。
1、关闭selinux
adb shell setenforce 0
这里虽然暂时关闭了 selinux,但是如果没有添加对应的策略,还是会有 avc 相关日志输出
2、抓取Android层和kernel层的avc报错日志
adb shell logcat | grep avc > logcat_avc.txt
adb shell cat /proc/kmsg | grep avc > kmsg_avc.txt
3、通过audit2allow工具直接生成对应的策略
audit2allow -i logcat_avc.txt # -i指定avc报错日志文件
PS:有些服务器可能需要手动安装:sudo apt install policycoreutils
4、手动将需要添加的策略添加到对应的源
以下为执行命令后的输出结果,会将各个源的结果都区分开来,方便添加:
#============= cameraserver ==============
allow cameraserver vendor_file:file read;
#============= dhcp6c ==============
allow dhcp6c self:udp_socket ioctl;
#============= audioserver ==============
allow audioserver default_prop:property_service set;
#============= bootanim ==============
allow bootanim vendor_default_prop:file { getattr map open };
由于系统中的 avc 报错很多,根据需要将生成的策略内容添加到对应的源即可,比如 cameraserver.te 等