passwd
setuidビットがディセーブルの場合、コマンドを実行できるかどうかをテストしています。以下を実行してsetuidを無効にしました。
chmod 0554 /bin/passwd
passwd
これを実行した後、コマンドがまだ実行できることをテストしました。しかし、予想通りそうではありません。代わりに、次のエラーが発生します。
passwd: Authentication token manipulation error
passwd: password unchanged
ソースコードでこれらのエラーメッセージを見つけましたが、見つかりませんでした。これ文書。上記のエラーメッセージを含むソースファイルを案内できる人はいますか?
答え1
最初のエラーメッセージはPAMライブラリから来ます。https://github.com/linux-pam/linux-pam/blob/master/libpam/pam_strerror.c
const char *pam_strerror(pam_handle_t *pamh UNUSED, int errnum)
{
switch (errnum) {
/* ... */
case PAM_AUTHTOK_ERR:
return _("Authentication token manipulation error");
/* ... */
}
return _("Unknown PAM error");
}
リンクされたGitリポジトリを検索すると、2番目のエラーメッセージが表示されます。 https://github.com/shadow-maint/shadow/blob/master/libmisc/pam_pass.c
以下は、2つのエラーメッセージを印刷する関数です。
void do_pam_passwd (const char *user, bool silent, bool change_expired)
{
pam_handle_t *pamh = NULL;
int flags = 0, ret;
FILE *shadow_logfd = log_get_logfd();
if (silent)
flags |= PAM_SILENT;
if (change_expired)
flags |= PAM_CHANGE_EXPIRED_AUTHTOK;
ret = pam_start ("passwd", user, &conv, &pamh);
if (ret != PAM_SUCCESS) {
fprintf (shadow_logfd,
_("passwd: pam_start() failed, error %d\n"), ret);
exit (10); /* XXX */
}
ret = pam_chauthtok (pamh, flags);
if (ret != PAM_SUCCESS) {
fprintf (shadow_logfd, _("passwd: %s\n"), pam_strerror (pamh, ret));
fputs (_("passwd: password unchanged\n"), shadow_logfd);
pam_end (pamh, ret);
exit (10); /* XXX */
}
fputs (_("passwd: password updated successfully\n"), shadow_logfd);
(void) pam_end (pamh, PAM_SUCCESS);
}
答え2
まず、安全を改善したり(状況を悪化させる可能性があるため)、考えるのではなく、教育経験のためにこれを実行してください。
つまり、今後も同様の状況を処理するための提案はほとんどありません。
strace -ff -efile passwd
passwd(1)
使用しているライブラリや追加の実行可能ファイルなど、アクセスしたいファイルが表示されます。- その後、コマンドとライブラリのソースファイルを見つけることができます(Ubuntuなどの
dpkg -S /path/to/file
Debian派生を介して)。apt-get source packagename
grep(1)
これにより、そのコマンドで発行されたメッセージのソースを見つけることができます。