当普通用户想要更改 passwd 文件时,用户将通过 setuid 获得有效的用户访问权限。用户暂时成为 root 并且可以编辑密码。
但是你只能修改你的密码,而不能修改其他人的密码?但是,您的有效用户访问权限是 root。那么为什么您不被允许更改除您的密码之外的其他密码呢?
当你用setuid运行一个程序时,有效用户是root,但真实用户id仍然是你的名字,这实际上意味着什么?
答案1
您无法更改其他密码,因为该程序不允许您这样做。该程序具有系统权限来更改它想要的任何密码,因为它运行为root
,但该程序经过专门设计,不会向用户提供任何方式来使其使用这些权限。
并不完全是用户暂时成为root,而是受信任的程序以root权限运行。显然,只有专门设计用于限制用户只做他们应该被允许做的事情的程序才能安全地设置为 setuid。
答案2
尽管您拥有 root 的有效用户 ID,但只允许更改您的密码,因为在更改密码时,将检查真实用户 ID,而不是有效用户 ID。您只能更改有效用户 ID,而不能更改真实用户 ID。
只有 root 用户可以更改真实用户 ID 以非特权用户身份运行程序。真实用户 ID 无法更改,因为它是在会话启动时设置的。
这就是为什么只有您的密码可以更改,因为真实的用户 ID 没有更改(因为它仍然是您的而不是 root 的)。
答案3
Unix 中的早期 hack 是建立一个到 setuid shell 脚本的符号链接并调用该链接-i
。这会导致脚本被调用,sh -i
而不是执行按预期调用的脚本,而是-i
启动一个交互式 shell,然后该 shell 会提供全部权限。有效用户 ID 可用于修改passwd
任何用户或 root 本身的文件。防止这种情况的最佳方法是使用 SELinux 来防止信任脚本或程序在 SELinux 允许其运行的区域之外进行修改。
另一种技术是在重要文件上设置不可变位,即使是 root 用户也无法修改其中一组(单用户模式除外)
作为 root,您可以邀请用户无需密码即可登录您的系统,并以任何用户的身份出现,但普通特权进程会尽力阻止这种情况发生。
如果您使用某种网络文件系统,root 用户将被视为该文件空间中的任何人,而不是 root,这允许不受信任的计算机加入受信任的网络,例如大学校园。
答案4
您只能更改密码,因为设置密码程序虽然有能力做任何事情,但被编程为只能更改密码。它将检查真实的用户 ID,以决定更改哪个密码。
因为你无法改变你的真实用户id,即使通过调用set-uid程序,程序也可以利用它来实现安全。操作系统放弃了 set uid root 程序的安全性。
注意:set uid root 程序还可以更改真实用户 ID(但这在此用例中没有用)。
警告:设置 uid root 被认为是有害的(远远低于理想状态)。这些天我们应该使用功能(参见在 gnu/linux 上设置文件权限等有哪些不同方法和http://man7.org/linux/man-pages/man7/capability.7.html)