SUID 程序中使用 setuid() 的目的

SUID 程序中使用 setuid() 的目的

我想知道像这样的 SUID 程序passwd正在使用setuid()函数调用。为什么它会放弃root权限?

这有助于抵御什么类型的攻击?缓冲区溢出?

答案1

首先,我将讨论 passwd 使用的 setuid 位,它与setuid()系统调用(passwd 不使用)不同。在这方面,这个问题可能存在一些混乱。

它不是针对缓冲区溢出的保护,而是易受伤害的此类攻击,或者基本上任何允许攻击者使用特权进程达到某些邪恶的非预期目的的行为。这是因为 setuid 位与“放弃特权”相反;它赋予root 权限,但仅限于过程而不是实际用户。包括passwd

这种形式的 setuid 需要在可执行文件上设置文件系统 setuid 位;passwd之所以有这个,是因为它需要读写权限/etc/passwd。然而,我们希望 passwd 不存在任何已知的安全漏洞(例如,潜在的溢出漏洞),这些漏洞会允许不法之徒让它执行除读取和写入 /etc/passwd 之外的其他操作(以及正确执行此操作之外的操作!),因为它确实以 root 身份运行,因此可以做任何事情——除了它被设计为只做一件特定的事情,并让它做其他事情应该(再次,希望)是不可能的。

所以在这个意义上使用 setuid 并不能防止任何事情,但它经常与漏洞相关讨论,因为潜在的漏洞是非常重要的 WRT setuid 可执行文件。

但是:setuid 位设置尤伊德而不是实际的 uid,因此它实际上与seteuid()系统调用并行不是 setuid()

“setuid”有一种相反的形式,它是关于删除特权的,它涉及实际的setuid()系统调用,并且不需要 setuid 位。这是指以 root 身份运行的进程(因为 root 或 sudo 启动了它)将其 uid 更改为特权较低的用户。如果服务器和守护进程在启动时需要 root 权限(例如,打开特权端口)但随后不需要,则通常会这样做。这样,如果服务器随后被劫持,它就没有超级用户权限。您无法调用setuid(0)并重新获取 root 权限(但您可以使用 set*e*uid)。

答案2

这只是一种预防措施。如果编码错误,任何应用程序都可能容易受到任何可能的攻击。减少可能造成的损害的技巧是使用所需的最少权限执行操作。在不需要时放弃以 root 身份运行是一个很好的开始。

相关内容