一、SElinux在Android 8.0后的差异:
从Android 4.4到Android 7.0的SELinux策略构建方式合并了所有sepolicy片段(平台和非平台),然后在根目录生成单一文件,而Android 8.0开始关于selinux架构也类似于HIDL想把系统平台的selinux策略和厂商自己维护的策略剥离开来, 允许合作伙伴单独自己的策略,构建他们的镜像(.img)引导,这样便可以独立于平台更新这些.img,反之亦然(即:在不更新合作伙伴jiang‘xaing像的情况下执行平台更新)。
关于8.0 selinux架构介绍官方文档(SELinux_Treble.pdf): https://pan.baidu.com/s/161_OpZRqx7PvOmcQ4G-CwA
二、修改xxx service示例:
1、首先xxx service权限异常有如下log:
324 E SELinux : avc: denied { add } for service=xxx pid=933 uid=1000 scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=0
则需要对selinux进行权限配置:(参考公式:allow SourceContext TargetContext:TargetClass Permission)
allow system_server default_android_service:service_manager { add };
2、以下部分是对selinux权限进行定义(实际需根据SDK的版本修改对应目录):
(1)./system/sepolicy/prebuilts/api/26.0/nonplat_sepolicy.cil
(typeattribute xxx_service_26_0) (roletype object_r xxx_service_26_0)
(2)./system/sepolicy/prebuilts/api/27.0/nonplat_sepolicy.cil
(typeattribute xxx_service_27_0) (roletype object_r xxx_service_27_0)
(3)./system/sepolicy/prebuilts/api/28.0/private/compat/26.0/26.0.cil
(typeattributeset xxx_service_26_0 (xxx_service))
(4)./system/sepolicy/prebuilts/api/28.0/private/compat/27.0/27.0.cil
(typeattributeset xxx_service_27_0 (xxx_service))
(5)./system/sepolicy/prebuilts/api/28.0/private/service_contexts
xxx u:object_r:xxx_service:s0
(6)./system/sepolicy/prebuilts/api/28.0/public/service.te
type xxx_service, system_api_service, system_server_service, service_manager_type;
(7)./system/sepolicy/private/compat/26.0/26.0.cil
(typeattributeset xxx_service_26_0 (xxx_service))
(8)./system/sepolicy/private/compat/27.0/27.0.cil
(typeattributeset xxx_service_27_0 (xxx_service))
(9)./system/sepolicy/private/service_contexts
xxx u:object_r:xxx_service:s0
(10)./system/sepolicy/public/service.te
type xxx_service, system_api_service, system_server_service, service_manager_type;
三、使用修改selinux权限的系统服务:
// 1.定义aidl文件:------------------------------------ package com.xxx.aidl; interface ISecurityServer { void startLockAppSevice(); } //2.实现aidl接口:------------------------------------ package com.xxx.aidl; public class SecurityServer extends ISecurityServer.Stub{ public void startLockAppSevice() { } } //3.提供对外接口类:---------------------------------- package com.xxx.security; public class SecurityManager { private final ISecurityServer mService; public SecurityManager(ISecurityServer service) { mService = service; } public void startLockAppSevice(){ try { mService.startLockAppSevice(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //4.注册服务:--------------------------------------- SystemServiceRegistry.java 添加 registerService("xxx", com.xxx.SecurityManager.class, new CachedServiceFetcher<com.xxx.SecurityManager>() { @Override public com.xxx.SecurityManager createService(ContextImpl ctx) { IBinder b = ServiceManager.getService("xxx"); return new com.xxx.SecurityManager(com.xxx.aidl.ISecurityServer.Stub.asInterface(b)); } }); //5. SystemServer.java 将服务添加进ServiceManager ------------- try { // com.xxx.aidl.SecurityServer Security = new com.xxx.aidl.SecurityServer(mContext); ServiceManager.addService("xxx", Security); } catch (Throwable e) { Log.e(TAG, "Failure starting olc_service_security", e); } //6. 服务调用:------------------------------------------------- SecurityManager securityManager = (SecurityManager)getSystemService("xxx");
-end-
原文地址:https://www.cnblogs.com/blogs-of-lxl/p/10017957.html