Codex가 10년 묵은 두 버그를 엮어 HTTP/2 폭탄을 만들었어요
6월 2일, 보안 회사 Calif가 HTTP/2 Bomb이라는 원격 서비스 거부 익스플로잇을 공개했어요. nginx, Apache httpd, Microsoft IIS, Envoy, Cloudflare Pingora의 기본 HTTP/2 설정을 그대로 깨버리는 공격이고, Shodan 검색 기준으로 약 88만 대의 공개 서버가 영향권에 있어요. 가정용 인터넷 회선 한 줄을 가진 공격자 한 명이 약 10초 만에 Envoy의 메모리 32GB를 그대로 붙잡아둘 수 있고, Apache도 18초 정도면 같은 상태가 돼요. 이 공격을 실제로 조립한 건 OpenAI의 AI 코딩 에이전트 Codex고요, 보안 업계가 10년 가까이 따로따로 알고 있던 두 가지 기법을 체이닝한 결과예요.
체인
두 갈래 모두 새로운 기법은 아니에요. HPACK은 HTTP/2의 헤더 압축 방식이에요(RFC 7541). 양쪽 엔드포인트가 최근 헤더를 담아두는 작은 "다이내믹 테이블"을 들고 있고, 1바이트짜리 인덱스 하나로 그 안의 어떤 헤더든 다시 참조할 수 있어요. Cory Benfield가 2016년에 공개한 "HPACK Bomb"(CVE-2016-6581)은 큰 헤더 하나를 테이블에 박아두고 그걸 수천 번 참조해서 서버 메모리를 터뜨리는 식이었고, 그 뒤로 서버들은 디코딩된 헤더 총 크기에 상한을 두기 시작했어요.
Calif의 폭탄은 그 방향을 뒤집어요. 거의 빈 헤더 하나를 테이블에 박아두고, 그걸 가리키는 1바이트 참조를 수천 개 흘려보내요. 디코딩된 페이로드 자체는 작으니 크기 상한은 발동되지 않지만, 참조 하나마다 서버의 내부 자료구조에서 새 엔트리 할당이 일어나요. 결과적으로 회선 위 1바이트가 서버에서는 70바이트부터 4,000바이트까지 메모리로 변해요. 서버마다 비율이 달라요.
그다음이 "잡아두기" 단계예요. HTTP/2에서는 수신 측이 플로우 컨트롤 윈도우를 광고해서 송신 측이 응답으로 몇 바이트나 보낼 수 있는지 정해요. 익스플로잇은 윈도우를 0바이트로 광고해서 서버가 응답을 끝낼 수 없게 만들고, 그러면서 몇 초마다 1바이트짜리 WINDOW_UPDATE 프레임만 깔짝깔짝 흘려보내 연결이 타임아웃되지 않게 해요. 그 사이 폭탄이 할당해둔 모든 바이트는 메모리에 그대로 묶여 있어요.
Apache httpd와 Envoy는 쿠키 처리에서 증폭 폭이 한 단계 더 커져요. RFC 9113 §8.2.3이 Cookie 헤더를 "크럼"(이름/값 쌍 하나) 단위로 쪼개서 여러 필드로 보내는 걸 허용하는데, 두 서버 모두 이 크럼 개수를 헤더 필드 한도에 포함시키지 않고 있었어요. Envoy는 크럼을 받을 때마다 버퍼에 이어붙이고, Apache는 크럼마다 합쳐진 전체 쿠키 문자열을 다시 만들면서 이전 사본을 스트림이 끝날 때까지 그대로 들고 있어요. 측정된 증폭률은 Envoy 1.37.2가 약 5,700:1, Apache httpd 2.4.67가 약 4,000:1, nginx 1.29.7이 약 70:1, Windows Server 2025의 IIS가 약 68:1이에요.
왜 중요한가요
Codex가 두 기법 중 어느 하나를 새로 발명한 건 아니에요. 다만 네 서버의 소스 코드를 모두 읽고, 두 기법이 합쳐질 수 있다는 걸 알아채고, 실제로 동작하는 체인을 코드로 써냈어요. Calif의 글을 쓴 사람은 Thai Duong인데, 2012년 CRIME 공격으로 HTTP 헤더 압축을 깬 장본인이고, 그 대안으로 나온 HPACK을 리뷰해달라는 요청도 받았던 사람이에요. 그가 공개 글 마지막에서 직접 인정한 게 좀 무거워요. 자기가 당시 남긴 리뷰 노트를 다시 읽어봤는데, 이 폭탄은 단 한 번도 떠올린 적이 없었다고요.
요즘 떠도는 화제성 너머의 진짜 이야기는 이쪽이에요. 둘 다 명백히 경고가 적혀 있던 두 CVE 계열이, 같은 스펙 안에 14년 동안 나란히 누워 있었는데도 사람은 아무도 엮어보지 않았다는 거예요. Calif는 nginx와 Apache 패치 커밋이 공개된 뒤로는 어지간한 모델이 그 diff만 보고도 익스플로잇을 재구성할 수 있다고 적었어요. 실제로 자기네가 IIS, Envoy, Pingora의 취약성을 확인한 방법도 그 경로였고요.
패치 상황은 들쭉날쭉해요. nginx는 4월에 max_headers 디렉티브를 1.29.8에 미리 넣어뒀어요(기본 상한 1,000). Apache는 5월 27일 Calif가 알린 그날, Stefan Eissing이 같은 날 커밋으로 고쳐냈고 CVE-2026-49975가 부여됐어요. 다만 패치 자체는 mod_http2 v2.0.41에 들어가 있고, 아직 2.4.x 정식 릴리스에는 포함돼 있지 않아요. Envoy는 6월 3일부터 패치를 굴리고 있는데 검증이 진행 중이에요. Microsoft IIS와 Cloudflare Pingora는 글 발표 시점 기준으로 패치가 없어서, Calif는 HTTP/2를 끄거나, 요청당 헤더 개수에 단단한 상한을 두는 무언가를 앞단에 세우라고 권하고 있어요.
앞으로 지켜볼 것
다음에 봐야 할 신호들은 꽤 구체적이에요. Envoy의 픽스가 검증을 통과해서 태그된 릴리스로 들어가야 하고, Microsoft와 Cloudflare도 공식 입장을 내놓아야 해요. Pingora는 공개 웹의 적지 않은 트래픽을 실제로 종단하는 인프라라서, 70:1짜리 증폭률도 그 규모에서는 충분히 아파요. 이번 발견을 주도한 Quang Luong은 이달 후반 스탠퍼드의 Real World AI Security 컨퍼런스에서 기법을 발표할 예정이에요. 거기에서 Codex를 어떻게 프롬프트했고, 이 워크플로가 얼마나 재현 가능한지가 좀 더 드러날 것 같아요. 더 흥미로운 시험대는 그다음이에요. 같은 식의 크로스 코드베이스 에이전트 리뷰로 발견되는 다음 디스클로저가 몇 주 안에 나올지, 아니면 몇 달이 걸릴지요.
출처