본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 05. 08:21

HTTP/2 Bomb (CVE-2026-49975): HPACK + 흐름 제어(flow-control) DoS 및 패치 방법

요약

HPACK 인덱스 참조 증폭과 흐름 제어 지연을 결합하여 서버 메모리를 고갈시키는 새로운 HTTP/2 DoS 공격 방식인 'HTTP/2 Bomb'을 소개합니다. AI가 기존의 두 취약점을 결합하여 공격 코드를 재구축할 수 있음을 경고하며, 주요 웹 서버별 패치 방법을 안내합니다.

핵심 포인트

  • HPACK 인덱스 참조를 통한 메모리 증폭 공격 가능
  • 흐름 제어 윈도우 조작으로 할당된 메모리 해제 방지
  • AI가 기존 취약점들을 결합해 새로운 공격 체인을 발견
  • nginx, Apache, Envoy 등 주요 서버의 패치 및 완화 방법 필요

각각 10년 동안 공개되어 있던 두 가지 버그가 결합되어, 기본 설정 상태의 가장 널리 배포된 웹 서버 5개를 무너뜨리는 하나의 원격 서비스 거부(DoS) 공격으로 만들어졌습니다. 100Mbps 속도의 가정용 연결을 사용하는 단일 클라이언트가 약 20초 만에 약 32GB의 RAM을 점유할 수 있습니다. 봇넷도, 자격 증명도 필요 없습니다. 노트북 한 대면 충분합니다.

공격 체인(chain) 자체는 흥미로운 부분이 아닙니다. 흥미로운 점은 AI가 코드베이스를 읽고 두 가지 알려진 악성 동작이 결합되는 것을 발견했다는 점이며, 현재 공개된 패치만으로도 모델이 공격 코드(exploit)를 재구축할 수 있다는 점입니다. 이에 대한 자세한 내용은 아래에서 다루겠습니다. 먼저, 공격을 당하지 않기 위해 알아야 할 사항부터 살펴보겠습니다.

영향을 받는 대상 및 패치 사항

취약한 동작은 5개 서버 모두의 기본 HTTP/2 설정에 존재합니다. 이 클래스 전체를 아우르는 단일 CVE는 없으며, Apache와 Envoy는 각각 고유의 CVE를 부여받았습니다.

서버상태수정 / 완화 방법
nginx패치됨1.29.8+ 버전에서 max_headers (기본값 1000) 추가
...

Apache의 변종은 CVE-2026-49975입니다. Envoy의 변종은 CVE-2026-47774입니다. 나머지 구현체들은 자체적인 번호를 부여할 수 있습니다.

공격 체인 (The chain)

이는 두 가지 기본 요소(primitives)가 쌓인 형태입니다.

HPACK 인덱스 참조 증폭 (HPACK indexed-reference amplification). HTTP/2는 HPACK을 사용하여 헤더를 압축하며, 이는 최근에 확인된 헤더의 동적 테이블(dynamic table)을 유지합니다. 헤더를 한 번 삽입하면 이후 요청에서는 1바이트 인덱스로 이를 참조할 수 있으며, 서버는 각 참조에 대해 해당 헤더의 전체 복사본을 메모리에 생성(materialize)합니다. 네트워크상에서는 1바이트이지만, 서버에서는 전체 헤더 할당이 일어납니다. 단일 요청 내의 수천 개 참조는 몇 KB의 트래픽을 수 MB의 RAM으로 바꿉니다. Calif는 증폭 배율을 nginx에서 약 70:1, Apache와 Envoy에서 약 4,000:1, 그리고 Envoy에서 최대 약 5,700:1로 측정했습니다. 일반적인 "최대 디코딩된 헤더 크기(max decoded header size)" 제한을 우회하는 트릭은 Cookie 헤더입니다. RFC 9113은 쿠키 조각(crumb)당 하나의 필드로 나눌 수 있도록 허용하며, 여러 서버가 이를 필드 개수 제한(field-count limit)에 포함하지 않았습니다.

흐름 제어(flow-control) 지연. 만약 요청이 완료될 때 메모리가 해제된다면 증폭(Amplification)만으로는 해롭지 않습니다. 두 번째 프리미티브(primitive)가 이를 고정합니다. 클라이언트가 서버의 응답에 대해 0바이트 흐름 제어 윈도우(flow-control window)를 광고하면, 서버는 응답을 결코 마칠 수 없으며 요청의 메모리를 결코 회수할 수 없게 됩니다. 주기적으로 WINDOW_UPDATE를 흘려보내 연결이 타임아웃(timeout)되지 않게 유지하면, 서버가 허용하는 한 메모리 할당은 계속 잠긴 상태로 유지됩니다.

팽창시키기 위한 압축 폭탄(Compression bomb), 고정시키기 위한 느린 읽기(slow-read) 유지. 이것이 전체 과정입니다.

이 중 새로운 것은 아무것도 없다는 것이 실제 이야기입니다

모든 요소는 수년 동안 공개되어 있었습니다:

  • CVE-2016-6581 -- 오리지널 HPACK Bomb (Cory Benfield, 2016)
  • CVE-2016-8740 -- 경계가 없는 CONTINUATION 프레임, Apache (2016)
  • CVE-2016-1546 -- 흐름 제어(flow-control) / 워커 스레드(worker-thread) 기아 상태, Apache (2016)
  • CVE-2025-53020 -- 약 4,000배의 HPACK 증폭, Apache (Gal Bar Nahum, 2025)

RFC 7541 §7.3은 공격자가 엔드포인트의 메모리를 고갈시키려 시도할 수 있다고 경고하며 시작합니다. 다섯 개의 독립적인 구현체들이 이를 읽었음에도 불구하고 동일한 부류의 버그를 출시했습니다. 이는 Calif가 언급했듯이, 결함이 다섯 개의 개별 팀이 아닌 스펙(spec) 자체에 있음을 의미합니다.

이 두 부분을 조합한 것은 OpenAI의 Codex였습니다. Codex는 다섯 개의 코드베이스 전체를 읽고, 기술들이 서로 맞물리는 것을 확인하여 결합된 공격을 구축했습니다. 연구원 Quang Luong는 이번 달 스탠퍼드 보안 컨퍼런스에서 이 방법을 발표할 예정입니다. 일단 보고 나면 이 조합은 명백하며, 그것이 바로 핵심입니다. 두 가지 알려진 악성 동작을 동시에 실행하면 어떤 일이 발생하는지 질문할 인내심을 가지고 다섯 개의 코드베이스를 동시에 살펴보는 사람은 아무도 없었습니다. 이 조합은 팀들 사이의 틈새에 존재했으며, 그 누구도 그 틈새를 관리하지 않습니다.

당신의 패치 주기(patch cycle)가 방금 바뀐 이유

Calif의 기술 보고서(writeup)에서 DoS 자체보다 당신을 더 괴롭힐 문구는 바로 이것입니다: 수정 커밋(fix commits)은 공개되어 있으며, 이는 공격을 직접적으로 매핑하고, 능력이 있는 어떤 모델이라도 차이점(diff)을 읽고 작동하는 익스플로잇(exploit)을 재구성할 수 있다는 점입니다. 이것은 가설이 아닙니다. Calif가 IIS, Envoy, Pingora가 애초에 취약하다는 것을 확인한 방식이 바로 이것입니다. 그들은 패치 차이점(patch diffs)을 모델에 입력하고 모델이 이를 일반화하도록 했습니다.

책임 있는 공개(Responsible disclosure)는 항상 "패치 게시"와 "익스플로잇 무기화" 사이의 간극에 의존해 왔으며, 이 간극은 공격자가 리버싱을 마치기 전에 수정을 배포하는 인간의 노력으로 채워져 왔습니다. 하지만 차이점(diff)만으로도 모델이 공격을 재구성하기에 충분하다면, 그 간극은 제로(0)를 향해 붕괴합니다. 유예 기간과 공격자의 노력 비용(effort tax)은 동일한 것이었으나, 이제 그것은 증발하고 있습니다. PoC(Proof of Concept)가 보안 권고(advisory)와 함께 배포된다고 가정하고 패치 주기(patch window)를 계획하십시오. 기능적으로는 이제 실제로 그렇기 때문입니다.

완화 방법 (Mitigations)

nginx:

# 1.29.8+ 버전에서 max_headers(기본값 1000)가 추가되었습니다. 업그레이드하세요.
# 아직 업그레이드가 불가능하다면, HTTP/2를 비활성화하세요:
http2 off;

Apache httpd:

# 수정 사항은 mod_http2 2.0.41 (standalone / trunk)에 포함되어 있으며,
# 공개 시점 기준으로 안정적인 2.4.x 버전에는 아직 포함되지 않았습니다.
# 모듈을 가져올 수 없다면, HTTP/2를 비활성화하세요:
...

Envoy: 1.35.11, 1.36.7, 1.37.3 또는 1.38.1 버전으로 업그레이드하십시오 (CVE-2026-47774). 수정 사항은 압축되지 않은 쿠키(uncompressed cookies)가 헤더 제한(header limits)에 포함되도록 합니다.

Microsoft IIS / Cloudflare Pingora: 이 글을 쓰는 시점 기준으로 제가 찾을 수 있는 공개된 수정 사항은 없습니다. HTTP/2를 비활성화하거나, 요청당 헤더 개수 상한(per-request header-count cap)을 엄격하게 적용하는 프론트엔드 서버를 배치하십시오.

벤더와 관계없이 모든 사용자:

# 하나의 제한이 아닌 두 개의 제한을 적용하십시오: 디코딩된 헤더 크기(SIZE)와 헤더 개수(COUNT)
# (쿠키 조각 포함)를 제한하고, 중단된 스트림(stalled stream)의 수명을 제한하십시오.
# 아직 그것이 불가능하다면, 폭탄을 맞은 워커(worker)가 ...

깨끗하게 종료되고 다시 생성되는 워커가, 다른 모든 요청이 느려지는 동안 전체 머신의 메모리를 95% 점유하며 버티는 워커보다 훨씬 더 나은 장애 모드(failure mode)입니다.

요점 (Takeaway)

HTTP/2 Bomb은 몇 주 안에 모든 곳에서 패치될 것입니다. 하지만 이를 발생시킨 조건은 사라지지 않습니다. 우리의 보안 부채(security debt)는 우리가 알고 있는 CVE(Common Vulnerabilities and Exposures)뿐만이 아닙니다. 그것은 각각의 시스템이 개별적으로는 문제가 없어 보였던 시스템 사이의 틈새에 자리 잡고 있으며, 아무도 수치를 계산해 보지 않은 명백한 결합(compositions)들의 백로그(backlog)입니다. 과거에 이러한 백로그로부터 우리를 보호해 주었던 것은 이를 점검하는 과정이 매우 지루하다는 점이었습니다. 하지만 이제 그 시대는 끝났습니다. 이제 지루한 작업은 비용이 들지 않습니다. 이를 수행하기로 선택한 방어자들에게는 물론, 선택하지 않은 모든 이들에게도 마찬가지입니다. 다른 누군가가 하기 전에 여러분의 인프라에 대해 직접 수치를 계산해 보십시오.

시기 참고: 이 사안은 여전히 진행 중입니다. Envoy는 사건이 전개되는 동안 수정 사항을 배포했으며, 다른 곳들도 뒤따를 수 있습니다. 여기의 모든 내용은 2026년 6월 4일 기준으로 정확합니다. 조치를 취하기 전에 각 벤더(vendor)의 권고 사항을 확인하십시오.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0