我们的 sudo 可执行文件将由 root 拥有 setuid 位。可执行文件会做两件事:
- 检查用户是否被允许
execve argv[1]
(伪代码)
通常这将允许普通用户以 root 身份运行程序。问题是如何检查用户是否被允许,因为由于setuid,我们在启动时是root,因此不知道用户是谁?
答案1
问题是如何检查用户是否被允许,因为由于setuid,我们在启动时是root,因此不知道用户是谁?
这就是 uid 和 effective uid 概念的用武之地。当您运行 setuid 程序时,getuid
仍然返回“真实”用户的 uid; setuid 位会导致有效 uid 发生变化。看man getuid
以及相关文档的详细信息。
答案2
您所建议的正是 sudo 的工作原理...至少,这是开始。
要使事情真正发挥作用,还需要做很多事情,并且 sudo 做了一些相当复杂的事情以确保它的安全并记录事件。编写一个幼稚的版本很容易,即使在不应该运行的情况下,以及当用户无权使用它时,也很容易被欺骗运行。