
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)