Android : 为系统服务添加 SELinux 权限 (Android 9.0)

人生难得几回搏,此时不搏待何时。这篇文章主要讲述Android : 为系统服务添加 SELinux 权限 (Android 9.0)相关的知识,希望能为你提供帮助。
一、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
xxxu: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");

 
 
 
【Android : 为系统服务添加 SELinux 权限 (Android 9.0)】  -end-



    推荐阅读