
NGINX HTTP/3(ngx_http_v3_module)용 비파괴적 취약점 스캐너입니다. 오직 안전한 프로브만 수행합니다: HTTP/3(QUIC) 연결을 열고 단일 HEAD 요청을 전송한 후 `Server` 응답 헤더를 검사합니다. QPACK 인코더 스트림을 다시 열거나 use-after-free를 트리거하려고 절대 시도하지 않습니다.
NGINX HTTP/3(QUIC) use-after-free 취약점을 위한 비파괴적 대량 스캐너
버그를 절대 트리거하지 않고 어떤 호스트가 노출되었는지 파악하세요.
이 도구는 승인된 보안 테스트 전용입니다. 즉, 본인 소유의 인프라 또는 서면으로 명시적인 허가를 받은 시스템만 대상으로 해야 합니다. 이 도구는 읽기 전용 핑거프린팅을 수행하며 취약점을 악용하지 않습니다. 테스트 범위를 준수하고 관련 법률 및 책임 있는 공개(responsible disclosure) 원칙을 따를 책임은 사용자에게 있습니다. 작성자는 오용으로 인한 어떠한 책임도 지지 않습니다.
CVE-2026-42530은 NGINX ngx_http_v3_module에서 발생하는 use-after-free(CWE-416) 취약점입니다. NGINX가 HTTP/3을 제공하도록 구성된 경우, 원격의 인증되지 않은 공격자가 조작된 HTTP/3 세션 내에서 QPACK 인코더 스트림을 다시 열어 워커 프로세스가 해제된 메모리를 참조하도록 만들 수 있습니다. 즉각적인 영향은 워커 크래시/재시작(서비스 거부)이며, ASLR이 비활성화되었거나 우회할 수 있는 호스트에서는 원격 코드 실행으로 이어질 수 있습니다.
핵심: 이 결함은 HTTP/3(QUIC)이 활성화된 경우에만 도달할 수 있으며 기본적으로 활성화되어 있지 않습니다. TCP를 통해 HTTP/1.1 또는 HTTP/2만 제공하는 호스트는 이 특정 공격 벡터의 영향을 받지 않습니다.
| 브랜치 | 상태 |
|---|---|
| NGINX 오픈 소스 1.31.0 – 1.31.1 | ❌ 취약 |
| NGINX 오픈 소스 1.31.2+ | ✅ 수정됨 |
| NGINX Plus | 공급업체 권고 적용(R36 P6 / 37.0.2.1) |
실제 HTTP/3 연결을 열고 단일 HEAD / 요청을 전송한 후 Server 헤더를 읽어 옵니다. 이를 통해 각 대상을 분류하며, 핵심적으로 연결은 가능하지만 버전이 숨겨진 호스트는 잘못된 "클린" 상태 대신 수동 검토 필요로 처리합니다. QUIC에 연결 가능한 상태가 이 CVE의 전제 조건이기 때문입니다.
Python 3.11+ 필요(asyncio.timeout 사용).
git clone https://github.com/renzi25031469/CVE-2026-42530-scanner.git
cd CVE-2026-42530-scanner
pip install aioquic
팁: 가상 환경을 사용하세요 —
python3 -m venv .venv && source .venv/bin/activate.
# Single host
python3 cve-2026-42530-scanner.py example.com
# Many hosts from a file, 100 in parallel, save a CSV
python3 cve-2026-42530-scanner.py -f targets.txt -c 100 --csv results.csv
# Pipe targets from stdin and export JSON
cat hosts.txt | python3 cve-2026-42530-scanner.py -f - --json results.json
# Custom port and timeout
python3 cve-2026-42530-scanner.py target.internal -p 8443 -t 5
한 줄에 하나의 호스트. 포트, 스킴, 경로 및 주석은 자동으로 처리됩니다:
# production edge
edge01.example.com
edge02.example.com:8443
https://api.example.com/
# staging
10.0.5.21
[*] CVE-2026-42530 safe-check — 4 target(s), concurrency=100, timeout=10s
======================================================================
CVE-2026-42530 SAFE-CHECK RESULTS
======================================================================
[VULNERABLE ] edge01.example.com:443 (Server: nginx/1.31.1)
-> Vulnerable NGINX version over HTTP/3. Upgrade to nginx/1.31.2 or later.
[HTTP3_VERSION_HIDDEN ] api.example.com:443
-> HTTP/3 reachable but Server header is masked. Verify the NGINX version manually.
[LIKELY_PATCHED ] edge02.example.com:8443 (Server: nginx/1.31.2)
[NO_HTTP3 ] 10.0.5.21:443
----------------------------------------------------------------------
Summary: VULNERABLE=1 | HTTP3_VERSION_HIDDEN=1 | LIKELY_PATCHED=1 | NO_HTTP3=1
[!] 1 host(s) appear VULNERABLE. Mitigation: upgrade to nginx/1.31.2 or later,
or remove 'quic' from all 'listen' directives.
======================================================================
listen 지시문에서 quic 매개변수를 제거하고 http3 on;을 삭제한 후 NGINX를 리로드하여 HTTP/3을 비활성화합니다. 이렇게 하면 취약한 코드 경로가 완전히 제거됩니다./proc/sys/kernel/randomize_va_space = 2). 이는 강화 계층으로 간주해야 하며 패치를 대체하는 것이 아닙니다.aioquic은 비동기 방식이므로 이 스캐너는 OS 스레드 대신 asyncio.Semaphore를 사용합니다. 네트워크 I/O 바운드 작업(네트워크에서 수백 개의 QUIC 핸드셰이크 대기)에서는 단일 이벤트 루프가 스레드 풀보다 훨씬 적은 오버헤드로 더 높은 확장성을 제공하면서도 "여러 호스트를 한 번에 스캔"하는 동일한 동작을 보장합니다. 상한은 -c로 조정하세요.
조정된 공개(coordinated disclosure)를 위해 원본 공개 자료에서 언급된 연구자들에게 감사드립니다.
MIT License로 배포됩니다. LICENSE를 참조하세요.
방어자와 승인된 레드 팀을 위해 제작되었습니다. 책임감 있게 스캔하세요. 🔐
| CVE | CVE-2026-42530 |
| 구성 요소 | ngx_http_v3_module (HTTP/3 / QUIC) |
| 취약점 클래스 | Use-After-Free (CWE-416) |
| CVSS | 9.2 (v4) · 8.1 (v3.1) |
| 영향 | 워커 크래시 / DoS, ASLR이 없는 경우 RCE 가능 |
| 공격 벡터 | 네트워크, 인증 불필요, 사용자 상호작용 없음 |
| 상태 | 의미 |
|---|
VULNERABLE | HTTP/3으로 제공되는 NGINX 1.31.0 / 1.31.1 |
HTTP3_VERSION_HIDDEN | HTTP/3에 연결할 수 있지만 Server 헤더가 가려져 있음(server_tokens off) — 버전을 수동으로 확인 필요 |
LIKELY_PATCHED | HTTP/3으로 제공되는 NGINX, 영향 범위 밖의 버전 |
NOT_NGINX | HTTP/3에 연결할 수 있지만 NGINX가 아님 |
NO_HTTP3 | 연결 가능한 HTTP/3 / QUIC 리스너가 없음(이 벡터로 노출되지 않음) |
ERROR | 다른 이유로 프로브 실패 |
| 플래그 | 설명 | 기본값 |
|---|
host | 단일 대상(위치 인수) | — |
-f, --file | 대상 목록 파일(- = stdin) | — |
-p, --port | 기본 QUIC/UDP 포트 | 443 |
-t, --timeout | 호스트당 타임아웃(초) | 10 |
-c, --concurrency | 최대 동시 스캔 수 | 50 |
--csv | 결과를 CSV로 저장 | — |
--json | 결과를 JSON으로 저장 | — |