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

本文介绍了如何解决Android中的SELinux权限问题,提供了一种通过调整.te文件中的语句来允许特定进程搜索文件夹的方法,并给出了在调试阶段临时关闭SELinux的命令,包括设置Permissive和Enforcing模式,以及获取当前SELinux状态的命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

通过如下命令:

adb shell
logcat | 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)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值