类 unix 系统上的用户帐户由 UID(用户 ID)标识。
一个进程可以与多个 UID 相关联。两个主要的是标识谁拥有进程的“真实 UID”和标识进程当前在哪些用户权限下运行的“有效用户 UID”*。
在此上下文中的“setuid”指的是文件权限位(它也是相关系统调用的名称)。当它设置在可执行文件上并执行该文件时,“有效 UID”将更改为文件的所有者。这意味着程序以其所有者的权限而不是运行它的用户的权限运行。
当我们说一个可执行文件“是 setuid root”时,我们的意思是它设置了 setuid 位并且归用户 0(root)所有。所以它将以 0 的有效 UID 运行,并且基本上可以做它想做的任何事情。
“真实的 UID”保持不变,因此程序可以识别运行它的用户,并在需要时切换回该用户。
setuid 程序是/曾经是 unix 系统的重要组成部分,允许将功能公开给用户,其中整个功能被认为对用户来说是安全的,但用于实现这些功能的构建块却不是。
但是它们也有风险,setuid 程序中的一个小错误很容易暴露出超出预期暴露的内容。setuid 程序也禁用了各种与调试相关的功能,以防止它们被用来绕过限制。
最近,Linux 系统已经用一种称为“功能”的新机制取代了“setuid”的某些用途,该机制允许更细粒度地为程序分配特殊权限。
* 也有可能还有其他的,但它们在这里并没有立即相关,请参阅http://man7.org/linux/man-pages/man7/credentials.7.html了解更多详细信息。