zoukankan      html  css  js  c++  java
  • 快速解决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)。
  • 相关阅读:
    Linux上的SQL Server的起步
    SQL Server 2016 SP1 标准版等同企业版?!
    为什么简单恢复模式模式真的是坏主意?
    在SQL Serve里停用行和页层级锁
    SQL Server里的闩锁耦合(Latch Coupling)
    我有几个NUMA节点
    SQL Server里在文件组间如何移动数据?
    对于SQL Server,我需要多少内存
    SQL Server里的文件和文件组
    重启SQL Server——总是好事?
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/8252476.html
Copyright © 2011-2022 走看看