快速解决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)。
原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/8252476.html