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)
사용 중인 라이브러리 및 추가 실행 파일 등을 포함하여 액세스하려는 파일이 표시됩니다 .- 그런 다음 명령 및 라이브러리의 소스 파일을 찾을 수 있습니다( Ubuntu와 같은
dpkg -S /path/to/file
Debian 파생물을 통해).apt-get source packagename
grep(1)
그러면 해당 명령으로 발행된 메시지의 소스를 찾을 수 있습니다 .