阿里云首页 IoT安全中心

Android SELinux策略开发一般方法

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

前提条件

确认已完成编译前配置的第二步,集成原始的SEPolicy到系统源码。

操作步骤

以下所有步骤请在SOC SDK Native层已集成、基本功能验证通过的情况下进行。

步骤一:筛选SOC SDK违反SEPolicy的条目

  1. 通过配置BoardConfig.mk的SELinux开关,关闭SELinux。

    BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive
  2. 编译Android user版本镜像,并刷机。

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

  4. 在logcat.txt文件中搜索avc:denied,找到当前版本违反SEPolicy的所有条目,例如下图所示:selinux

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

步骤二:配置SEPolicy策略

  1. 使用audit2allow工具,或者手动产生规则,配置到设备系统sepolicy目录的dps.te当中。

    例如对于违反规则项:

    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;

  2. 根据滤出的违反规则项,重复1步骤,直到这一批规则完全加入为止。

步骤三:验证结果

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

  2. 重复步骤一和二,直到开机之后不再产生dps相关的avc:denied日志为止。

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

首页 IoT安全中心 设备接入最佳实践 Android SELinux策略开发一般方法