
CVE-2012-2122 - MySQL Authentication Bypass
취약한 MySQL 및 MariaDB 서버에 영향을 미치는 심각한 인증 우회 취약점인 CVE-2012-2122의 개념 증명(PoC)입니다.
면책 조항
이 프로젝트는 교육 목적, 보안 연구 및 승인된 침투 테스트용으로만 제공됩니다. 귀하가 소유하지 않거나 명시적 테스트 권한이 없는 시스템에 이 소프트웨어를 사용하지 마십시오.
CVE-2012-2122는 MySQL의 비밀번호 검증 로직에서 발견된 인증 우회 취약점입니다.
정수 캐스팅/비교 버그로 인해 특정 조건에서 유효하지 않은 비밀번호 비교가 동등한 것으로 평가되어 인증이 잘못 성공할 수 있습니다.
공격자는 유효한 비밀번호를 알 필요 없이 비교 버그가 트리거될 때까지 임의의 비밀번호를 사용하여 인증을 반복적으로 시도할 수 있습니다.
성공 확률은 대략 다음과 같습니다:
이 비교적 높은 확률 때문에 자동화된 도구는 일반적으로 수백 번의 로그인 시도 내에 인증을 우회할 수 있습니다.
| 메트릭 | 값 |
|---|---|
| CVE | CVE-2012-2122 |
| CVSS v2 | 7.5 (높음) |
| 공격 벡터 | 네트워크 |
| 인증 | 필요 없음 |
| 사용자 상호 작용 | 필요 없음 |
| 영향 | 인증 우회 |
이 취약점은 취약한 컴파일러 최적화로 빌드된 MySQL 빌드에 영향을 미치며, 다음과 같은 버전을 포함합니다:
이 문제는 주로 컴파일러 동작으로 인해 버그가 드러난 Linux 배포판에 영향을 미쳤습니다.
이러한 버전의 모든 설치가 취약한 것은 아닙니다.
비밀번호 확인 중 MySQL은 내부적으로 memcmp() 함수를 사용하여 두 해시 값을 비교합니다.
정상적인 상황에서:
memcmp(hash1, hash2)
다음을 반환합니다:
0취약점은 반환 값이 부호 있는 정수에 저장되고 이후 특정 0이 아닌 값이 인증 성공으로 해석될 수 있는 방식으로 변환되면서 발생했습니다.
단순화된 로직:
if (memcmp(hash1, hash2) == 0)
{
// 로그인 성공
}
취약한 컴파일러 동작 하에서 memcmp()의 특정 반환 값이 비교를 잘못 충족시킬 수 있었습니다.
결과적으로 잘못된 비밀번호가 때때로 성공적으로 인증되었습니다.
공격자에게 필요한 것은:
비밀번호 지식은 필요하지 않습니다.
공격자는 임의의 비밀번호를 사용하여 로그인 시도를 계속 제출합니다.
결국 비교 버그로 인해 하나의 인증이 성공합니다.
일반적인 공격 흐름:
시도 #1
↓
인증 실패
시도 #57
↓
인증 실패
시도 #141
↓
인증 실패
시도 #237
↓
인증 성공
평균 성공은 대략 256회 시도당 한 번 발생합니다.
성공적인 익스플로잇을 통해 공격자는 다음을 수행할 수 있습니다:
관리자 자격 증명이 대상이 될 경우 데이터베이스 서버에 대한 완전한 제어 권한을 얻을 수 있습니다.
징후는 다음과 같습니다:
MySQL 인증 로그에서 과도한 실패 로그인 활동을 검토하십시오.
권장 완화 방법은 패치된 릴리스로 업그레이드하는 것입니다.
추가 방어 조치는 다음과 같습니다:
---
## 사용 예시
```bash
python3 exploit.py -ip <대상>
예시:
python3 exploit.py -ip 192.168.1.100
이 저장소는 인증 로직의 미묘한 구현 버그가 어떻게 비밀번호 검증을 완전히 무너뜨릴 수 있는지 보여줍니다.
취약점이 10년 이상 지났지만, 여전히 다음 분야에서 중요한 사례 연구로 남아 있습니다: