SELinux权限问题解决策略解析

11次阅读
没有评论

解决SELinux权限问题的实践方案

问题描述

一位开发者在其自定义 ROM 上尝试通过 init.rc 文件执行一个应用启动命令(am start -n)时遇到了 SELinux 权限被拒绝的问题。具体表现为:

type=1400 audit(22128374.236:11): avc: denied { entrypoint } for pid=3887 comm="init" path="/system/bin/am" dev="dm-0" ino=292 scontext=u:r:shell:s0 tcontext=u:object_r:system_file:s0 tclass=file permissive=0

使用 adb shell 执行同样的命令却可以成功通过。这意味着尽管两个情况下用户身份看起来相同,但是SELinux策略拒绝了执行请求。那么问题到底出在哪里呢?

现状分析

  • 开发者提供了两种情况下的 SELinux 上下文:
  • 使用 init.rc 执行时 SELinux 上下文为 u:r:shell:s0
  • 使用 adb shell 方式执行,上下文保持一致。

这两者的差异在于,尽管都是用户身份 user:(shell) ,但是 groups 的信息有所区别。同时 /system/bin/am 不是可执行文件而是脚本,并且需要经由 sh (shell)

解决策略

  • 确保完整的身份标签:除了基础的用户标签外,还必须包含相应的权限组。因此,在 init.rc 中应该明确列出所有所需的小组成员身份,如:
exec u:r:shell:s0 shell input log adb sdcard_rw sdcard_r net_bt_admin net_bt inet net_bw_stats -- /system/bin/sh /system/bin/am start -n com.example.package/com.example.package.MainActivity
  • 确保执行的正确路径am 是一个脚本,需要通过 sh 来执行。

这个综合策略确保了所有必要的身份属性被包含,并指明了正确的脚本解释器处理过程。这样可以避免 SELinux 的权限机制对程序的执行设置障碍。

正文完