最近在 GitHub 新增项目,将 Mi 5s Plus 的设备配置及驱动移至 vendor 分区,实现了所谓的“土制 Project Treble”,成果已在 XDA 发布。在修改与检查代码的过程中,需要时常依据设备的 logcat 日志新增 SEPolicy。

以 Exynos 7580 为例,在原有代码树上直接编译基于 Android 8.0 的系统代码会导致一系列 SELinux 安全政策拒绝服务,其中包括以下的错误:

avc: denied { search } for comm="cameraserver" name="camera" dev="sysfs" scontext=u:r:cameraserver:s0 tcontext=u:object_r:camera_device:s0 tclass=dir permissive=0

按照 SEPolicy 规则,可以构造以下不违反 neverallow 规则的语句,并重新编译。

allow cameraserver camera_device:dir search;

但是,当移植过程中出现 60 个以上类似的错误,则手动更新语句显得过于复杂,且会耗费大量时间和精力。

实际上,我们可以利用 selinux/policycoreutils/audit2allow 工具大大简化工作。在第一次编译、刷入并运行系统后,连接计算机,执行以下命令,查看建议新增的 SEPolicy 项目:

adb pull /sys/fs/selinux/policy
adb logcat -b all -d | audit2allow -p policy

如果设备无法启动,可以通过 monitor 工具获得日志。

但是,请谨记,任何对 SEPolicy 的修改都必须建立在 Android 系统安全的基础上,特别是在 permissive 模式下,否则设备可能会变得易受攻击。

这大概也是人脑比电脑聪明的又一个例证吧。