温馨提示

     建议你先了解一下上一篇博文([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)
 
 

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. [Android L]SEAndroid增强Androd安全性背景概要及带来的影响

    1  SEAndroid背景   Android对于操作系统安全性方面的增强一直沿用Linux内核所提供的MAC强制访问控制套件SELinux,对权限进行了更为深度的管理,有效地控制着进程对资源的访问 ...

  2. class_create(),device_create自动创建设备文件结点

    class_create(),device_create自动创建设备文件结点 从linux 内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代.相比devfs,udev有很多优 ...

  3. java创建TXT文件并进行读、写、修改操作

    import java.io.*; /**  *   * 功能描述:创建TXT文件并进行读.写.修改操作  *        * @author <a href="mailto:zha ...

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

    一.Python open()函数文件打开操作 打开文件会用到open函数,标准的python打开文件语法如下:open(name[,mode[,buffering]])open函数的文件名是必须的, ...

  5. class_create(),device_create自动创建设备文件结点【转】

    本文参考来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhenwenxian/archive/2010/03/28/5424434.aspx 本文转自:http://ww ...

  6. unity Android在streamingAssets路径下文件无法读取的的解决方法

    unity Android在streamingAssets路径下文件,有时候plugin下的.jar或者.so无法直接读取: 解决方法之一,拷贝至其他路径: #if UNITY_ANDROID str ...

  7. Android 文件的可读可写

    文件流形式的保存,获取: 设立文件的私有,可读,可写,公开: 效果图: /data/data中文件夹: 新建一个项目测试文件: 得到data/data,查看文件的特性:

  8. selenium实现excel文件数据的读、写

    在进行软件测试或设计自动化测试框架时,一个不可避免的过程就是: 参数 化,在利用 python 进行自动化测试开发时,通常会使用 excel 来做数据管 理,利用 xlrd.xlwt 开源包来读写 e ...

  9. Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(执行操作前就转换编码)

    今天研究了一下QFtp这个类,发现访问得到的文件名称中一旦出现中文,不管怎么转换编码格式,最终显示出来的始终都是乱码.由于编码错误,我写了两个函数用于互相转换编码. 一个是由正常编码转为QFTP上所谓 ...

随机推荐

  1. webstom设置和monokia配色方案

    首先,最后配色结果如下: 本次配色参考几个文档: http://frontenddev.org/article/webstorm-portal-1-subject-and-match-colors.h ...

  2. plsql修改表报错:ORA-25150

    几次通过plsql修改表结构出现这个错误,为人不求甚解真是要不得.我甚至对老大大言不惭的说没有权限,即便是sql语句都不行.结果赤果果地打脸. 最终找到如下原因: 1.操作用户表空间的默认值问题: 这 ...

  3. 23套新鲜出炉的网站和手机界面 PSD 素材

    Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这些套件让他们使用快速和有效的方式复制用户界面.这些类型的工具包提供了一个基本的用户界面元素,用于它们需要制作的网站或软件模型. 在这篇文章 ...

  4. 基于HT for Web的Web SCADA工控移动应用

    在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在 ...

  5. CSS魔法堂:hasLayout原来是这样!

    前言 过去一直听说旧版本IE下很多诡异bug均由一个神秘角色引起的,那就是hasLayout.趁着最近突然发神经打算好好学习CSS,顺便解答多年来的疑惑. hasLayout到底是何方神圣? hasL ...

  6. 理解SQL Server是如何执行查询的 (1/3)

    查询执行的总图: 根据总图的流程,详细说明每个部分: 1. 请求(Request) SQL Server是C/S架构的平台.与它交互的唯一方式就是发送包含数据库命令的请求.应用程序和数据库之前的通信协 ...

  7. 暴力枚举 + 24点 --- hnu : Cracking the Safe

    Cracking the Safe Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit u ...

  8. SQL去除回车符,换行符,空格和水平制表符

    MS SQL去除回车符,换行符,空格和水平制表符,参考下面语句,一般情况是SQL接受富文本或是textarea的内容.在数据库接收到这些数据之后,还是对其做一些处理. ),),),''),' ','' ...

  9. Xcode开发工具问题

    昨天打开Xcode 发现鼠标光标变成了黑色的块状,不能编辑内容了,且Content区域还多出了一个显示文件路径的框框 如下图: 然后自己百度,到论坛提问.到QQ群里问;卸载重装Xcode.重装系统各种 ...

  10. kFreeBSD有活过来的迹象?UbuntuBSD

    那些年追过的FreeBSD分支,有debian系的kFreeBSD,arch系的archBSD现在叫pacBSD,gentoo系的gentooBSD:但基本上在虚拟机环境很难成功安装http://ww ...