Android 获得对一个设备节点的访问权限

Android 获得对设备节点的访问权限

       Android 5.0 下,因为采取了 SEAndroid/SElinux 的安全机制,即使拥有 root权限,或者对某内核节点设置为 777 的权限,仍然无法在 JNI 层访问。
       本文将以用户自定义的内核节点 /dev/wf_bt 为例,手把手教会读者如何在 JNI 层获得对该节点的访问权限。

可分为以下四个步骤:

  • 第一步:找到需要访问该内核节点的进程(process),假设这个节点由 system_server 进程来访问。
  • 第二步:打开文件 mydroid/external/sepolicy/file_contexts,仿照这个文件里的写法,为你的节点定义一个你想要的名字,如下:
/dev/watchdog       u:object_r:watchdog_device:s0
/dev/xt_qtaguid u:object_r:qtaguid_device:s0
/dev/zero       u:object_r:zero_device:s0
/dev/__kmsg__       u:object_r:klog_device:s0
/dev/__properties__ u:object_r:properties_device:s0
# example
/dev/wf_bt      u:object_r:wf_bt_device:s0  

       wf_bt_device 是自定义,其他左右两边的内容都和上面的范例一致。

  • 第三步:打开文件 mydroid/external/sepolicy/device.te ,仿照这个文件里的写法,将刚刚第二步写的wf_bt_device 声明为 dev_type:
type video_device, dev_type;
type vcs_device, dev_type;
type zero_device, dev_type;
type fuse_device, dev_type;
type iio_device, dev_type;
type ion_device, dev_type, mlstrustedobject;
type gps_device, dev_type;
type qtaguid_device, dev_type;
type watchdog_device, dev_type;
type uhid_device, dev_type;
type uio_device, dev_type;
type tun_device, dev_type, mlstrustedobject;
type usbaccessory_device, dev_type;
type usb_device, dev_type;
type klog_device, dev_type;
type properties_device, dev_type;
# example
type wf_bt_device, dev_type;  
  • 第四步:打开文件夹 mydroid/external/sepolicy/ ,你会发现有许多以进程名字命名的te文件:
    Android 获得对一个设备节点的访问权限_第1张图片

       在第一步中,这个节点是由 system_server 进程来访问,于是我们找到 system_server.te 打开,加入允许这个进程对 /dev/wf_bt 设备节点的读写权限:

# Allow system server to search and write to the persistent factory reset
# protection partition. This block device does not get wiped in a factory reset.
allow system_server block_device:dir search;
allow system_server frp_block_device:blk_file rw_file_perms;
allow system_server input_device:dir r_dir_perms;
allow system_server input_device:chr_file rw_file_perms;

# chr_file表示字符设备文件,如果是普通文件用file,目录请用dir  
# rw_file_perms代表读写权限  
# example
allow system_server wf_bt_device:chr_file rw_file_perms;  //允许 system_server 进程拥有对 wf_bt_device 的这个字符设备的读写权限;

     这句话的意思是:允许 system_server 进程拥有对 wf_bt_device 的这个字符设备的读写权限。修改完后重新编译 mmm external/sepolicy -B,然后再重新生成刷机包,刷机测试。

你可能感兴趣的:(Linux)