当进程使用 成功获取 fd 时open(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存储文件\xe2\x80\x99s 模式以及指向 ACL(如果相关)的点。索引节点数据结构由引用相同索引节点的所有文件描述共享。
内核保证内存中的索引节点信息在检索时是最新的。在某些情况下(尤其是本地文件系统,ext4、ext3、XFS 和 btrfs),这可以在 dentry 和 inode 缓存中维护,而在其他情况下,它将涉及一些 I/O(特别是通过网络)。
\n\n权限检查本身稍后执行,由bprm_fill_uid; 这会考虑 inode 上的当前权限以及调用用户的当前权限。
如前所述,仅在打开、映射文件或其元数据更改时验证权限,而不是在读取或写入文件时验证权限。因此文件描述符可以跨进程传递,而无需新的权限检查。
\n