解决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 的权限机制对程序的执行设置障碍。
正文完