fla*_*nka 7 security setuid privileges
我想知道像 SUID 程序一样passwd使用setuid()函数调用。为什么它会降低 root 权限?
这对什么类型的攻击有帮助?缓冲区溢出?
gol*_*cks 11
首先,我将讨论 setuid 位,它使用 passwd 并且与setuid()系统调用(passwd 不使用)不同。在这方面的问题中可能存在一些混淆。
它不是针对缓冲区溢出保护,这是vunerable这样的,或基本上什么这将允许攻击者使用特权进程对于一些恶意其他用途。这是因为 setuid 位与“删除权限”相反;它授予root 权限,但只授予进程而不是实际用户。这包括passwd.
这种形式的 setuid 需要在可执行文件上设置文件系统 setuid 位;passwd有这个是因为它需要读写权限/etc/passwd。但是,我们希望 passwd 没有任何已知的安全漏洞(例如,潜在的溢出漏洞),这会允许不法之徒对其进行除读取和写入 /etc/passwd 之外的其他操作(以及正确执行此操作之外的操作!),因为它确实以 root 身份运行,因此可以做任何事情——除了它被设计为只做一件特定的事情,让它做任何其他事情应该(再次,希望)是不可能的。
所以在这个意义上使用 setuid 并不能保护任何东西,但它经常被讨论与漏洞有关,因为潜在的漏洞是非常重要的 WRT setuid 可执行文件。
但是:setuid 位设置euid而不是实际的 uid,因此它实际上与seteuid()系统调用并行而不是 setuid().
有一种相反的“setuid”形式是关于删除权限,它涉及实际的setuid()系统调用,不需要 setuid 位。这是当以 root 身份运行的进程(因为 root 或 sudo 启动它)将其 uid 更改为特权较低的用户时。如果服务器和守护进程在启动时需要 root 权限(例如,打开一个特权端口)但随后不需要,它们通常会这样做。这样,如果服务器随后被劫持,它就没有超级用户权限。您无法调用setuid(0)并获取 root 权限(但您可以使用 set* e *uid)。