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

如何解决在/ 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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?