对于android8.1,SELinux权限更严格。它只允许在plat_service_contexts中定义的服务注册到ServiceManager,我们之前有一个注册到ServiceManager的供应商服务,现在调用defaultServiceManager() - > addService时会返回错误,如下所示。
错误: 04-12 18:07:13.764 268 268 E SELinux:avc:拒绝{add} for service = media.stream pid = 649 uid = 1013 scontext = u:r:np_mediastream:s0 tcontext = u:object_r:default_android_service:s0 tclass = service_manager permissive = 0
如果我在/ device下添加这个允许sepolicy,将无法构建domain.te中定义的下面的neverallow规则。
允许np_streammedia default_android_service:service_manager add;
规则: neverallow * default_android_service:service_manager add;
那么如何将自己的供应商服务注册到ServiceManager?
似乎谷歌的文档中有一些解决方案,但我无法理解。 https://source.android.com/security/selinux/images/SELinux_Treble.pdf
答案 0 :(得分:0)
是..,对于android 8.0 Oreo及以上版本,清单和静态接收器中不允许注册接收器。需要从
STICKY
服务动态实施和运行时,需要从清单和接收static receiver
的{{1}}启动该服务。再次,如果你发布你的代码,可能是我或其他人将能够帮助... !!请上传代码..
答案 1 :(得分:0)
您应该定义自己的服务类型:
1,定义 http://androidxref.com/8.1.0_r33/xref/device/google/marlin/sepolicy/service.te
Author
2,添加允许策略 http://androidxref.com/8.1.0_r33/xref/device/google/marlin/sepolicy/qcneservice.te
public IEnumerable<Book> Books => MyItems.OfType<Book>.Where(b => b.Authors.Contains(this));
3,标签服务 http://androidxref.com/8.1.0_r33/xref/device/google/marlin/sepolicy/private/service_contexts
type cne_service, service_manager_type;
答案 2 :(得分:0)
从Android 8.1开始的SE Linux权限:直接转到“ / system / sepolicy”
在“ public / service.te”文件中声明新的类型“ my_service”:
type my_service, system_api_service, service_manager_type;
在service_contexts(“ private / service_contexts”)文件中,服务标记如下:
com.android.sampservice.ISampService u:object_r:my_service:s0
添加以下规则:(在public / servicemanager.te中)
allow system_app my_service:service_manager add;
在android 8.1中,google添加了一种称为通用中间语言(CIL)的新政策语言。
要添加系统服务,您需要:
在文件系统/sepolicy/private/compat/26.0/26.0.cil中:添加
(typeattributeset my_service_26_0 (my_service))
在/system/sepolicy/prebuild/api/26.0/nonplat_sepolicy.cil文件中:添加
(typeattribute my_service_26_0)
(roletype object_r my_service_26_0)
并将my_service添加到nonplat_sepolicy.cil文件中的行:Add
(typeattributeset service_manager_type (audioserver_service_26_0 , ... , my_service_26_0)
此处是解释如何添加系统服务的链接。 https://devarea.com/aosp-creating-a-system-service/#.XPA50ohKhPZ
答案 3 :(得分:0)
问题不在于SELinux规则发生了变化,而是Treble引入了Binder上下文的新分离:
/dev/binder
)/dev/vndbinder
)/dev/hwbinder
)HIDL
。您需要执行的操作取决于您的服务正在尝试执行的操作。
AIDL
界面,则必须将服务设为“框架扩展”。ProcessState::initWithDriver("/dev/vndbinder");
HIDL
提供/dev/hwbinder
界面的供应商服务和一个连接到该界面,并通过AIDL
提供一个/dev/binder
界面。