点击打开链接

温馨提示

     建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节内容。

1 现象描述

基于Android L版本源码环境进行开发时,根据项目需求,APP层需要操作sys/xxx 或 proc/xxx下面的文件结点,但是会报出以下权限异常,无法直接操作这些结点
LedLightFileUtil( 4671): java.io.FileNotFoundException: /sys/class/leds/green/brightness: open failed: EACCES (Permission denied)
LedLightFileUtil( 4671): at libcore.io.IoBridge.open(IoBridge.java:456)
LedLightFileUtil( 4671): at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
LedLightFileUtil( 4671): at java.io.FileOutputStream.<init>(FileOutputStream.java:127)
LedLightFileUtil( 4671): at java.io.FileOutputStream.<init>(FileOutputStream.java:116)
【声明】欢迎转载,但请保留文章原始出处:http://blog.csdn.net/yelangjueqi/article/details/46761987

2 问题原因

自Android L版本,Google对源码环境普遍启用SELinux安全访问机制,APP及framework层默认情况下再无权限访问设备节点如(sys/xxx,proc/xxx)

3 解决方法

下面以三种常用操作角度阐述为system app进程或system server进程开放权限的方法
1) SEAndroid 为sys设备文件结点开放访问(读或写)权限的方法(如:/sys/class/leds/green/brightness)
2) SEAndroid 为proc设备文件结点开放访问(读或写)权限的方法(如:/proc/touchscreen_feature/gesture_data)
3) SEAndroid 为SystemProperties的自定义属性开放set(写)权限的方法

3.1 SEAndroid 为sys设备文件结点开放访问(读或写)权限的方法(如:/sys/class/leds/green/brightness)

以操作LED灯的设备文件节点为例进行说明,如绿灯:/sys/class/leds/green/brightness,为APP层system app进程开放该节点访问权限(读或写)
绿灯:
/sys/class/leds/green/brightness //快捷方式
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness //实际节点
PS:默认是在external/sepolicy目录下面,但是MTK平台和QCOM平台都创建了自己管理SELinux policy的目录:
MTK:alps/device/mediatek/common/sepolicy
QCOM:android/device/qcom/sepolicy/common
所以建议你在其平台的相应目录下面去操作,下面以QCOM平台为例,MTK平台配置步骤方法是一样的(alps/device/mediatek/common/sepolicy)
3.1.1 在android/device/qcom/sepolicy/common/file.te,定义selinux type:sysfs_wingtk_leds,如下:
type sysfs_wingtk_leds, fs_type, sysfs_type;
3.1.2 在android/device/qcom/sepolicy/common/file_contexts,绑定sysfs_wingtk_leds到对应的实际节点,注意是实际节点
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0
PS:可以把/sys/class/leds/green/brightness也声明下,该句不是必须的:
/sys/class/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0
汇总:file_contexts的修改如下:
/sys/class/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness u:object_r:sysfs_wingtk_leds:s0
3.1.3 在android/device/qcom/sepolicy/common/system_app.te,申请权限:
allow system_app sysfs_wingtk_leds:file rw_file_perms;
PS:也可以为其他process申请相关的权限,如:system_server,在android/device/qcom/sepolicy/common/system_server.te
allow system_server sysfs_wingtk_leds:file rw_file_perms;
PS:配置第2步的实际节点时,怎么获取实际节点,方法如下:
root@K31-t7:/sys/class/leds # ll -Z
lrwxrwxrwx root root u:object_r:sysfs:s0 flashlight -> ../../devices/soc.0/flashlight.64/leds/flashlight
lrwxrwxrwx root root u:object_r:sysfs:s0 green -> ../../devices/soc.0/gpio-leds.66/leds/green
lrwxrwxrwx root root u:object_r:sysfs:s0 lcd-backlight -> ../../devices/soc.0/1a00000.qcom,mdss_mdp/qcom,mdss_fb_primary.124/leds/lcd-backlight
lrwxrwxrwx root root u:object_r:sysfs:s0 mmc0:: -> ../../devices/soc.0/7824900.sdhci/leds/mmc0::
lrwxrwxrwx root root u:object_r:sysfs:s0 mmc1:: -> ../../devices/soc.0/7864900.sdhci/leds/mmc1::
lrwxrwxrwx root root u:object_r:sysfs:s0 red -> ../../devices/soc.0/gpio-leds.66/leds/red
lrwxrwxrwx root root u:object_r:sysfs:s0 torch-light0 -> ../../devices/soc.0/qcom,camera-led-flash.65/leds/torch-light0
root@K31-t7:/sys/class/leds #
通过 ll -Z 命令就可以查到。
3.1.4 在AndroidManifest.xml,配置:android:sharedUserId="android.uid.system",该步时必须的,因为第三步是:
allow system_app sysfs_wingtk_leds:file rw_file_perms; //仅允许system_app进程访问.
经过以上四步,APP层就可以正常读写:/sys/class/leds/green/brightness
为了更好地控制访问权限,如果存在APP层和framework层都要访问某个设备节点,笔者认为最好以此模式来访问设备节点,即不让system_app进程访问,仅仅允许system_server进程来访问,如下:
allow system_server sysfs_wingtk_leds:file rw_file_perms;
缺点:需要在framework层添加随系统启动的service,增加代码量
优点:1.可以自由控制哪些应用可以访问,哪些应用禁止访问已经开放的设备节点,可以更好的保护安全问题
2.framework层和APP层都可以访问该设备节点.不用再另外进行权限申请

3.2 SEAndroid 为proc设备文件结点开放访问(读或写)权限的方法(如:/proc/touchscreen_feature/gesture_data),以MTK平台为例

修改记录
细节展开
3.2.1 在alps/mediatek/common/sepolicy/file.te 定义selinux type: proc_quick_gesture,如下:
type proc_quick_gesture, fs_type;
3.2.2 在 alps/mediatek/common/sepolicy/genfs_contexts,绑定proc_quick_gesture到对应的实际节点
genfscon proc /touchscreen_feature/gesture_data   u:object_r:proc_quick_gesture:s0
3.2.3 在alps/mediatek/common/sepolicy/common/system_app.te,申请权限
allow system_app proc_quick_gesture:file rw_file_perms;
3.2.4 在AndroidManifest.xml,配置:android:sharedUserId="android.uid.system"
经过以上4步,system_app进程就具备权限(读或写)访问/proc/touchscreen_feature/gesture_data等节点啦

3.3 SEAndroid 为SystemProperties的自定义属性开放set(写)权限的方法

问题描述
SystemProperties对自定义属性没有写权限,即set时提示没有权限,导致写不成功
解决方法
以"persist.backgrounddata.enable"为例介绍开放属性权限方法
以QCOM平台为例
3.3.1 android/device/qcom/sepolicy/common/property.te
type persist_backgrounddata_prop, property_type;
3.3.2 android/device/qcom/sepolicy/common/property_contexts
persist.backgrounddata.enable u:object_r:persist_backgrounddata_prop:s0
3.3.3 android/device/qcom/sepolicy/common/system_app.te,为system_app进程开放权限
allow system_app persist_backgrounddata_prop:property_service set;
3.3.4 在AndroidManifest.xml,配置:android:sharedUserId="android.uid.system"
经过以上4步,就可以使用SystemProperties.set("persist.backgrounddata.enable"", xx)设置属性了。

延伸阅读

如果通过以上步骤正确配置之后,你仍没有权限读写sys或proc节点,是不是DAN都碎了。再告诉你下,你需要到init.rc里面配置: chown system system 文件结点,然后chmod下文件结点。两个平台配置路径,项目不同略有差异
MTK:alps/device/mediatek/mt6735/init.mt6735.rc
QCOM:xx/xx/init.target.rc

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

  1. 对已有文件进行既读又写的操作时关于文件位置注意事项(适用于Python和C/C++)

    当我们需要对现有文件进行读取数据并修改文件中的数据时,就需要用到对已有文件进行既读又写的操作.有多种可读且可写的文件打开方式:r+,w+,a+,rb+,wb+,ab+,具体含义见下表. 打开 方式 读 ...

  2. Python open()函数文件打开、读、写操作详解

    python的文件读写和打开操作都有自己特定的函数和方法,操作起来很简单.下面就来简单的了解下python文件的基本操作方法有哪些. 一.Python open()函数文件打开操作 打开文件会用到op ...

  3. Android 7.0之访问文件的权限和FileProvider类

    转载请标明出处: http://blog.csdn.net/djy1992/article/details/72533310 本文出自:[奥特曼超人的博客] 权限更改 Android 7.0 做了一些 ...

  4. Linux赋予目录或文件任何人都可以读、写、执行的操作

    之前root用户导出的文件,现在要赋予任何人都可以写的权利: 示例 任何人可读.可写.可执行: chmod 777 文件 任何人可读.可写,不可执行: chmod 666 文件 详细解析 比如drwx ...

  5. oracle用户常用权限,Oracle用户权限分配的具体方法【常用财务软件使用教程】

    Oracle用户权限分配的具体方法 这里我们将介绍Oracle用户权限分配和Oracel从服务器导出数据的方法,希望能对大家有所帮助. 对于Oracle用户权限分配,很多人觉得不是很困难,但是要做好O ...

  6. 解决Android无法访问与下载文件的权限问题

    1.Android7以下使用静态申请权限. 2.Android7以上需要动态申请权限. 3.Android10以上权限按单个分配,不再按组申请分配,以前申请了读存储卡权限,即可获得同组的写权限,现在需 ...

  7. linux系统下如何设置和修改文件和文件夹的读、写、执行权限

    文章转载自:https://www.cnblogs.com/kimshen/p/6121416.html

  8. 在unity 中,使用http请求,下载文件到可读可写路径

    在这里我用了一个线程池,线程池参数接收一个带有object参数的,无返回值的委托 ,下载用到的核心代码,网上拷贝的,他的核心就是发起一个web请求,然后得到请求的响应,读取响应的流 剩下的都是常见的I ...

  9. java修改原有txt文件_(转)Java创建txt文件并进行读、写、修改操作

    Creation date: 2007-12-18 - 下午06:48:45 */ public class ReadWriteFile { public static BufferedReader ...

最新文章

  1. 对电商用户的数据分析!
  2. arr数组怎么取值_JS 面试之数组的几个不 low 操作
  3. Nginx if 条件判断
  4. (转)IIS7 配置ASP.NET 2.0, WCF, ASP.NET MVC
  5. 提高效率的几个软件和快捷键
  6. js中,(function(){})()的用法解析
  7. c语言extern关键字详解
  8. Oracle查询今天、昨天、本周、上周、本月、上月数据
  9. 网络抓包工具wireshark 安装教程
  10. 大学生能从计算机游戏中受益,2017年12月英语四级作文范文:大学生玩游戏
  11. centos 7 安装ntp服务器
  12. 计算机思维导论在线作业答案,大学计算机计算思维导论第讲习题及解析.pdf
  13. ADB usb 或 WiFi 连接手机 ADB工具下载
  14. bak 安全牛 kali link
  15. Android studio 运行警告 We recommend using a newer Android Gradle plugin to use compileSdk = 33
  16. EDM营销的关键是什么
  17. 无盘服务器chkdsk *: /f)修复命令,使用CHKDSK命令修复U盘文件或目录损坏无法读取问题...
  18. 软件相关的小问题记录
  19. css3之BFC、IFC、GFC和FFC
  20. 开源引路人:我的Apache Mentor之路

热门文章

  1. spring的事务有几种方式
  2. ConcurrentHashMap 和 Hashtable 的区别
  3. 015_logback中的自定义Appender
  4. 009_Redis的事物
  5. 009_CSS分组选择器
  6. php写一个轻量级的容器,PHP写的一个轻量级的DI容器类
  7. React Native
  8. 初试BMap时出现BMap is not defined错误(HTML页面)
  9. python训练馆_Python训练营 01
  10. 视频播放页php,html jquery简易视频播放器