android 5.x开始,引入了非常严格的selinux权限管理机制,我们经常会遇到因为selinux权限问题造成的各种avc denied困扰。  
本文结合具体案例,讲解如何根据log来快速解决90%的权限问题。 

遇到权限问题,在logcat或者kernel的log中一定会打印avc denied提示缺少什么权限,

Command:

cat /proc/kmsg | grep avc 或 dmesg | grep avc 
解决原则是:缺什么补什么,一步一步补到没有avc denied为止。  

下面给出四个案例:

1.

audit(0.0:67): avc: denied { write } for path="/dev/block/vold/93:96" dev="tmpfs" ino=1263 scontext=u:r:kernel:s0 tcontext=u:object_r:block_device:s0 tclass=blk_file permissive=0

分析过程: 
缺少什么权限:           { write }权限, 
谁缺少权限:               scontext=u:r:kernel:s0, 

对哪个文件缺少权限:tcontext=u:object_r:block_device

什么类型的文件:        tclass=blk_file

解决方法:kernel.te 

allow kernel block_device:blk_file write;

2.

audit(0.0:53): avc: denied { execute } for path="/data/data/com.mofing/qt-reserved-files/plugins/platforms/libgnustl_shared.so" dev="nandl" ino=115502 scontext=u:r:platform_app:s0 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=0

解决方法 :platform_app.te

allow  platform_app  app_data_file:file  execute;

3.

audit(1444651438.800:8): avc: denied { search } for pid=158 comm="setmacaddr" name="/" dev="nandi" ino=1 scontext=u:r:engsetmacaddr:s0 tcontext=u:object_r:vfat:s0 tclass=dir permissive=0  
解决方法 :engsetmacaddr.te 

allow  engsetmacaddr  vfat:dir  { search write add_name create }; 或者

allow  engsetmacaddr   vfat:dir  create_dir_perms;

4. 
audit(1441759284.810:5): avc: denied { read } for pid=1494 comm="sdcard" name="0" dev="nandk" ino=245281 scontext=u:r:sdcardd:s0 tcontext=u:object_r:system_data_file:s0 tclass=dir permissive=0  

解决方法 :sdcardd.te

allow  sdcardd  system_data_file:dir  read;  或者

allow  sdcardd  system_data_file:dir  rw_dir_perms

(rw_dir_perms包含read write,可以参考external/sepolicy/global_macros的定义声明)   

通过这四个案例,我们可以总结出一般规律,

以第4个为例

允许某个scontext对某个tcontext拥有某个权限

我们的log重新排列一下,

scontext=u:r:sdcardd

tcontext=u:object_r:system_data_file:s0

tclass=dir

avc: denied { read }

得到万能套用公式如下:

在scontext所指的te文件中加入类似如下内容: 

scontext                        tcontext                      tclass                avc denied

allow          sdcardd                 system_data_file      :         dir                       read

以上以.te为后缀的文件都在external/sepolicy/或者device/softwinner/xxxx-commm/sepolicy/下,修改之后,都要重刷boot.img。

补充说明: 

1. 有时候avc denied的log不是一次性显示所有问题,要等你解决一个权限问题之后,才会提示另外一个权限问题。

比如提示确实某个目录的read权限,你加入read之后,再显示缺少write权限,要你一次次一次试,一次一次加。

这时你可以简单粗暴写个rw_dir_perms,这个权限包含了{open search write ...}等等很多权限。

可以查看external/sepolicy/global_macros来了解更多权限声明;

2. 要加入的权限很多时,可以用中括号,比如

allow engsetmacaddr  vfat:dir { search write add_name create};

3. 遇到问题不确定是否由于selinux问题造成,可先在adb shell 下,输入setenforce 0,让selinux失效,看是否问题还出现。以此可以澄清是非selinux造成的问题。

二、

以上基本是对已经存在的进程增加权限,但对第三方进程改如何新增一个全新的te文件并赋予权限呢?

以写mac地址的setmacaddr执行文件为例(这个执行档Android原生不存在,自行添加的):

1. 在external/sepolicy/file_contexts中,参考其他进程声明一个:

/system/bin/install-recovery.sh u:object_r:install_recovery_exec:s0

/system/bin/dex2oat     u:object_r:dex2oat_exec:s0

/system/bin/patchoat    u:object_r:dex2oat_exec:s0

/system/bin/setmacaddr u:object_r:engsetmacaddr_exec:s0 

指定setmacaddr的路径,并指定一个名字,一定要以_exec结尾

2.参考其他文件在external/sepolicy/ 创建engsetmacaddr.te文件,内容如下:

type engsetmacaddr, domain;

type engsetmacaddr_exec, exec_type, file_type;

init_daemon_domain(engsetmacaddr)

allow engsetmacaddr  vfat:dir { search write add_name create};

allow engsetmacaddr  vfat:file { create read write open };

allow engsetmacaddr  engsetmacaddr:capability dac_override;

allow engsetmacaddr  shell_exec:file { execute read open execute_no_trans};

allow engsetmacaddr  system_data_file:dir { write add_name remove_name };

allow engsetmacaddr  system_data_file:file { create execute_no_trans write open setattr};

allow engsetmacaddr  system_file:file { execute_no_trans};

以上赋予的权限全部是根据avc denied的log缺什么一步一步补什么来的。

Android 5.x 权限问题解决方法的更多相关文章

  1. virtualbox共享文件夹无访问权限问题解决方法

    virtualbox共享文件夹无访问权限问题解决方法 早就困扰了,这次新装虚拟机又碰到了,记录下来. 这篇文章主要介绍了virtualbox共享文件夹无访问权限问题解决方法,造成这个问题的原因是不跟v ...

  2. android webview内容压线问题解决方法

    最近在使用webview做页面开发,项目上要求webview在获取到焦点的时候需要有边框线,于是添加上了webview的选中效果,但是出现了网页中的内容压选中框的情况.之后给webview添加padd ...

  3. Ubuntu下使用git clone 的权限问题解决方法

    问题1.sign_and_send_pubkey: signing failed: agent refused operation,执行如下语句: eval "$(ssh-agent -s) ...

  4. Android获取ROOT权限的通用方法

    背景 自从Android问世以后,给手机获取ROOT权限变成了玩机爱好者老生常谈的话题.拥有手机,却不能拥有操作手机的最高权限,这对于手机爱好者而言,这怎么可以忍?所以无论Android升到什么什么版 ...

  5. PHP mkdir()无写权限的问题解决方法

    这篇文章主要介绍了PHP mkdir()无写权限的问题解决方法,对umask做了详细解释以及mkdir()后没写权限的解决方法,需要的朋友可以参考下   使用mkdir创建文件夹时,发现这个函数有两个 ...

  6. android中获取root权限的方法以及原理(转)

    一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. 二. Root 的介绍 1. Root 的目的 可以让我们拥有 ...

  7. 安装Android SDK Manager的“Failed to fetch refused”问题解决方法

    安装Android SDK Manager的"Failed to fetch refused"问题解决方法 一见 2014/11/11 问题现象: 步骤一:修改hosts文件(wi ...

  8. android下创建文件夹和修改其权限的方法

    原文:http://www.cnblogs.com/wanqieddy/archive/2011/12/28/2304906.html 由于工作的需要,今天研究了在android下创建文件夹和修改其权 ...

  9. ## Android 6.0 权限申请 ##

    Android 6.0 权限申请 1. 以前的权限申请(sdk<23) 直接在AndroidManifest.xml中申明即可: <uses-permission android:name ...

随机推荐

  1. 浅析Linux内核调度

    1.调度器的概述 多任务操作系统分为非抢占式多任务和抢占式多任务.与大多数现代操作系统一样,Linux采用的是抢占式多任务模式.这表示对CPU的占用时间由操作系统决定的,具体为操作系统中的调度器.调度 ...

  2. NOI2017游记

    Day -1: THUSC后,下定决心好好学习,不过由于自制力太弱,还是没有忍住浪了几次. 老师把NOI前的天分为了4种:考试日.交流日.讲课日.自习日. 考试日是我被郭神短神妖神任神常神尹神龙神游神 ...

  3. VS2012代码对齐快捷键

    1.选中想要对齐的代码 2.全选代码后按住Ctrl+K,Ctrl+F键,就可以了

  4. 谷歌Chrome浏览器之No Sandbox

     想着还是要把这个分享出来,前两天,早上过来,Chrome打开后,输入网址回车,毫无反应,不加载,不跳转,打不开浏览器设置.总之就是除了能打开Chrome浏览器,不能进行任何其他操作,关闭重开也是这样 ...

  5. 9.QT-标准对话框

    Qt提供的可复用的标准对话框,全部继承自QDialog类,如下图所示: QMessageBox:信息对话框,用于显示信息.询问问题等: QFileDialog:文件对话框 QColorDialog:颜 ...

  6. 美链BEC合约漏洞技术分析

    这两天币圈链圈被美链BEC智能合约的漏洞导致代币价值几乎归零的事件刷遍朋友圈.这篇文章就来分析下BEC智能合约的漏洞 漏洞攻击交易 我们先来还原下攻击交易,这个交易可以在这个链接查询到. 我截图给大家 ...

  7. range和xrange的区别详解

    两种用法介绍如下:1.range([start], stop[, step])返回等差数列.构建等差数列,起点是start,终点是stop,但不包含stop,公差是step.start和step是可选 ...

  8. jspacker压缩及解压缩研究(js eval)

    起因: 在研究爬虫的时候发现很多网站都出现了同一种方式的js混淆,并且名字都是pde.js,怀疑是使用了同一款混淆工具,所以研究一下. 这款工具叫JS Packer,并不是专门的混淆工具,而是一款js ...

  9. webpack4.x配置详解,多页面,多入口,多出口,新特性新坑!!

    花了差不多一天多的时间,重新撸了一遍webpack4.x的常用配置. 基本上常用的配置都熟悉了一遍,总体上来讲,为了对parcel进行反击,webpack从4.x开始,正在朝着尽可能的简化配置文件的方 ...

  10. BDD敏捷开发入门与实战

    BDD敏捷开发入门与实战 1.BDD的来由 2003年,Dan North首先提出了BDD的概念,并在随后开发出了JBehave框架.在Dan North博客上介绍BDD的文章中,说到了BDD的想法是 ...