Android6.0 selinux没有对某个文件的权限(又neverAllow)处理方法

一、案例

我们举个案例,比如recovery升级中,碰到这个的log

[html] view plain copy

  1. 01-01 08:03:22.410000   217   217 W applypatch: type=1400 audit(0.0:16): avc: denied { read } for name="mmcblk0p15" dev="tmpfs" ino=3364 scontext=u:r:install_recovery:s0 tcontext=u:object_r:block_device:s0 tclass=blk_file permissive=0

说明install_revovery没有block_device的权限。

而在原生的domain.te文件中,明确domain中是没有对block_device的读写权限,除了recovery vold等。

[html] view plain copy

  1. neverallow { domain -kernel -init -recovery -vold -uncrypt -emsd -rild -radio_config} block_device:blk_file { open read write };

二、方法1(后续cts测试会有问题)

那我们如何是好呢,可以在上面这句nevera中把install_recovery也减去,然后再install_recovery.te中再加入相应的allow,这个时候编译就不会报错了。

但是这个方法,后续会在cts测试的时候过不了。

因此我们不能采取这种方法。

三、方法2

所以我们得想别的方法,我们发现在domain.te中同样有下面这么一句,是可以允许install_recovery去写recover_block_device的权限。

[html] view plain copy

  1. ./domain.te:354:neverallow { domain -install_recovery -recovery } recovery_block_device:blk_file write;

于是我们再去查block_device 和 recover_block_device

[html] view plain copy

  1. type recovery_block_device, dev_type;

[html] view plain copy

  1. type block_device, dev_type;

这两个的类型一致。

但我们再看file_contexts,看下文件安全上下文

[html] view plain copy

  1. /dev/block(/.*)?    u:object_r:block_device:s0

定义的dev/block下面的文件都是block_device,而recover_block_device是没有定义的。那我们也能不能定义我们要操作的文件为recover_block_device类型。

答案肯定是可以的。

[html] view plain copy

  1. /dev/block(/.*)?    u:object_r:block_device:s0
  2. /dev/block/dm-[0-9]+    u:object_r:dm_device:s0
  3. /dev/block/loop[0-9]*   u:object_r:loop_device:s0
  4. /dev/block/vold/.+  u:object_r:vold_device:s0
  5. /dev/block/ram[0-9]*    u:object_r:ram_device:s0

我们也可以自己定义自己的文件为recover_block_device类型,感觉这是Android给大家预留的。

具体实现就不说了,因为具体要操作什么文件不是太清楚,这只是一个log而已。

最后我们只要在install_recovery.te中加入下面权限就可以了。

[html] view plain copy

  1. allow install_recovery recover_block_device:blk_file { open read write };

这样install_recovery就有了目标文件的open read write权限了。

时间: 2024-08-17 07:55:08

Android6.0 selinux没有对某个文件的权限(又neverAllow)处理方法的相关文章

[Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)

温馨提示 建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节内容. 1 现象描述 基于Android L版本源码环境进行开发时,根据项目需求,APP层需要操作sys/xxx 或 proc/xxx下面的文件结点,但是会报出以下权限异常,无法直接操作这些结点 LedLightFileUtil( 4671): java.io.FileNotFoundException: /sys/c

Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架

Android6.0执行时权限解析,RxPermissions的使用.自己封装一套权限框架 在Android6.0中,新添加了一个执行时的权限,我相信非常多人都已经知道了.预计也知道怎么用了,这篇博客非常easy.就是告诉大家怎样去申请执行时权限和RxPermission这个权限框架的使用.同一时候依据现有的技术封装思想,去封装一个自己可用的权限框架,好的,我们继续往下看 一.Android M 执行时权限介绍 关于Android M的更新变化,我就不啰嗦了,有兴趣的能够看下Android M更

Android6.0使用BaiDu地图SDK动态获取定位权限

1.报错原因: 在集成百度地图SDK的时候在手机上无法定位,检查没有任何错误,最后通过搜索才知道是Android版本为6.0的问题,这是因为在Android6.0采用了运行时权限(RuntimePermissions),Android6.0的权限一般分为两种,一种时普通权限,可以直接获取,其它的运行时权限,需要提示用户手动同意之后,才能获取. 失败的原因就是,小米手机MIUI是Android6.0.1,如果不加动态获取权限的代码,是不会提示的,没有得到权限,当然无法定位. 2.解决代码: pri

在Android java代码中如何改变文件的权限

在LINUX下每个文件都有一个权限的属性 ,那么在Android中怎么用java改变某个文件的权限呢? Android中有两种方法可以改变文件的权限 1. 用openFileOutput方法: FileOutputStream fos; fos = openFileOutput("filename", MODE_WORLD_READABLE);  FileOutputStream android.content.ContextWrapper .openFileOutput(String

Android6.0系统启动流程分析一:init进程

到了Android6.0,Init进程使用c++来写了,不过没有关系,它和c写的init没有太大的区别. Init进程的入口代码是:system\core\init\init.cpp main函数: int main(int argc, char** argv) { if (!strcmp(basename(argv[0]), "ueventd")) { return ueventd_main(argc, argv); } if (!strcmp(basename(argv[0]),

Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题

版权声明:本文为博主原创文章,未经博主允许不得转载. 正常情况下调用系统相机拍照: 如果拍照后点击的是“确定”图标,返回的resultCode = -1(Activity.RESULT_OK): 如果点击的是底部的“返回”键,返回的resultCode = 0(Activity.RESULT_CANCELED). 简单的调用系统相机的写法: //调用系统拍照 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String p

Ubuntu虚拟机编译Android6.0总结

1 前言 昨天使用清华的源下载了android 6.0的源码,校园网可以达到10M的速度,爽!今天一大早就迫不及待地准备编译一个模拟器版本,看看效果,哪知竟然耗费了一整天的时间才搞定...为了避免其他人在同样的问题上浪费时间,特记录整个编译过程中遇到的问题和解决方案,毕竟时间就是金钱! 2 背景 我是在MAC上安装的ubuntu14.04 64bit系统,起初分配了3G的内存(血的教训,完全不够用!),和两个核心.编译的系统版本为6.0.1_r9和6.0.0_r26 3 编译过程遇到的问题和解决

Android6.0 中appcompat_v7 报错

更新了AndroidSDK以后 各种错误,新建一个项目会附赠一个appcompat_v7,你只要知道这个是一个兼容包就可以了,具体的特性可以看相关介绍,其实也没啥特别的就是为了兼容低版本的呗, 但是呢,这个就导致 了 各种的错误,下面是出现的错误: 经过好几个小时的捯饬,各种文章说需要重启Eclipse ,其实根本无所谓,重要的还是配置,下面是解决办法: 第一步:选择appcompat_v7-->Properties-->Android-->选择最高的API版本,并且确定Library

Android6.0动态权限申请步骤以及需要注意的一些坑

因为工作需要,简单研究了一下Android6.0权限申请,在Google提供的sample的基础上,写了一个简单的demo.算是自己的笔记吧,可能会比较混乱,主要是方便以后查看.后期有别的问题,随时更新~ 本demo github下载地址!!! Google提供的demo的下载地址 6.0权限的基本知识,以下是需要单独申请的权限,共分为9组,每组只要有一个权限申请成功了,就默认整组权限都可以使用了. group:android.permission-group.CONTACTS permissi