android - avc 拒绝在 deamon 上转换
问题描述
我有一个定制的守护进程,我要添加到我的 android 8.1 源代码树中。
但我不断收到错误:
type=1400 audit(21.610:3): avc: denied { transition } for pid=217 comm="init" path="/system/bin/rfidmanagerd" dev="dm-1" ino=293 scontext=u:r:init:s0 tcontext=u:object_r:rfidmanager_exec:s0 tclass=process permissive=1
这是我的 rfidmanager.te 文件:
# RFID manager process
type rfidmanager, coredomain;
type rfidmanager_exec, exec_type, file_type;
init_daemon_domain(rfidmanager)
domain_auto_trans(init, rfidmanager_exec, rfidmanager)
# Access system/etc/rfid
allow rfidmanager sysfs:file rw_file_perms;
allow rfidmanager tmpfs:chr_file { read write };
allow rfidmanager sysfs:file write;
allow rfidmanager system_file:file r_file_perms;
# Access /data/misc/rfid.
allow rfidmanager misc_rfid_file:dir create_dir_perms;
allow rfidmanager misc_rfid_file:file create_file_perms;
allow rfidmanager misc_rfid_file:file rw_file_perms;
allow rfidmanager misc_rfid_file:file { read write setattr append unlink link rename };
allow rfidmanager misc_rfid_file:fifo_file { create open read write };
# Access /dev/circchar
allow rfidmanager rfidhal_device:chr_file r_file_perms;
allow rfidmanager rfidhal_device:chr_file { read write };
# Access serial ports
allow rfidmanager tty_device:chr_file r_file_perms;
这是我的文件上下文:
/system/bin/rfidmanagerd u:object_r:rfidmanager_exec:s0
在我的 init.te 文件中否认我有:
allow init rfidmanager_exec:process {transition};
设备需要使 SELinux 处于强制模式。这是我在 init.rc 文件中启动服务的方式
service rfidmanagerd /system/bin/rfidmanagerd -c /system/etc/rfid/rfidmanagerd.conf
class core
seclabel u:object_r:rfidmanager_exec:s0
user root
group root system
oneshot
start rfidmanagerd
当我尝试手动启动服务时,即
su system
./system/bin/rfidmanagerd
它开始了,但使用 ps -eZ 我看到服务如下:
u:r:su:s0 system 859 1 4524 360 poll_schedule_timeout 0 S rfidmanagerd
然而,它应该与 u:object_r:rfidmanager_exec:s0
我在我的上下文中定义的一样。
它不会自动启动,这可以通过 SELinux 拒绝错误来理解,但是这种特定拒绝的允许规则的任何组合似乎都被忽略了。
当我尝试start rfidmanagerd
在终端中做(以root身份)时,我得到了
[ 474.879385] init: starting service 'rfidmanagerd'...
[ 474.885868] init: property_set("ro.boottime.rfidmanagerd", "474879774055") failed: property already set
[ 474.915929] init: cannot execve('/system/bin/rfidmanagerd'): Permission denied
[ 474.925563] type=1400 audit(480.580:9): avc: denied { transition } for pid=998 comm="init" path="/system/bin/rfidmanagerd" dev="dm-1" ino=381 scontext=u:r:init:s0 tcontext=u:object_r:rfidmanager_exec:s0 tclass=process permissive=0
我理解拒绝,但不明白为什么我的允许规则没有解决这个问题......
当我处于许可模式时,一切运行良好,但正如我所说,我不能让它处于许可模式。
任何帮助将不胜感激!
谢谢
更新——我已经从安卓爱好者迁移到堆栈交换回到安卓爱好者——它一直在移动,有人可以帮助我吗!
解决方案
对于遇到类似问题的任何人......Android 8.1 在编译 selinux 时需要 coredomain 没有 neverallow 规则!
但是,这对 selinux 解析 setexeccontext 有一些问题。
所以我的 .te 文件中的第一行应该是 -
type rfidmanager, coredomain, domain;
而不仅仅是
type rfidmanager, coredomain;
我希望这对任何人都有帮助。
推荐阅读
- java - Apache HttpComponents 忽略重定向时的 POST 数据 (HTTP 302)
- html - 使图像链接适合容器 div 并将其中的文本居中
- intellij-idea - IntelliJ Ultimate 意外关闭 [提供日志]
- swift - 启动后检查 Segue
- angular6 - Angular6 可以在 Web 应用程序上安装文档扫描仪
- r - 如何在R中删除某个类别中的数据行
- java - 当我想破译它时出现java Cipher的问题
- libgdx - 文本按钮不起作用和缩放问题
- php - elasticsearch php 6 更新时出现错误 500
- java - 在`launch.json`中,附加到远程java应用程序时`projectName`应该是什么?