NOW Briefing
ngx_http_v3_module)의 use-after-free 결함 CVE-2026-42530을 공개하고 nginx 1.31.2를 긴급 배포했습니다.
listen 지시자에 quic을 설정한 NGINX OSS 1.31.0~1.31.1과 동일 코드 베이스를 공유하는 NGINX Plus·Gateway Fabric 인스턴스는 즉시 1.31.2 계열 패치를 적용하거나 HTTP/3을 비활성화해야 합니다.
NGINX HTTP/3 QPACK Use-After-Free 취약점 (CVE-2026-42530)
■ 개요
F5는 2026-06-17 권고에서 NGINX HTTP/3 모듈의 use-after-free(해제된 메모리 재사용) 결함 CVE-2026-42530을 공개하고, 긴급 빌드 nginx 1.31.2를 배포했습니다. listen에 quic을 추가해 HTTP/3을 켠 NGINX OSS 1.31.0~1.31.1이 대상이며, 같은 코드를 쓰는 NGINX Plus·Gateway Fabric·Instance Manager도 영향을 받습니다. 단, 실제 트래픽 경로(데이터 플레인)에 한정되고 관리용 컨트롤 플레인은 노출되지 않습니다.
원인은 QPACK(HTTP/3 헤더 압축) 인코더 스트림의 메모리 풀 수명 불일치입니다. 스트림이 끝난 뒤에도 같은 세션의 다음 스트림이 그 버퍼를 참조할 수 있어, 미인증 공격자가 이 경로를 조작하면 워커 프로세스에 use-after-free가 발생합니다. 1차 피해는 워커 재시작에 따른 DoS이고, ASLR(메모리 주소 무작위화)이 우회되는 환경에서는 원격 코드 실행까지 가능해 CVSS 9.2를 받았습니다.
HTTP/3은 기본 비활성(옵트인)이라 노출 표면은 좁지만, 이미 켜 둔 QUIC 기반 엣지·CDN·gRPC 게이트웨이는 패치 전까지 그대로 노출됩니다. 같은 릴리스에서 CVE-2026-42055(HTTP/2·gRPC 프록시 힙 오버플로, CVSS 9.2)와 CVE-2026-48142(charset_map UTF-8 범위 초과 읽기)도 함께 수정되어, 1.31.2 한 번으로 세 건을 모두 적용할 수 있습니다. 이 결함들은 CyStack의 Trung Nguyen이 보고했습니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-42530 (F5 K000161616) |
| CVSS 점수 | CVSS v4 9.2 / Critical |
| 취약점 유형 | CWE-416: 해제 후 사용, ngx_http_v3_module QPACK 인코더 스트림 |
| 영향/위험 |
• 미인증 원격 공격자에 의한 워커 프로세스 메모리 손상 • 워커 재시작에 따른 데이터 플레인 서비스 중단 • ASLR 비활성화·우회 환경에서 원격 코드 실행 가능 • 데이터 플레인 한정, 컨트롤 플레인 노출 없음 |
| 취약 버전 | NGINX OSS 1.31.0 ~ 1.31.1 (HTTP/3 활성화 시), NGINX Plus·Gateway Fabric·Instance Manager 동일 코드 베이스 |
| 패치 버전 | NGINX OSS 1.31.2 (2026-06-17), 해당 코드가 통합된 NGINX Plus 핫픽스 빌드 |
■ 기술 분석
공개된 nginx 1.31.2 패치는 두 개의 커밋(ceccdbd2, 9e293766)으로 구성됩니다. 결함은 QPACK 동적 테이블 구현 파일 src/http/v3/ngx_http_v3_table.c의 ngx_http_v3_get_insert_buffer()에서 발생합니다.
구체적으로 이 함수는 insert 버퍼를 인코더 스트림 자체의 풀(c->pool)에 할당합니다. 인코더 스트림이 종료되면 그 풀과 함께 버퍼도 해제되지만, HTTP/3 세션 자체는 살아있으며 동일 동적 테이블이 다음에 열리는 인코더 스트림에서 다시 참조됩니다. 이때 해제된 메모리에 접근하면서 use-after-free가 발생합니다.
이에 따라 1차 패치는 insert 버퍼 할당 위치를 인코더 스트림 풀 대신 QUIC 부모 연결의 풀(c->quic->parent->pool)로 옮겨, 동적 테이블의 수명을 세션 단위로 일치시키고 한 줄 변경만으로 트리거 경로를 차단합니다.
/* [패치 전] src/http/v3/ngx_http_v3_table.c — ngx_http_v3_get_insert_buffer() */
dt->insert_buffer = ngx_create_temp_buf(c->pool,
/* ... 인자 생략 ... */);
/* [패치 후] */
dt->insert_buffer = ngx_create_temp_buf(c->quic->parent->pool,
/* ... 인자 생략 ... */);
이와 함께 보조 커밋 9e293766은 src/http/v3/ngx_http_v3_uni.c에서 클라이언트 단방향 표준 스트림(컨트롤·인코더·디코더)의 재생성 경로를 봉쇄합니다. 이전에는 known_streams[index] 슬롯이 NULL인지로 중복을 판단했기 때문에 인코더 스트림이 닫혀 슬롯이 비면 같은 종류 스트림을 다시 열 수 있었습니다. 패치 후에는 created_streams 비트마스크를 세션 수명 동안 유지해, 한 번이라도 생성된 표준 스트림은 다시 만들 수 없도록 강제합니다.
/* [패치 후] src/http/v3/ngx_http_v3_uni.c */
if (h3c->created_streams & (1 << index)) {
/* 표준 클라이언트 단방향 스트림 재생성 거부 */
/* ... 오류 처리 생략 ... */
}
h3c->created_streams |= 1 << index;
⚠️ WARN
insert 버퍼는 QPACK 압축 컨텍스트의 핵심 자료 구조이며, 동일 세션 안에서 이후 인코더 스트림이 이를 다시 참조하기 때문에 결함이 미인증 단계에서 트리거됩니다.
HTTP/3 핸드셰이크가 완료된 직후의 QUIC 세션이라면 별도의 애플리케이션 인증이나 세션 토큰 없이 도달 가능한 경로입니다.
■ 익스플로잇 조건과 영향 범위
트리거에는 두 조건이 필요합니다. NGINX에 HTTP/3·QUIC이 활성화돼 있어야 하고, 외부에서 UDP/443으로 QUIC 핸드셰이크가 가능해야 합니다. 정확히는 listen 지시자에 quic 매개변수가 포함된 구성이 대상이며, listen 443 ssl 단독처럼 TCP 위 TLS만 활성화된 인스턴스는 영향을 받지 않습니다. HTTP/3은 NGINX OSS 기본 빌드에서 옵트인이지만, 최근 1년 사이 CDN·엣지·gRPC 게이트웨이 구간에서 도입이 빠르게 진행됐기 때문에 실제 노출 표면은 큽니다.
운영 관점에서 영향은 두 갈래로 나뉩니다. 기본 시나리오는 use-after-free에 따른 워커 프로세스 세그멘테이션 폴트와 재시작입니다. NGINX의 마스터-워커 구조상 단일 워커가 죽어도 즉시 새 워커가 시작되어 서비스 자체는 회복되지만, 반복 트리거 시 데이터 플레인 DoS가 됩니다. 두 번째 시나리오는 ASLR이 비활성화된 컨테이너 이미지나 우회 가능 조건에서 힙 레이아웃을 제어해 원격 코드 실행으로 확대되는 경우입니다. F5는 후자를 공개 PoC 없이 이론적 가능성으로 명시했고, CVSS 9.2(Critical)는 이를 반영한 값입니다.
다만 노출 범위는 데이터 플레인에 한정됩니다. NGINX Instance Manager와 같은 관리 평면은 동일 코드를 포함하더라도 HTTP/3 리스너를 외부에 노출하는 구성이 일반적이지 않아 실질 위험은 낮지만, 패치는 동일 빌드로 일괄 적용해야 합니다. 동반 공개된 CVE-2026-42055는 HTTP/2·gRPC 프록시 경로의 힙 오버플로로 트리거 조건이 다르므로 두 결함을 별도로 평가하고 동일 빌드로 함께 패치해야 합니다.
■ 탐지 및 점검
✅ CHECK
점검 순서는 ① 영향 버전 식별 → ② HTTP/3 활성화 여부 → ③ QUIC 외부 노출 여부 → ④ 패치 적용 후 검증입니다.
• nginx -v로 빌드 버전이 1.31.0 또는 1.31.1인지 확인하고, NGINX Plus는 1.31.x 코드가 백포트된 빌드인지 F5 권고와 대조해 점검합니다.
• nginx -T | grep -i quic로 listen 지시자에 quic 매개변수가 포함된 server 블록이 있는지 확인합니다.
• 방화벽·보안 그룹에서 외부 UDP/443(또는 QUIC 사용 포트)을 인스턴스로 허용하는지 점검합니다.
• 에러 로그에서 worker process ... exited on signal 11 등 SIGSEGV 메시지가 최근 발생했는지 조회하고, 동일 시각의 client 주소를 식별합니다.
• 패치 적용 후 nginx -v 출력이 1.31.2 이상이며, NGINX Plus는 F5 권고에 명시된 핫픽스 빌드와 일치하는지 재검증합니다.
■ 대응 방안
💡 TIP
무중단 적용은 nginx -s reload 직후 워커 PID가 새 바이너리 기준으로 교체됐는지 부모 PID를 추적해 확인하는 방식으로 검증합니다.
• 영향이 확인된 NGINX OSS는 1.31.2 이상으로 즉시 업그레이드하고, 안정 라인 운영자는 같은 권고의 1.30.x 라인 패치도 함께 확인해 적용합니다.
• 즉시 패치가 불가능한 경우 임시 대응으로 listen 지시자에서 quic 매개변수를 제거하고 reload해 HTTP/3을 비활성화합니다.
• NGINX Plus·Gateway Fabric·Instance Manager는 F5 권고 K000161616에 명시된 핫픽스 빌드를 적용합니다.
• 동반 공개된 CVE-2026-42055 완화책으로 ignore_invalid_headers off와 large_client_header_buffers 2 MB 초과 구성을 함께 점검·조정합니다.
• 패치 적용 후 24~48시간 동안 워커 재시작 로그와 QUIC 핸드셰이크 실패율을 모니터링해 회귀를 조기에 식별합니다.
[참고 자료]
F5 K000161616 — NGINX ngx_http_v3_module vulnerability CVE-2026-42530
nginx CHANGES — 1.31.2 (2026-06-17)
nginx commit ceccdbd2 — HTTP/3 allocate insert buffer from connection pool
nginx commit 9e293766 — HTTP/3 prevent recreating standard client uni streams
BleepingComputer — F5 issues out-of-band patches for critical NGINX vulnerabilities
Security Affairs — F5 patches critical NGINX vulnerabilities enabling unauthenticated code execution



