当一个进程使用 成功获取 fdopen(flags=O_RDWR)
时,只要 fd 没有关闭(本地文件系统上的常规文件),它就能够读/写该文件,即使其他进程使用 chmod 取消读/写相应用户的权限。Linux内核是否检查inode或打开文件描述的文件权限?但是当进程尝试使用 执行该文件execveat
时,内核会读取磁盘以检查 x 位和 suid 位权限吗?打开文件描述中记录了什么样的权限,它是否包含完整的 ACL 或简单的可读/可写位,因此每个操作 else( execveat
、fchdir
、fchmod
等) 都会检查磁盘信息?
如果我将此 fd 转移到另一个进程的 fsuid 在该文件上没有读/写/执行位的另一个进程(根据磁盘上的文件系统信息),接收进程是否能够读/写/执行通过 fd 归档?
execveat
由 处理do_open_execat
,它指定它希望能够打开目标文件以执行。文件打开过程通过do_filp_open
和处理path_openat
,路径遍历过程单独记录。所有这一切的结果,无论进程如何启动,都是 astruct file
及其关联struct inode
的存储文件的模式,如果相关,则指向 ACL。inode 数据结构由引用相同 inode 的所有文件描述共享。内核保证内存中的inode信息在检索时是最新的。在某些情况下(尤其是本地文件系统、ext4、ext3、XFS 和 btrfs),这可以在 dentry 和 inode 缓存中维护,在其他情况下,它会涉及一些 I/O(特别是通过网络)。
权限检查本身稍后执行,由
bprm_fill_uid
; 这会考虑到 inode 上的当前权限以及调用用户的当前权限。如前所述,权限仅在文件打开、映射或更改其元数据时验证,而不是在读取或写入时验证;因此文件描述符可以在没有新权限检查的情况下跨进程传递。
不会。“打开文件描述”( ) 中除了文件访问模式和文件状态标志之外,没有保留任何“权限”
struct file
,可以使用fcntl(F_GETFL)
或通过检索/proc/PID/fdinfo/FD
。所有文件权限都保存在struct inode
从那里引用的文件中(并且在所有打开该特定文件的进程/用户之间共享)。Astruct file
还持有对开启者凭据的引用。如果您要问
execveat(fd, "", av, env, AT_EMPTY_PATH)
的是仅使用文件描述符作为指向 inode 的指针,那么将检查所有内容,就像引用的文件是通过其路径执行一样。的标志fd
无关紧要;文件描述符可以是一个不透明的句柄O_PATH
(通过某个路径访问的任何文件都会成功)。