AVC拒绝在Deamon上进行过渡

时间:2019-01-09 19:38:35

标签: android linux android-source selinux

我有一个定制的守护进程,我要添加到我的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;

这是我的file_contexts:

/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迷恋者迁移到STACKEXCHANGE回到ANDROID迷恋者-它一直在移动,有人可以帮我吗!

2 个答案:

答案 0 :(得分:0)

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

但是,selinux解决setexeccontext存在一些问题。

因此我的.te文件中的第一行应显示为-

select t1.testid,
       t1.start, 
       t1.end, 
       DATEDIFF(hour, t1.Start, t1.End), 
       sum(DATEDIFF(hour, t2.Start, t2.End)), 
       1000 - sum(DATEDIFF(hour, t2.Start, t2.End))
from MyTable t1
join MyTable t2 on t1.testid >= t2.testid
group by t1.testid, t1.start, t1.end, t1.Start, t1.End

而不是

type rfidmanager, coredomain, domain;

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

答案 1 :(得分:0)

希望这将有助于某人将来节省时间。 你应该在服务定义中使用这个安全:

seclabel u:r:rfidmanager:s0