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

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

时间: 2024-11-06 17:58:57

Android : 为系统服务添加 SELinux 权限 (Android 9.0)的相关文章

android studio怎么添加.so文件?android studio加载so文件的方法

android studio 中 添加.so 文件,Android Studio中添加.jar文件和.so文件无疑是一件很重要也是很头疼的问题! 1.在src/main中添加 jniLibs文件夹 ,把.so复制进去 2.在build.gradle中就添加这么几行  ,  看图 复制内容到剪贴板 sourceSets { main { jniLibs.srcDirs = ['libs'] } } 3.然后make project 4.切换到android结构下,你会看到 jniLibs 中.so

android apk的签名和权限问题

一. android apk的签名问题(http://blog.csdn.net/lyq8479/article/details/6401093) 1.为什么要给Android应用程序签名?      如果只能用一句简单的话语来回答这个问题的话,我会说:“这是Android系统所要求的”.      Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的!Android通过数字签名来

Android(permission)常用权限

Android应用需要在AndroidManifest.xml添加某些权限.才能调用系统功能.如应用提供震动功能.必须在配置文件中加入震动权限. 属性 说明 android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问 "properties"表在checkin数据库中,改值可以修改上传 android.permission.ACCESS_COARSE_LOCATION 通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在3

Android安全机制(2) Android Permission权限控制机制

http://blog.csdn.net/vshuang/article/details/44001661 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1.概述 Android 是一个权限分离的系统 . 这是利用 Linux 已有的权限管理机制,通过为每一个 Application 分配不同的 uid 和 gid , 从而使得不同的 Application 之间的私有数据和访问( native 以及 Java 层通过这种 sandbox 机制,都可以)达到隔离的目的

android权限--android开发中的权限及含义(上)

android权限--android开发中的权限及含义(上) android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST 作为一个工厂测试程序,运行在root用户 android.permission.FLASHLIGHT 访问闪光灯,android开发网提示HTC Dream不包含闪光灯 android.pe

无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap

在android设备上添加thttpd及CGI

============问题描述============ 我想在android系统上添加一个WEB服务,可以使用pc机上的浏览器对于设备的一些参数进行设置.现在选定 httpd+CGI+Sqlite3.但是不知道怎样将httpd+CGI编译并加载到android系统上.请不吝赐教.谢谢. ============解决方案1============ 请问一下:移动端能使用CGI接口么 ============解决方案2============ 你app上设置设备的参数具体是设置什么参数呀,难道不需

Android常用系统服务

通过Activity类的getSystemService方法可以获得指定的系统服务. getSystemService方法只有一个String类型的参数,表示系统服务的ID,这个ID在整个Android系统中是唯一的. Android SDK在android.content.Context类中定义了这些ID.如下: Constants AccessibilityManager ACCESSIBILITY_SERVICE 通过已注册的事件监听器将UI事件反馈给用户. 主要是一些View获得点击.焦

往android的内核添加驱动及 ueventd.rc 修改

转载! 向android的内核添加驱动,其实就是向linux内核添加驱动.主要在两个文件里添加点信息,一个是Kconfig文件,一个是Makefile文件.比如你添加的驱动你代码放到drivers目录下面的XXX目录,那么修在该目录下的Kconfig文件和Makefile文件. 具体的修改方法: 比如我现在修改drivers/staging/android/下的Kconfig文件. config ANDROID_LOGGER tristate "Android log driver"