全部产品

Android SELinux策略开发一般方法

由于 Android 系统内核默认使能了 SELinux 机制,所以当 SOC SDK 集成到系统当中之后,会引起各种 SEPolicy 规则违背,导致应用程序运行异常。需要在系统 ROM 正式发布之前,调试好所有的 SELinux 策略。

以下所有步骤都请在 SOC SDK Native 层集成完毕、基本功能验证通过的情况下进行,基本步骤为:

(1)按照服务配置第2点说明中的步骤集成原始的 SEPolicy 到系统源码。

(2)通过配置 BoardConfig.mk 的 SELinux 开关首先关闭 SELinux

BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive

(3)编译 Android user 版本镜像,刷机。

(4)开机之后执行 adb logcat -v time > logcat.txt,并放置一段时间,然后打开 logcat.txt 文件进行查看。

(5)在 logcat.txt 文件中搜索 "avc: denied" 关键字,能找到当前版本违反 SEPolicy 的所有条目,例如下图所示:

selinux

(6)再在这个搜索结果中搜索 "dps" 关键字(非全词匹配搜索),可以过滤出所有于 SOC SDK 集成相关的违反规则项。

(7)使用 audit2allow 工具(具体用法请自行 Google),或者手动产生规则,配置到设备系统 sepolicy 目录的 dps.te 当中。

(8)例如对于违反规则项:

01-07 07:28:48.271 I/mediaextractor( 2511): type=1400 audit(0.0:58): avc: denied { read } for name="patch" dev="sdd15" ino=2883591 scontext=u:r:mediaextractor:s0 tcontext=u:object_r:dps_data_file:s0 tclass=dirpermissive=1

需要在 dps.te 当中加入:

allow mediaextractordps_data_file:dirread;

(9)重复步骤 6~8,直到这一批规则完全加入为止。

(10)重新编译系统镜像,可能会遇到 never allow 规则报错,可适当修改系统原配 never allow 规则使编译通过。如果遇到 policy freeze check 导致编译失败(Android P 以上版本),适当调整 SEPolicy 编译文件策略绕过。

(11)重复步骤 3~11,直到开机之后不再产生 dps 相关的 avc: denied 日志为止。

(12)屏蔽 BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive,即使能 SELinux 为 enforcing 状态,重新开机测试。如遇开机不成功,建议将系统接串口捕获 Android log,并重复上述所有步骤。