gra*_*ssy 6 filesystems permissions sudo passwd
如果您查看命令的权限集passwd
,您将看到以下内容:
user@apple:~$ ls -l /bin/passwd
-rwsr-xr-x 1 root root 59976 Nov 24 2022 /bin/passwd
Run Code Online (Sandbox Code Playgroud)
/bin/passwd
已设置 SUID 位且其所有者是root
用户。这意味着运行该命令passwd
将以用户的权限运行该命令root
。
鉴于passwd
已经拥有root
用户权限,为什么当我尝试更改另一个用户的密码时会这样说test
:
user@apple:~$ passwd test
passwd: You may not view or modify password information for test.
Run Code Online (Sandbox Code Playgroud)
运行相同的命令,但使用sudo
,让我可以更改密码。这是为什么?
roa*_*ima 16
在此特定实现中,该passwd
命令需要以用户身份运行root
才能更改任何人的密码。
该passwd
应用程序有一段代码可以检查您是否是该root
用户,如果不是,则它拒绝让您更改其他任何人的密码。如果您是root
,那么您可以更改任何人的密码。
例如,如果您以 登录alice
,然后运行passwd bob
,尽管代码将运行,因为root
它将拒绝让您更改bob
密码。但是,如果alice
运行sudo passwd bob
then因为该sudo
命令运行其参数而root
不是 as alice
,passwd
应用程序将允许您更改任何人的密码。
来自 的行src/passwd.c
,通过以下方式获得(在 Debian 上)apt source passwd
:
static bool amroot; /* The caller\'s real UID was 0 */\n\xe2\x80\xa6\n\n/*\n * The program behaves differently when executed by root than when\n * executed by a normal user.\n */\namroot = (getuid () == 0);\n\xe2\x80\xa6\n\n/*\n * If the UID of the user does not match the current real UID,\n * check if I\'m root.\n */\nif (!amroot && (pw->pw_uid != getuid ())) {\n (void) fprintf (stderr, _("%s: You may not view or modify password information for %s.\\n"), Prog, name);\n SYSLOG ((LOG_WARN, "%s: can\'t view or modify password information for %s", Prog, name));\n closelog ();\n exit (E_NOPERM);\n}\n
Run Code Online (Sandbox Code Playgroud)\n
能够更改其他用户的密码是一个巨大的安全漏洞,因此passwd
除非您已经是root用户,否则为什么不允许这样做。