• Android 在 SElinux下 如何获得对一个内核节点的访问权限


    01> 文件拷贝脚本:

    MT6580_M/external$ vi sepolicy/cpgf3208.sh

    #!/bin/bash
    
    echo nicek: cp_gf3208
    DIR=$(cd `dirname $0`; pwd)
    #echo $DIR                                                                                                                                   
    cp ${DIR}/gf3208_te/* ${DIR}/
    cp ${DIR}/../../device/mediatek/common/gf3208_te/* ${DIR}/../../device/mediatek/common/sepolicy/

     将对应属性添加到:

     生效的文件:

     

    删掉不用的功能,保留只用的,再将删掉功能中添加的其他属性放到该文件下;

     Android 5.0下,因为采取了SEAndroid/SElinux的安全机制,即使拥有root权限,或者对某内核节点设置为777的权限,仍然无法在JNI层访问。

     
    01设备节点(或bin文件);02file_contexts;03device.te;04进程文件添加权限;
    本文将以用户自定义的内核节点/dev/wf_bt为例,手把手教会读者如何在JNI层获得对该节点的访问权限。
     
    第一步:找到需要访问该内核节点的进程(process),笔者自己这个节点由system_server进程来访问
     
    第二步:打开文件AndroidL/android/external/sepolicy/file_contexts
    仿照这个文件里的写法,为你的节点定义一个你想要的名字:
    [python] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /dev/tegra.* u:object_r:video_device:s0  
    2. /dev/tf_driver u:object_r:tee_device:s0  
    3. /dev/tty u:object_r:owntty_device:s0  
    4. /dev/tty[0-9]* u:object_r:tty_device:s0  
    5. # We add here  
    6. /dev/wf_bt              u:object_r:wf_bt_device:s0  
    wf_bt_device是自定义,其他左右两边的内容都和上面的范例一致。
     
    第三步:打开文件AndroidL/android/external/sepolicy/device.te
    仿照这个文件里的写法,将刚刚第二步写的wf_bt_device声明为dev_type:
    [python] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. # Device types  
    2. type device, dev_type, fs_type;  
    3. type alarm_device, dev_type, mlstrustedobject;  
    4. type adb_device, dev_type;  
    5. type ashmem_device, dev_type, mlstrustedobject;  
    6. type audio_device, dev_type;  
    7. type binder_device, dev_type, mlstrustedobject;  
    8. type block_device, dev_type;  
    9. # We add here  
    10. type wf_bt_device, dev_type;  
    第四步:
    AndroidL/android/external/sepolicy/目录下很多.te文件都是以进程名来结尾的,比如有针对surfaceflinger进程的surfaceflinger,有针对vold进程的vold.te,
    刚刚从第一步得到,这个节点是由system_server进程来访问,所以,我们找到system_server.te打开,加入允许这个进程对/dev/wf_bt的读写权限
     
    [python] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. # Read/Write to /proc/net/xt_qtaguid/ctrl and and /dev/xt_qtaguid.  
    2. allow system_server qtaguid_proc:file rw_file_perms;  
    3. allow system_server qtaguid_device:chr_file rw_file_perms;  
    4.   
    5. # chr_file表示字符设备文件,如果是普通文件用file,目录请用dir  
    6. # rw_file_perms代表读写权限  
    7. allow system_server wf_bt_device:chr_file rw_file_perms;  // 允许system_server进程拥有对wf_bt_device的这个字符设备的读写权限;
    这句话的意思是:允许system_server进程拥有对wf_bt_device的这个字符设备的读写权限。
    改了这些之后,你就可以make installclean;make -j16编译image来验证权限是否获取成功。
     
    fd =open("/dev/wf_bt",O_RDONLY | O_NOCTTY); 绝对成功!!!!!

    =====================================

    allow system_server wf_bt_device:chr_file rw_file_perms; //允许system_server进程拥有对wf_bt_device的这个字符设备的读写权限。

     ls -Z 节点 (查看权限)

    可以用命令来查看selinux的状态 getenforce 这个命令可以查看到selinux的状态,当前可以看到是关闭状态的。 还有一个命令也可以查看出selinux的状态。 sestatus -v 还有一个setenforce 命令可以设置selinux的状态

    xxx:# getenforce 
    Enforcing

    mmm external/sepolicy
    make -j24 ramdisk-nodeps
    make -j24 bootimage-nodeps

     对于tee:

    可信执行环境(TEE)介绍 与应用

    -------------------

  • 相关阅读:
    如何实现桌面App图标可以动态显示消息数(类似手机上的QQ图标)?
    Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库
    Quartz.NET开源作业调度框架系列(四):Plugin Job
    Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递
    Quartz.NET开源作业调度框架系列(二):CronTrigger
    Quartz.NET开源作业调度框架系列(一):快速入门step by step
    如何在Visual Studio中开发自己的代码生成器插件
    C#如何定制Excel界面并实现与数据库交互
    Ajax+PHP+MySQL 登陆示例
    Tomcat性能优化(二) ExpiresFilter设置浏览器缓存
  • 原文地址:https://www.cnblogs.com/Ph-one/p/5708836.html
Copyright © 2020-2023  润新知