在/ proc / sys中访问文件时内核中发生了什么权限检查?

问题描述

我对/proc/sys感兴趣,并试图了解此目录中文件的访问控制机制。
我不确定访问/proc/sys是否与访问磁盘文件系统(例如ext4)相同。因此,我只是从open系统调用开始,尝试跟踪进程中调用的关键内核函数
并发现它首先调用do_sys_open(),内部调用do_filp_open()。在do_filp_open()中,首先完成一些路径名解析,然后调用may_open()进行权限检查,最后调用vfs_open()根据文件系统执行特定的打开功能
通过阅读源代码,我认为权限检查工作确实是由位于/fs/namei.c中的generic_permission()完成的。整个功能如下:

int generic_permission(struct inode *inode,int mask)
{
    int ret;

    /*
     * Do the basic permission checks.
     */
    ret = acl_permission_check(inode,mask);
    if (ret != -EACCES)
        return ret;

    if (S_ISDIR(inode->i_mode)) {
        /* DACs are overridable for directories */
        if (capable_wrt_inode_uidgid(inode,CAP_DAC_OVERRIDE))
            return 0;
        if (!(mask & MAY_WRITE))
            if (capable_wrt_inode_uidgid(inode,CAP_DAC_READ_SEARCH))
                return 0;
        return -EACCES;
    }
    /*
     * Read/write DACs are always overridable.
     * Executable DACs are overridable when there is
     * at least one exec bit set.
     */
    if (!(mask & MAY_EXEC) || (inode->i_mode & S_IXUGO))
        if (capable_wrt_inode_uidgid(inode,CAP_DAC_OVERRIDE))
            return 0;

    /*
     * Searching includes executable on directories,else just read.
     */
    mask &= MAY_READ | MAY_WRITE | MAY_EXEC;
    if (mask == MAY_READ)
        if (capable_wrt_inode_uidgid(inode,CAP_DAC_READ_SEARCH))
            return 0;

    return -EACCES;
}

因此,似乎好像首先要进行UGO检查,如果UGO失败的内核将检查您是否具有特殊功能。但是此过程与我尝试访问/ proc / sys下的文件时看到的实验结果不一致。
以/ proc / sys / kernel / usermodehelper / bset为例:

$ ll /proc/sys/kernel/usermodehelper/bset
-rw------- 1 root root 0 Nov  6 12:15 /proc/sys/kernel/usermodehelper/bset

文件归root拥有,无法从其他人读取。根据generic_permission()中的逻辑,如果非root用户具有CAP_DAC_OVERRIDE,则可以读取此文件。因此我给了/bin/cat CAP_DAC_OVERRIDE,但是却获得了“权限被拒绝”,但仍然无法读取文件
但是,在CAP_DAC_OVERRIDE到/etc/shadow之后,我可以读取cat也是根文件,普通用户无法读取。
为什么会发生?访问/proc/sys下的文件时,权限检查过程如何?它不是通过generic_permission()吗?访问/proc/sys时内核中还有其他检查吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...