SETFSUID - Linux手册页
Linux程序员手册 第2部分
更新日期: 2019-05-09
名称
setfsuid-设置用于文件系统检查的用户身份
语法
#包括
int setfsuid(uid_t fsuid);
说明
在Linux上,进程同时具有文件系统用户ID和有效用户ID。 (特定于Linux的)文件系统用户ID用于访问文件系统对象时的权限检查,而有效用户ID用于其他各种权限检查(请参阅凭据(7))。
通常,进程的文件系统用户ID的值与其有效用户ID的值相同。之所以如此,是因为每当更改进程的有效用户ID时,内核也会将文件系统用户ID更改为与有效用户ID的新值相同。通过使用setfsuid()将其文件系统用户ID更改为fsuid中给定的值,进程可以使其文件系统用户ID的值与有效用户ID偏离。
通常仅由诸如Linux NFS服务器之类的程序使用对setfsuid()和setfsgid(2)的显式调用,这些程序需要更改用于访问文件的用户名和组ID,而无需更改实际有效用户和组ID。诸如NFS服务器之类的程序的正常用户ID的更改是(可能是)一个安全漏洞,该漏洞可能会使程序暴露于有害信号。 (但是,此问题是历史性问题;请参阅下文。)
仅当调用者是超级用户或fsuid与调用者的真实用户ID,有效用户ID,已保存的设置用户ID或当前文件系统用户ID匹配时,setfsuid()才会成功。
返回值
无论成功还是失败,此调用都返回调用者的先前文件系统用户ID。
版本
从1.2版开始,Linux中存在此系统调用。
遵循规范
setfsuid()是特定于Linux的,不应在旨在可移植的程序中使用。
备注
在引入此系统调用时,一个进程可以使用相同的有效用户ID向另一个进程发送信号。这意味着,如果特权进程出于文件权限检查的目的而更改了其有效的用户ID,则它很容易受到另一个具有相同用户ID的(非特权)进程发送的信号的攻击。因此,添加了文件系统用户ID属性,以允许进程更改其用户ID,以进行文件权限检查,而同时又不容易受到不必要信号的影响。从Linux 2.0开始,信号许可处理有所不同(请参阅kill(2)),结果是进程可以更改其有效用户ID,而又不容易受到来自有害进程的信号的攻击。因此,如今不再需要setfsuid(),在新的应用程序中应避免使用setfsgid(2)。
原始的Linux setfsuid()系统调用仅支持16位用户ID。随后,Linux 2.4添加了支持32位ID的setfsuid32()。 glibc setfsuid()包装函数透明地处理了内核版本之间的差异。
C library/kernel differences
在glibc 2.15和更早版本中,当此系统调用的包装程序确定参数不能在没有整数截断的情况下传递给内核(因为内核较旧且不支持32位用户ID),它将返回-1。并在不尝试系统调用的情况下将errno设置为EINVAL。
BUGS
没有任何类型的错误指示返回给调用方,并且成功和不成功的调用都返回相同值的事实使得无法直接确定调用是成功还是失败。相反,调用者必须求助于进一步调用(例如setfsuid(-1))的返回值(该调用将始终失败),以确定先前对setfsuid()的调用是否更改了文件系统用户ID。至少,呼叫失败时应返回EPERM(因为呼叫者缺乏CAP_SETUID能力)。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。