当您在 Linux 中更改进程所有权 (uid/gid) 时,已经打开的文件会发生什么情况?

What happens to already opened files when you change process ownership (uid/gid) in Linux?

可以更改当前进程的 UID/GID,因为它使用 setresgid/setresuid 以编程方式运行,这会影响未来的文件访问权限。

但是已经打开或内存映射的文件会怎样? read/write 等 i/o 操作是否仍可访问它们?我在库执行的 "not explicit" i/o 操作的上下文中询问更多,例如 sqlite 数据库或其他在内部对文件进行操作的库。以 DIRECT_IO 模式打开的文件在这方面听起来更加不确定。

当您打开文件时,您能否打开文件取决于您打开文件时的有效 uid 和 gid。

当您更改有效的 uid 或 gid 时,它不会影响您可能拥有的任何打开的文件描述符。

在大多数情况下,如果您有一个有效的文件描述符,那么您只需要读取或写入该描述符所连接的资源即可。您持有有效文件描述符这一事实应该是您拥有 read/write 基础资源权限所需的全部证据。

当您使用普通文件描述符读取或写入时,不会执行额外的授权检查。这部分是为了提高效率(因为每次执行这些身份验证检查的成本都很高),部分是为了——这可能正是你想要做的——你可以打开一个特权资源,降级你的进程的特权,并且继续访问开放资源。

底线:是的,进程完全有可能使用打开的文件描述符来读取或写入无法打开的文件(基于其当前 uid/gid)。


脚注:我所说的适用于连接到普通资源(文件、设备、管道、网络流等)的普通 Unix 文件描述符。但正如@Mark Plotnick 在评论中提醒的那样,一些文件描述符和基础资源是 "different" —— NFS 和 Linux /proc 文件是两个例子。对于那些,可以在 read/write.

时执行额外的检查