问题描述
我对/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 (将#修改为@)