我正在测试如果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 存储库中搜索发现第二条错误消息 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/file
Debianapt-get source packagename
衍生品,如 Ubuntu) - 然后您就可以找到
grep(1)
该命令发出的那些消息的来源。