• 快速解决Android中的selinux权限问题【转】


    本文转载自:http://blog.csdn.net/mike8825/article/details/49428417

    关于selinux的详细资料,请查阅http://blog.csdn.net/innost/article/details/19299937

    在Android开发的过程中,遇到关于selinux相关的东西,当时还一下子看不懂,现在好像有点眉目了。

    比如,内核打印这个提示

    type=1400 audit(32.939:25): avc: denied { open } for pid=2592 comm="chmod" path="/dev/block/mmcblk0p25" dev="tmpfs" ino=6494 scontext=u:r:init_shell:s0 tcontext=u:object_r:block_device:s0 tclass=blk_file permissive=1

    当然,这种信息有时太长了,以致于在minicom中出现了信息丢失的情况,可按参考http://blog.csdn.net/mike8825/article/details/49422727里的方法解决。

    我们可以遵循这个方法,从头开始寻找关键对象,然后调整一下顺序,生成一条语句,最后将该语句填写到.te文件(external/sepolicy/*.te)中即可。

    denied { open }             u:r:init_shell:s0            u:object_r:block_device:s0       tclass=blk_file                  

                 A                               B                                              C                                       D
      
                 B                               C                                              D                                       A

    allow init_shell  block_device:blk_file open;

    这条语句表示允许init_shell域中的block_device进程打开block_device类型的块设备文件。

     

    有时候会遇到编译该规则失败,这也许就是neverallow语句做怪了。

    neverallow用来检查安全策略文件中是否有违反该项规则的allow语句

    如external/sepolicy/netd.te文件中,语句

    neverallow netd dev_type:blk_file { read write };

    表示永远不允许netd域中的进程读写dev_type类型的块设备文件,这时只需屏蔽该语句即可。

    当然,在调试阶段,可在终端上运行如下命令获取SELinux的状态和临时关闭SELinux

    setenforce 0                  ##设置SELinux 成为permissive模式(SELinux开启,但对违反selinux规则的行为只记录,不会阻止)

    setenforce 1                  ##设置SELinux 成为enforcing模式 (SELinux开启)

    getenforce                     ##获取SELinux状态(permissive,enforcing,disabled)

    当然,测试的时候也可以在cmdline中加入androidboot.selinux=disabled来关闭selinux

    或者到Android源码的根目录下,直接修改system/core/init/init.c文件。

    [cpp] view plain copy
     
    1. static void selinux_initialize(void)  
    2. {  
    3.     if (selinux_is_disabled()) {  
    4.         return;  
    5.     }  
    6.   
    7.     INFO("loading selinux policy ");  
    8.     if (selinux_android_load_policy() < 0) {  
    9.         ERROR("SELinux: Failed to load policy; rebooting into recovery mode ");  
    10.         android_reboot(ANDROID_RB_RESTART2, 0, "recovery");  
    11.         while (1) { pause(); }  // never reached  
    12.     }  
    13.   
    14.     selinux_init_all_handles();  
    15.     bool is_enforcing = selinux_is_enforcing();  
    16.     INFO("SELinux: security_setenforce(%d) ", is_enforcing);  
    17.     security_setenforce(is_enforcing);  
    18. }  
    修改is_enforcing的值(0或者1)。
  • 相关阅读:
    DSYMTools App Bug 分析工具
    Xcode dSYM 文件
    sqlserver数据库18456错误怎么解决?
    C#两个DataTable拷贝问题:该行已经属于另一个表的解决方法
    SNF微信公众号客户端演示-微信开发客户端能干什么
    sqlserver中创建链接服务器图解教程
    C#日期格式转换大全
    C#-MVC开发微信应用(8)--菜单管理的实现
    C#-MVC开发微信应用(7)--在管理系统中同步微信用户分组信息
    C#-MVC开发微信应用(6)--用户分组信息管理
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/8252476.html
Copyright © 2020-2023  润新知