이 질문은 항상 저를 괴롭 혔습니다.
Linux에서 암호를 묻는 메시지가 표시되면 입력 한 내용이 맞으면 거의 지체없이 즉시 확인합니다. 그러나 반대로 잘못된 암호를 입력하면 확인하는 데 시간이 더 걸립니다. 왜 그런 겁니까?
나는 내가 시도한 모든 Linux 배포판 에서 이것을 관찰 했습니다.
이 질문은 항상 저를 괴롭 혔습니다.
Linux에서 암호를 묻는 메시지가 표시되면 입력 한 내용이 맞으면 거의 지체없이 즉시 확인합니다. 그러나 반대로 잘못된 암호를 입력하면 확인하는 데 시간이 더 걸립니다. 왜 그런 겁니까?
나는 내가 시도한 모든 Linux 배포판 에서 이것을 관찰 했습니다.
답변:
실제로는 무차별 대입 공격이 초당 수백만 개의 암호를 시도하는 것을 방지하기위한 것입니다. 아이디어는 암호 확인 속도를 제한하는 것이며 따라야 할 규칙이 많이 있습니다.
마지막 것이 특히 중요합니다. 다음과 같은 유용한 메시지가 없음을 의미합니다.
Your user name is correct but your password is wrong, please try again
또는:
Sorry, password wasn't long enough
"유효하지 않은 사용자 및 암호"와 "유효한 사용자이지만 유효하지 않은 암호"실패 이유 사이의 응답 시간 차이도 없습니다.
모든 실패는 텍스트 및 기타 정확히 동일한 정보를 제공해야합니다.
일부 시스템은 더 나아가서 각 실패에 대한 지연을 증가 시키거나 3 개의 실패 만 허용 한 다음 재 시도를 허용하기 전에 엄청난 지연을 겪습니다.
이로 인해 암호를 추측하는 데 시간이 더 걸립니다.
확실하지 않지만 잘못된 암호를 입력 한 후 지연을 통합하여 공격을 더 어렵게 만드는 것이 일반적입니다. 이렇게하면 몇 개의 암호 만 확인하는 데 오랜 시간이 걸리기 때문에 공격을 실질적으로 불가능하게 만듭니다.
생년월일, 고양이 이름 등 몇 가지 암호를 입력하는 것조차 재미가 없습니다.
123456
수 잘 손상 계좌 (예를 들어) 30 %를 구성하지만, 어디 근처에서 의미가 될 가능성이 있는 모든 계정.
기본적으로 무차별 대입 및 사전 공격을 완화합니다.
지연 계획
extern int pam_fail_delay(pam_handle_t *pamh, unsigned int micro_sec);
이 함수는 pam_authenticate () 호출이 실패한 후 응용 프로그램에 제어가 반환되기 전에 시간 지연을 용이하게하기 위해 Linux-PAM에서 제공합니다. 이 기능을 사용할 때 응용 프로그램 프로그래머는 다음과 같이 사용할 수 있는지 확인해야합니다.
#ifdef PAM_FAIL_DELAY .... #endif /* PAM_FAIL_DELAY */
일반적으로 애플리케이션은 사용자가 pam_authenticate () 또는 pam_chauthtok () 호출을 통해 Linux-PAM에 의해 인증되도록 요청합니다. 이러한 함수는 관련 Linux-PAM 구성 파일에 나열된 각 스택 인증 모듈을 호출합니다. 이 파일의 지시에 따라 하나 이상의 모듈이 실패하여 pam _... () 호출이 오류를 반환 할 수 있습니다. 응용 프로그램이 계속되기 전에 일시 중지하는 것이 바람직합니다. 이러한 지연의 주된 이유는 보안입니다. 지연은 주로 무차별 대입 사전 공격을 막는 역할을하지만 시간 제한 (비밀 채널) 공격을 방해하는데도 도움이됩니다.
보안을 크게 향상시킬 수있는 매우 간단하고 사실상 쉬운 방법입니다. 중히 여기다:
시스템 A
에는 지연이 없습니다. 공격자는 사용자 이름 / 암호 조합을 만드는 프로그램을 가지고 있습니다. 분당 수천 번의 시도 속도로 모든 조합을 시도하고 성공한 모든 로그인을 기록하는 데 몇 시간 밖에 걸리지 않습니다.
시스템 B
은 각각의 잘못된 추측 후 5 초 지연을 생성합니다. 공격자의 효율성은 분당 12 번의 시도로 감소하여 무차별 대입 공격을 효과적으로 방해합니다. 몇 시간이 아니라 유효한 로그인을 찾는 데 몇 달이 걸릴 수 있습니다. 해커가 그 환자라면 합법적 일 것입니다. :-)
실패한 인증 지연은 로그인 시도 비율을 줄이기 위해 존재합니다. 누군가가 사전 또는 사용자 계정에 대해 무차별 대입 공격을 시도하는 경우 해당 공격자는 실패 지연을 기다려야하므로 더 많은 시간을 들여 탐지 할 수있는 기회를 더 많이 제공해야합니다.
로그인 셸로 사용하는 항목에 따라 일반적으로이 지연을 구성하는 방법이 있다는 사실을 알고 싶을 수도 있습니다.
GDM에서 지연은 gdm.conf 파일 (일반적으로 /etc/gdm/gdm.conf에 있음)에 설정됩니다. RetryDelay = x를 설정해야합니다. 여기서 x는 초 단위의 값입니다.
오늘날 대부분의 리눅스 배포판은 /etc/login.defs에 정의 된 FAIL_DELAY를 지원하므로 로그인 시도 실패 후 대기 시간을 설정할 수 있습니다.
마지막으로, PAM을 사용하면 인증 라인에 nodelay 속성을 설정하여 실패 지연을 우회 할 수 있습니다. ( 여기 PAM 및 Linux에 대한 기사입니다 )
답변이 제안하는 것만 큼 간단 할 수 있다고 생각하지 않습니다.
올바른 암호에 대한 응답이 즉각적인 경우 (일부 값) 암호가 잘못되었음을 알기 위해 해당 값보다 오래 기다릴 필요가 없습니까? (적어도 확률 적으로 알고 있습니다. 크래킹 목적으로는 괜찮습니다.) 어쨌든이 공격을 병렬로 실행할 것입니다.이 모든 것이 하나의 큰 DoS 환영 매트입니까?
이전에 시도한 것은 작동하는 것처럼 보였지만 실제로는 작동하지 않았습니다. 관심이 있다면 위키 편집 기록을 검토해야합니다 ...
무엇을 수행 하기 위해 인 (내게) 작업을 모두 pam_faildelay.so 지연 = X에서의 낮은 값 의 /etc/pam.d/login (I는 500,000로 낮아, 0.5 초)을, 또한 nodelay 추가 (a 선행 space)를 Gabriel이 답변에 설명 한 것처럼 common-auth 의 줄 끝에 .
auth [success=1 default=ignore] pam_unix.so nullok_secure nodelay
적어도 나에게는 (debian sid), 이러한 변경 중 하나만 수행해도 지연이 기본 3 초 미만으로 단축되지는 않지만 /etc/pam.d/login의 값만 변경하여 지연을 늘릴 수는 있습니다.
이런 종류의 쓰레기는 어른을 울게하기에 충분합니다!
Ubuntu 9.10에서는 새 버전도 찾고있는 파일이
/etc/pam.d/login
라인 편집 :
인증 선택적 pam_faildelay.so 지연 = 3000000
당신이 원하는 다른 숫자 3을 변경합니다.
'nodelay'인증을 받으려면 파일을 편집해야한다고 생각합니다.
/etc/pam.d/common-auth
너무. 라인에서 :
auth [success = 1 default = ignore] pam_unix.so nullok_secure
마지막에 'nodelay'를 추가합니다 (따옴표없이). 그러나 'nodelay'에 대한이 마지막 설명은 제가 생각하는 것입니다.
개발자 관점에서 메모를 추가하고 싶습니다. 육안으로는 분명하지 않지만 현명한 개발자는 일치 항목이 발견되면 일치 쿼리에서 벗어날 수 있습니다. 증인에서 성공적인 경기는 실패한 경기보다 빨리 완료됩니다. 일치 기능은 올바른 일치를 찾을 때까지 모든 알려진 계정과 자격 증명을 비교하기 때문입니다. 즉, ID 순으로 사용자 계정이 1,000,000 개 있다고 가정 해 보겠습니다. 001, 002, 003 등. 귀하의 ID는 43,001입니다. 따라서 올바른 사용자 이름과 암호를 입력하면 검색이 43,001에서 중지되고 로그인됩니다. 자격 증명이 올바르지 않으면 1,000,000 개의 레코드를 모두 검색합니다. 듀얼 코어 서버의 처리 시간 차이는 밀리 초 단위 일 수 있습니다. 5 개의 사용자 계정이있는 Windows Vista에서는 나노초 단위입니다.
기술적으로이 의도적 인 지연 은 "선형화 공격" 과 같은 공격을 방지하기위한 것입니다 (다른 공격과 이유도 있음) .
공격을 설명하기 위해 입력 된 시리얼이 올바른 시리얼과 일치하는지 확인하는 프로그램 (이 경우에는 " xyba ")을 고려하십시오 . 효율성을 위해 프로그래머는 한 번에 하나의 문자를 확인하고 잘못된 문자가 발견되는 즉시 종료하기로 결정했으며 시작하기 전에 길이도 확인했습니다.
올바른 직렬 길이는 잘못된 직렬 길이보다 처리하는 데 더 오래 걸립니다. 공격자의 경우 더 좋은 점은 첫 번째 문자가 올바른 일련 번호가 잘못된 첫 번째 문자가있는 일련 번호보다 오래 걸린다는 것입니다. 대기 시간의 연속 단계는 루프가 하나 더있을 때마다 올바른 입력을 통해 비교하기 때문입니다.
- 따라서 공격자는 4 자 문자열을 선택할 수 있으며 x로 시작하는 문자열 에 가장 많은 시간이 걸립니다. (추측 작업으로)
- 공격자는 문자를 x 로 고정 하고 두 번째 문자를 변경할 수 있습니다.이 경우 y 가 가장 오래 걸린다는 것을 알게됩니다 .
- 공격자는 처음 두 문자를 xy 로 수정하고 세 번째 문자를 변경하면 b 가 가장 오래 걸린다는 것을 알게됩니다 .
- 공격자는 처음 세 문자를 xyb 로 수정하고 네 번째 문자를 변경하면 a 가 가장 오래 걸린다는 것을 알게됩니다 .
따라서 공격자는 한 번에 일련의 문자 하나를 복구 할 수 있습니다.
일련 번호는 4 자이며 각 문자에는 128 개의 가능한 값이 있습니다. 그런 다음 128 4 = 2 28 = 268,435,456 개의 가능한 일련 번호가 있습니다. 공격자가 전체 일련 번호를 무작위로 추측해야한다면 약 2 27 = 134,217,728 번의 시도로 일련 번호를 추측 할 것 입니다. 이는 엄청난 양의 작업 입니다. 반면에 위의 선형화 공격을 사용하면 각 문자에 대해 평균 128/2 = 64 개의 추측 만 필요하며 총 예상 작업은 약 4 * 64 = 2 8 = 256 개의 추측이며 이는 사소한 양입니다. 일의.
서면 군의 대부분은에서 적응 이 (마크 스탬프의 "원칙과 실천 정보 보안"에서 촬영). 또한 위의 계산은 올바른 일련 길이를 파악하는 데 필요한 추측의 양을 고려하지 않습니다.