コマンドの権限セットを表示すると、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
アプリを使用すると、他人のパスワードを変更できます。
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
既にルートでない限り許可しないことをお勧めします。