快速解决Android中的SELinux权限问题

来源:互联网 发布:铁路运输数据 编辑:程序博客网 时间:2024/05/16 12:09

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

通过如下命令:

adb shelllogcat | grep 'avc:'
查看内核log打印的权限错误提示

avc: denied { search } for name="/" dev="tmpfs" ino=9626 scontext=u:r:dumpfile:s0 tcontext=u:object_r:tmpfs:s0 tclass=dir permissive=0

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

device\mediatek\common\sepolicy\basic/*.te)中即可

             denied { search }    u:r:dumpfile:s0    u:object_r:tmpfs:s0    tclass=dir

                  A                              B                             C                           D

                  B                              C                             D                           A

allow         dumpfile                     tmpfs:                        dir                     {search}

这条语句表示允许dumpfile域中的tmpfs进程搜索文件夹

当然,在调试阶段,可在终端上运行如下命令获取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文件

static void selinux_initialize(bool in_kernel_domain) {    Timer t;    selinux_callback cb;    cb.func_log = selinux_klog_callback;    selinux_set_callback(SELINUX_CB_LOG, cb);    cb.func_audit = audit_callback;    selinux_set_callback(SELINUX_CB_AUDIT, cb);    if (in_kernel_domain) {        INFO("Loading SELinux policy...\n");        if (selinux_android_load_policy() < 0) {            ERROR("failed to load policy: %s\n", strerror(errno));            security_failure();        }        bool kernel_enforcing = (security_getenforce() == 1);        bool is_enforcing = selinux_is_enforcing();        if (kernel_enforcing != is_enforcing) {            if (security_setenforce(is_enforcing)) {                ERROR("security_setenforce(%s) failed: %s\n",                      is_enforcing ? "true" : "false", strerror(errno));                security_failure();            }        }        if (write_file("/sys/fs/selinux/checkreqprot", "0") == -1) {            security_failure();        }        NOTICE("(Initializing SELinux %s took %.2fs.)\n",               is_enforcing ? "enforcing" : "non-enforcing", t.duration());    } else {        selinux_init_all_handles();    }}
修改security_getenforce()的值(0或者1)。