我有一个定制的守护进程,我要添加到我的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迷恋者-它一直在移动,有人可以帮我吗!
答案 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