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

관련 정보