SELINUX安全访问机制,配置

前言:

此篇blog直接切入主题教大家怎么去修改相应代码,配置相应的寄存器直至设备正常运行,至于原理之前有博客介绍了,不在这里多谈了。

应用层控制呼吸灯

Android是基于Linux内核,设备的节点是设备驱动的逻辑文件,可以通过设备节点来访问设备驱动。但是由于Android 5.0及以上的版本,Google对源码环境普遍采用了SELINUX安全访问机制,APP及Framework层在默认情况下是无权限访问设备节点的。

解决办法有两种:以System APP或者System Server进程开放权限。

1)SEAndroid 为Sys设备节点开放访问(读或写)权限方法(如:sys/class/leds/red_aux/brightness)

  1. SEAndroid为proc设备节点开放访问(读或写)权限方法(如:proc/touchscrren_feature/gesture_data)

我们在这里以第一种方式修改操作呼吸灯设备节点为例进行说明,如红灯sys/class/leds/red_aux/brightness,为APP层system app进程开放访问权限(读或写)
1.APP层写节点之前,必须确保当前应用程序能够有权限去读写

否则是无法正常写入的,如果应用没有权限写设备节点,首先进入源码目录中system/core/rootdir/init.rc;

修改内容如下:

1
2
3
4
     //开放节点让系统进程可以访问
  chown system system /sys/class/leds/red_aux/brightness
   //修改设备节点可读可写
 chmod 0666 /sys/class/leds/red_aux/brightness

2.然后进入/device/qcom/sepolicy/common

找到file.te文件按,加入以下的类型声明:

leds file

type sysfs_ledred_leds, fs_type, sysfs_type;

3.在同一目录下找到file_contexts文件

绑定sysfs_ledred_leds到对应的实际节点,加入以下声明:

/sys/devices/soc/75b5000.i2c/i2c-7/7-0045/leds/red_aux/brightness u:object_r:sysfs_ledred_leds:s0

4.获取实际节点方法:

1)获取root权限

2)切换到sys/class/leds

3)ls -l 指令查看节点对应的实际挂载点

如red_aux 对应的实际节点查看是…/…/devices/soc/75b5000.i2c/i2c-7/7-0045/leds/red_aux/

注意:不同设备其对应的节点和实际挂载点会有所不同,根据各自的设备请自行查看。

5.再在该目录下找到syserem_app.te文件,加入以下权限声明:

allow system_app sysfs_ledred_leds:file rw_file_perms;

//rw_file_perms代表读写权限,该话的意思事允许systen_app进程能够拥有对sysfs_ledred_leds的这个字符设备的读写权限;如果system_server 则表示是system_server进程

allow system_app sysfs_ledred_leds:file { create open read setattr write };
注意:以上的sysfs_ledred_leds必须与file.te文件中声明的文件类型、名称必须一致。
/**

  • 往文件里面写数据
  • @param path 代表要写值的路径,即要写值得LED挂载节点路径
  • @param value 要写的值
    */
    private void write_int(String path, int value) {
    String strColor = String.valueOf(value);
    try {
    BufferedWriter bufWriter = null;
    bufWriter = new BufferedWriter(new FileWriter(path));
    bufWriter.write(strColor);
    Log.i(TAG,“strColor======”+strColor);
    bufWriter.close();
    }

catch (Exception e) {

e.printStackTrace();
Log.e(TAG, "can’t write the " + path);
}
}

6.在AndroidMainefest.xml中配置

android:sharedUserId=”android.uid.system”;该步骤是必须的,因为在3步骤设置就是只运行系统APP进程来进行访问设备节点。

然后write_init("/sys/class/leds/red_aux/brightness", 255);既可以点亮的LED灯红色。

如果需要开放system server能够对节点权限进行控制,需要在/device/qcom/sepolicy/common目录下找到system_server.te文件,增加allow system_server sysfs_ledred_leds:file rw_file_perms;

该方法的缺点:需要在framework层添加随系统启动的service,增加代码量 优点是:可以自由控制哪些应用可以访问,哪些应用禁止访问已经开放的设备节点,可以更好的保护安全问题;2.framework和app层都可以访问该设备节点,不用再另外申请权限。

7.读写proc节点

1) 在alps/mediatek/common/sepolicy/file.te 定义selinux type: proc_quick_gesture,如下: type proc_quick_gesture, fs_type;

2)在 alps/mediatek/common/sepolicy/genfs_contexts,绑定proc_quick_gesture到对应的实际节点 genfscon proc /touchscreen_feature/gesture_data u:object_r:proc_quick_gesture:s0

3) 在alps/mediatek/common/sepolicy/common/system_app.te,申请权限 allow system_app proc_quick_gesture:file rw_file_perms;

4) 在AndroidManifest.xml,配置:android:sharedUserId=“android.uid.system” 经过以上4步,system_app进程就具备权限(读或写)访问/proc/touchscreen_feature/gesture_data等节点

//
apq8098_latv common msm8909 msm8916 msm8937 msm8952 msm8953 msm8974 msm8976 msm8992 msm8994 msm8996 msm8998 msmnile msmskunk msmsteppe ota sdm660 sdm710 sdm845 ssg test
yongjin@yongjin:~/work/F300/F300-master/device/qcom/sepolicy/vendor$ git diff .
diff --git a/device/qcom/sepolicy/vendor/common/file.te b/device/qcom/sepolicy/vendor/common/file.te
index 7484a71…c700ee2 100755
— a/device/qcom/sepolicy/vendor/common/file.te
+++ b/device/qcom/sepolicy/vendor/common/file.te
@@ -91,6 +91,7 @@ type persist_rfs_shared_hlos_file, file_type, vendor_persist_type;

#mm-pp-daemon file type for sysfs access
#type sysfs_leds, fs_type, sysfs_type;
+type sysfs_brightness, sysfs_type, fs_type;

#Define the files written during the operation of mm-pp-daemon
type data_ad_calib_cfg, file_type, data_file_type;
diff --git a/device/qcom/sepolicy/vendor/common/file_contexts b/device/qcom/sepolicy/vendor/common/file_contexts
index 681dd02…01d2756 100755
— a/device/qcom/sepolicy/vendor/common/file_contexts
+++ b/device/qcom/sepolicy/vendor/common/file_contexts
@@ -8,6 +8,11 @@
#add by maw for kla
/dev/ttyMSM0 u:object_r:pos_serial_device:s0
#end
+
+/sys/devices/platform/soc/soc:gpio-leds/leds/blue/brightness u:object_r:sysfs_brightness:s0
+/sys/devices/platform/soc/soc:gpio-leds/leds/green/brightness u:object_r:sysfs_brightness:s0
+/sys/devices/platform/soc/soc:gpio-leds/leds/red/brightness u:object_r:sysfs_brightness:s0
+/sys/devices/platform/soc/soc:gpio-leds/leds/yellow/brightness u:object_r:sysfs_brightness:s0

/dev/adsprpc-smd u:object_r:qdsp_device:s0
/dev/adsprpc-smd-secure u:object_r:xdsp_device:s0
diff --git a/device/qcom/sepolicy/vendor/common/system_app.te b/device/qcom/sepolicy/vendor/common/system_app.te
index 2434bcd…1d03f6d 100644
— a/device/qcom/sepolicy/vendor/common/system_app.te
+++ b/device/qcom/sepolicy/vendor/common/system_app.te
@@ -36,6 +36,10 @@ allow system_app pos_serial_device:chr_file { read write open ioctl };
allow system_app sysfs_gpio:file { read write open ioctl };
allow system_app sysfs_gpio:dir { read search };
#end
+
+allow system_app sysfs_leds:dir search;
+allow system_app sysfs_brightness:file {rw_file_perms open};
+
#add by yanhuayi for factory test app
allow system_app sysfs_battery_supply:dir { read search };
allow system_app sysfs_battery_supply:file { read open getattr};