在 setuid root 程序中,如何检查当前用户(那个 root 正在为之工作)是否拥有一个文件?

In a setuid root program, how to check that the current user (that root is doing the work for) owns a file?

用例是挂载工具,我想限制挂载(unionfs(r+x dir, squashfs))到调用者拥有的文件。

我知道 fusefs,但我想在内核中使用 overlayfs 和 squashfs。

只要您还没有调用 setuid()setreuid(),您就可以使用 getuid() 来获取执行您的程序的用户的用户 ID。完成后,您可以使用 stat() 获取文件的所有者。

或者,您可以使用access()系统调用来检查用户是否可以读、写、and/or执行指定路径。 access() 使用真实用户 ID,而不是有效用户 ID,因此不会使用 root 的权限来执行此访问检查。

无论哪种情况,请注意不要在此检查中引入 time-of-check/time-of-use (TOCTOU) 漏洞。请记住,路径指向的对象可能随时更改,即使您的应用程序处于 运行。符号链接在这里特别危险!