首先,基础知识:每个进程都有一个 userid 和一个 groupid(我将忽略附加属性,如额外的 groupid)。
用户 ID 0 是根用户。就这样,故事结束。
当您有一个用户 ID 为 0 的进程时,它是一个根进程。故事结束。
进程如何获取其用户 ID 0 无关紧要。如果一个进程的用户标识为0,那么它就是一个根进程,就是这样。
当您完成设置 setuid 进程的动作时,setuid(0)
s 本身就完成了。你是一个根进程。就是这样。没什么好说的了。
setsuid() 和 getuid() 文档,似乎没有 关于密码验证的任何事情。
正确。他们所做的只是调整/更新用户 ID。就是这样。没有别的了。
su
和 sudo
进程执行以下操作:
- 它们是 setuid 可执行文件。
$ ls -al /bin/su /bin/sudo
-rwsr-xr-x. 1 root root 57504 Aug 17 04:59 /bin/su
---s--x--x. 1 root root 185440 Aug 7 13:17 /bin/sudo
你觉得这很眼熟吗?你的手工 setuid 程序的权限看起来和这个是一样的,不是吗?
- 但在他们进一步行动之前,他们会要求您提供可接受的密码(或以某种形式或方式满足某些其他标准,可接受的身份验证标准的确切细节是什么并不重要,
su
中的密码的情况,或sudo
的配置中可接受的匹配)。如果您不这样做,它们将终止,不会采取进一步的行动。
所有密码验证逻辑,包括 PAM 或其他一些身份验证框架,都是由 su
和 sudo
进程自己实现的。除非您提供可接受的身份验证凭据(无论对 su
或 sudo
意味着什么),否则它们将终止且不采取进一步行动。成功的身份验证会生成一个 shell 或一个执行的命令,但这是非常简单的原因,su
和 sudo
程序本身使用 setuid(权限位和系统调用)来获取 root 权限,如第一要务。
【讨论】: