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 存储库中搜索发现第二条错误消息 https://github.com/shadow-maint/shadow/blob/master/libmisc/pam_pass.c

这是打印两条错误消息的函数:

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)正在尝试访问哪些文件,包括正在使用哪些库和额外的可执行文件等。
  • 然后你可以找到该命令和库的源文件(通过dpkg -S /path/to/fileDebianapt-get source packagename衍生品,如 Ubuntu)
  • 然后您就可以找到grep(1)该命令发出的那些消息的来源。

相关内容