如果您查看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
,让我可以更改密码。这是为什么?
答案1
在此特定实现中,该passwd
命令需要以root
用户身份运行才能更改任何人的密码。
该passwd
应用程序有一段代码可以检查您是否是该root
用户,如果不是,则它拒绝让您更改其他任何人的密码。如果您是root
,那么您可以更改任何人的密码。
例如,如果您以 登录alice
,然后运行passwd bob
,尽管代码将运行,因为root
它将拒绝让您更改bob
的密码。但是,如果alice
运行sudo passwd bob
则因为该sudo
命令将其参数运行为root
alice
该passwd
应用程序将允许您更改任何人的密码,而不是 as 。
来自 的行src/passwd.c
,通过以下方式获得(在 Debian 上)apt source passwd
:
static bool amroot; /* The caller's real UID was 0 */
…
/*
* The program behaves differently when executed by root than when
* executed by a normal user.
*/
amroot = (getuid () == 0);
…
/*
* If the UID of the user does not match the current real UID,
* check if I'm root.
*/
if (!amroot && (pw->pw_uid != getuid ())) {
(void) fprintf (stderr, _("%s: You may not view or modify password information for %s.\n"), Prog, name);
SYSLOG ((LOG_WARN, "%s: can't view or modify password information for %s", Prog, name));
closelog ();
exit (E_NOPERM);
}
答案2
能够更改其他用户的密码是大量的安全漏洞,因此为什么passwd
不允许它,除非你已经是 root 了。