
CVE-2026-42533을 재현하는 Docker 랩으로, two-pass capture clobbering을 통한 pre-auth nginx 힙 오버플로 및 정보 유출 취약점이며, PoC 스크립트와 패치된 버전 비교를 포함합니다.
CVSS 9.2 (Critical) — nginx의 인증 전 힙 버퍼 오버플로 + 정보 유출 영향받는 버전: nginx 0.9.6 – 1.30.3 / 1.31.2 | 패치됨: 1.30.4 / 1.31.3
┌─────────────────────────────────────┐
│ 호스트 머신 │
│ │
PoC 스크립트 ──────┤ :8080 ──► nginx-vuln (1.26.x) │
│ │ 취약함 │
│ ▼ │
│ backend (Python echo) │
│ ▲ │
│ │ │
│ :8081 ──► nginx-patched (1.30.4) │
│ 안전함 │
└─────────────────────────────────────┘
# Build and start
docker compose up --build -d
# Verify
curl http://localhost:8080/health
curl http://localhost:8081/health
# Run PoC
python3 poc_overflow.py # Heap overflow (crash worker)
python3 poc_infoleak.py # Info leak (heap residue)
bash poc_curl.sh # Quick curl-based tests
# Compare with patched
python3 poc_overflow.py localhost 8081
python3 poc_infoleak.py localhost 8081
# Check for crashes
docker logs nginx-vuln 2>&1 | grep -iE 'signal|segfault|abort'
# Cleanup
docker compose down
nginx는 지시문 값(proxy_set_header, return, add_header 등)을
공유 가변 배열 r->captures를 사용하여 두 번의 패스로 평가합니다:
| 패스 | 목적 | r->captures 읽기 |
|---|---|---|
| LEN | 필요한 버퍼 크기 측정 | 예 — $1 길이를 얻기 위해 |
(regex map이 여기서 평가되어 r->captures를 덮어씀) | ||
| VALUE | 할당된 버퍼에 데이터 쓰기 | 예 — 하지만 이제 $1은 다른 곳을 가리킴 |
map $http_user_agent $is_bot {
~*(bot|crawl|spider) 1; # ← regex map = clobber trigger
default 0;
}
location ~ "^/api/v1/(.+)$" { # ← regex capture source
proxy_set_header X-Route "$1 — $is_bot"; # ← two-pass sink
# ^^ ^^^^^^^
# capture ref + map var in same buffer = BUG
}
| 방향 | URI 크기 | Map 입력 크기 | 결과 |
|---|---|---|---|
| 오버플로 | 짧음 (3 B) | 김 (4096 B) | LEN은 작게 할당, VALUE는 크게 씀 → 힙 오버플로 |
| 정보 유출 | 김 (8000 B) | 짧음 (5 B) | LEN은 크게 할당, VALUE는 작게 씀 → 응답에 힙 잔여물 |
| 엔드포인트 | 싱크 | Map 트리거 | 데모 |
|---|---|---|---|
/api/v1/{path} | proxy_set_header | $is_bot (User-Agent) | 오버플로 |
/leak/{path} | return + add_header | $ref_domain (Referer) | 정보 유출 |
/rce/{path} | set + return | $is_bot (User-Agent) | 오버플로 |
/safe/{path} | return (map 없음) | 없음 | 대조군 (안전) |
| 파일 | 목적 |
|---|---|
docker-compose.yml | 랩 오케스트레이션 |
Dockerfile.nginx-vuln | 취약한 nginx 1.26.x |
Dockerfile.nginx-patched | 패치된 nginx 1.30.4 |
nginx-vuln.conf | 주석이 달린 패턴이 포함된 취약한 설정 |
backend.py | 프록시된 헤더를 검사하는 에코 서버 |
poc_overflow.py | 힙 오버플로 PoC (점진적으로 증가하는 페이로드 크기) |
poc_infoleak.py | 정보 유출 PoC (힙 잔여물 탐지) |
poc_curl.sh | 빠른 curl 기반 테스트 |
config scanner를 사용하세요:
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf
map에서 ~ / ~* regex 패턴을 피하세요교육 및 승인된 보안 테스트 목적으로만 사용하세요.