首页 > 解决方案 > 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

我理解拒绝,但不明白为什么我的允许规则没有解决这个问题......

当我处于许可模式时,一切运行良好,但正如我所说,我不能让它处于许可模式。

任何帮助将不胜感激!

谢谢

更新——我已经从安卓爱好者迁移到堆栈交换回到安卓爱好者——它一直在移动,有人可以帮助我吗!

标签: androidlinuxandroid-sourceselinux

解决方案


对于遇到类似问题的任何人......Android 8.1 在编译 selinux 时需要 coredomain 没有 neverallow 规则!

但是,这对 selinux 解析 setexeccontext 有一些问题。

所以我的 .te 文件中的第一行应该是 -

type rfidmanager, coredomain, domain;

而不仅仅是

type rfidmanager, coredomain;

我希望这对任何人都有帮助。


推荐阅读