Tom*_*as 10 password source ubuntu setuid passwd
我正在测试如果passwdsetuid 位被禁用该命令是否可以运行。我通过运行以下命令禁用了 setuid:
chmod 0554 /bin/passwd
Run Code Online (Sandbox Code Playgroud)
这样做之后,我测试了该passwd命令是否仍然能够运行。但正如预料的那样,事实并非如此。相反,它给了我以下错误:
passwd: Authentication token manipulation error
Run Code Online (Sandbox Code Playgroud)
passwd: password unchanged
Run Code Online (Sandbox Code Playgroud)
我尝试在源代码中查找这些错误消息,但在该文件中找不到它们。谁能指导我找到包含上面显示的错误消息的源文件?
Bod*_*odo 17
第一条错误消息来自 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");
}
Run Code Online (Sandbox Code Playgroud)
在链接的 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);
}
Run Code Online (Sandbox Code Playgroud)
首先,我希望您这样做是为了获得教育经验,而不是因为您认为这会提高安全性或其他什么(这会使情况变得更糟!)
话虽这么说,但对于未来处理这种情况和类似情况的建议很少:
strace -ff -efile passwd将向您显示passwd(1)正在尝试访问哪些文件,包括正在使用哪些库和额外的可执行文件等。dpkg -S /path/to/fileDebianapt-get source packagename衍生品,如 Ubuntu)grep(1)该命令发出的那些消息的来源。| 归档时间: |
|
| 查看次数: |
1443 次 |
| 最近记录: |