如果您查看passwd
命令的权限集,您将看到以下内容:
user@apple:~$ ls -l /bin/passwd
-rwsr-xr-x 1 root root 59976 Nov 24 2022 /bin/passwd
/bin/passwd
已设置 SUID 位且其所有者是root
用户。也就是说,运行该命令passwd
意味着以用户的权限运行该命令root
。
既然passwd
已经拥有root
用户权限,为什么当我尝试更改另一个用户的密码时会这样说test
:
user@apple:~$ passwd test
passwd: You may not view or modify password information for test.
运行相同的命令,但sudo
可以让我更改密码。这是为什么?
在此特定实现中,该
passwd
命令需要以root
用户身份运行才能更改任何人的密码。该
passwd
应用程序有一段代码可以检查您是否是该root
用户,如果不是,则它拒绝让您更改其他任何人的密码。如果您是root
,那么您可以更改任何人的密码。例如,如果您以 登录
alice
,然后运行passwd bob
,尽管代码将运行,因为root
它将拒绝让您更改 的bob
密码。但是,如果alice
运行sudo passwd bob
then ,因为该sudo
命令运行其参数而root
不是 asalice
,passwd
应用程序将允许您更改任何人的密码。来自 的行
src/passwd.c
,通过以下方式获得(在 Debian 上)apt source passwd
:能够更改其他用户的密码是一个巨大的安全漏洞,因此
passwd
除非您已经是root用户,否则为什么不允许这样做。