passwdエラーメッセージのソース

passwdエラーメッセージのソース

passwdsetuidビットがディセーブルの場合、コマンドを実行できるかどうかをテストしています。以下を実行して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 passwdpasswd(1)使用しているライブラリや追加の実行可能ファイルなど、アクセスしたいファイルが表示されます。
  • その後、コマンドとライブラリのソースファイルを見つけることができます(Ubuntuなどのdpkg -S /path/to/fileDebian派生を介して)。apt-get source packagename
  • grep(1)これにより、そのコマンドで発行されたメッセージのソースを見つけることができます。

関連情報