详解Android Selinux 权限及问题

 更新时间:2017年11月15日 08:35:39   作者:Andy.Lee  
本篇文章主要介绍了详解Android Selinux 权限及问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

由于现做的是MTK平台,源码路径基于MTK, 不过高通大同小异

说明

Android 5.0以后完全引入了 SEAndroid/SELinux 安全机制,这样即使拥有 root 权限或 chmod 777 ,仍然无法再JNI以上访问内核节点。

其实在 Android 4.4 就有限制的启用此安全机制了。后面内容都按照 5.0 以后介绍,4.4 会有些许差异。

SELinux Mode

SELinux 分为两种模式,Android 5.0 后所有进程都使用 enforcing mode。

enforcing mode: 限制访问
permissive mode: 只审查权限,不限制

SELinux Policy文件路径

# Google 原生目录 
external/sepolicy

# 厂家目录,高通将 mediatek 换为 qcom
alps\device\mediatek\common\sepolicy
alps\device\mediatek\<platform>\sepolicy

编译时将以合并的方式将厂家policy追加到Google原生。

Log

没有权限时可以在内核找到如下 log :

# avc: denied { 操作权限 } for pid=7201 comm=“进程名” scontext=u:r:源类型:s0 tcontext=u:r:目标类型:s0 tclass=访问类型 permissive=0

avc: denied {getattr read} for pid=7201 comm="xxx.xxx" scontext=u:r:system_app:s0 tcontext=u:r:shell_data_file:s0 tclass=dir permissive=0
``` 
## 权限修改
主要有三种方式,前两种只能用来测试,第三种是推荐的正式处理方式。
### adb在线修改seLinux
```bash
# Enforcing - 表示已打开 ,Permissive - 表示已关闭
getenforce;  //获取当前seLinux状态
setenforce 1; //打开seLinux
setenforce 0; //关闭seLinux

kernel中关闭

# alps\kernel-3.18\arch\arm64\configs\xxx_defconfig
CONFIG_SECURITY_SELINUX=y // 屏蔽此配置项

SELinux Sepolicy中添加权限

修改相应源类型.te文件(基本以源进程名命名),添加如下一行语句:

# 格式
allow 源类型 目标类型:访问类型 {操作权限}; // 注意分号

# 实例,具体写法参考源码
allow system_app shell_data_file:dir{getattr read write};
allow mediaserver tfa9897_device:chr_file { open read write }; 
allow system_server tfa9897_device:chr_file rw_file_perms; 

chr_file - 字符设备 file - 普通文件 dir - 目录

通常很少修改Google default 的policy, 推荐更新mediatek 下面的相关的policy.

新建节点

如果是自己新建的节点,需要在 sepolicy 路径下的 file_contexts 文件中做如下添加:

# 参考已有的格式
/dev/goodix_fp     u:object_r:goodixfp_device:s0

Android 5.0 修改的文件为device.te 和 file_contexts.be,而且device/mediatek/common/BoardConfig.mk 中的 BROAD_SEPOLICY_UNION 增加对应的xxxx.te。

编译

# 模块编译
mmm external/sepolicy
make -j24 ramdisk-nodeps & make -j24 bootimage-nodeps

# 整编
make -j24

ps添加权限后的neverallowed冲突

编译报错:

libsepol.check_assertion_helper: neverallow on line xxx ofexternal/sepolicy/domain.te ……

 原因:

新添加的sepolicy项目违反了domain.te 中规定的的总策略原则。所以该条权限策略不能添加,如果强行添加的话有CTS测试失败的风险。

解决方法:

1.从运行log中找到要访问的目标名称,一般是name字段后的名称
avc: denied { read write } for pid=303 comm="mediaserver" name="tfa9890"dev="tmpfs" ino=3880 scontext=u:r:mediaserver:s0tcontext=u:object_r:device:s0tclass=chr_file permissive=0

2.找到相应的*_contexts文件。

  一般有file_contexts, genfs_contexts,  property_contexts,  service_contexts 等文件

在contexts文件中指定要访问的目标为一个“源类型 ”有权限访问的“目标类型”

如:在file_contexts中添加: /dev/tfa9890     u:object_r:audio_device:s0

 举例

添加权限:

在mediaserver.te中添加allow mediaserver device:chr_file { read write open};

编译报错:
libsepol.check_assertion_helper: neverallow on line 258 ofexternal/sepolicy/domain.te (or line 5252 of policy.conf) violated byallow mediaserver device:chr_file { read write open};

违反了domain.te 258的:
neverallow {domain –unconfineddomain –ueventd } device:chr_file { open read write}

运行Log:
avc: denied { read write } for pid=303 comm="mediaserver"name="tfa9890" dev="tmpfs" ino=3880 scontext=u:r:mediaserver:s0 tcontext=u:object_r:device:s0tclass=chr_file permissive=0

修改步骤:

1.目标名称是: tfa9890, 其在系统中的路径是: /dev/tfa9890,  是audio相关的设备文件
2.源类型是mediaserver, 在mediaserver.te 文件中发现其具有 audio_device 目标类型的权限
3.所以在file_contexts 中添加 “/dev/tfa9890        u:object_r:audio_device:s0” 可以解决问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android使用libgdx实现模拟方向键控制角色移动的方法

    Android使用libgdx实现模拟方向键控制角色移动的方法

    这篇文章主要介绍了Android使用libgdx实现模拟方向键控制角色移动的方法,实例分析了Android中使用libgdx框架实现响应方向键的技巧,适用于Android游戏开发领域,需要的朋友可以参考下
    2015-12-12
  • Android实现底部状态栏切换的两种方式

    Android实现底部状态栏切换的两种方式

    这篇文章主要介绍了Android实现底部状态栏切换功能,在文中给大家提到了两种实现方式,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Android利用Dom对XML进行增删改查操作详解

    Android利用Dom对XML进行增删改查操作详解

    使用DOM进行增删改查,这个是DOM的优势所在,其实代码很简单,不需要过多的解释,下面这篇文章主要给大家介绍了关于Android利用Dom对XML进行增删改查操作的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-01-01
  • Android中的全局变量与局部变量使用小结

    Android中的全局变量与局部变量使用小结

    这篇文章主要介绍了Android中的全局变量与局部变量使用小结,声明一个变量是很 容易的,但是讲到使用的时候,却不是想象的那样简单,需要的朋友可以参考下
    2015-06-06
  • Android自定义日历Calender代码实现

    Android自定义日历Calender代码实现

    这篇文章主要为大家详细介绍了Android自定义日历Calender实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 基于Android studio3.6的JNI教程之helloworld思路详解

    基于Android studio3.6的JNI教程之helloworld思路详解

    这篇文章主要介绍了基于Android studio3.6的JNI教程之helloworld,本文通过图文实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Flutter Set存储自定义对象时保证唯一的方法详解

    Flutter Set存储自定义对象时保证唯一的方法详解

    在Flutter中,Set和List是两种不同的集合类型,List中存储的元素可以重复,Set中存储的元素不可重复,如果想在Set中存储自定义对象,需要确保对象的唯一性,那么如何保证唯一,接下来小编就给大家详细的介绍一下
    2023-11-11
  • Kotlin中空判断与问号和感叹号标识符使用方法

    Kotlin中空判断与问号和感叹号标识符使用方法

    最近使用kotlin重构项目,遇到了一个小问题,在Java中,可能会遇到判断某个对象是否为空,为空执行一段逻辑,不为空执行另外一段逻辑,下面这篇文章主要给大家介绍了关于Kotlin中空判断与问号和感叹号标识符处理操作的相关资料,需要的朋友可以参考下
    2022-12-12
  • android 获取手机内存及 内存可用空间的方法

    android 获取手机内存及 内存可用空间的方法

    下面小编就为大家带来一篇android 获取手机内存及SD卡内存可用空间的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Android自定义复合控件实现通用标题栏

    Android自定义复合控件实现通用标题栏

    这篇文章主要为大家详细介绍了Android自定义复合控件实现通用标题栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11

最新评论