NOW Briefing
ngx_http_rewrite_module에서 18년간 존재해 온 힙 버퍼 오버플로우(CWE-122) 취약점이 공개되었습니다.
NGINX ngx_http_rewrite_module 힙 버퍼 오버플로우 취약점(CVE-2026-42945)
■ 개요
2026년 5월 13일, 보안 연구 기업 depthfirst와 F5는 NGINX ngx_http_rewrite_module에 존재하는 힙 버퍼 오버플로우 취약점 CVE-2026-42945를 공개했습니다. "NGINX Rift"로 명명된 이 취약점은 CVSS v4 9.2(Critical) 등급을 받았으며, 2008년 NGINX 0.6.27에서 최초 도입된 이후 약 18년간 탐지되지 않았습니다.
이 취약점은 사람이 아닌 AI가 발견했다는 점에서도 주목됩니다. depthfirst에 따르면, 자사의 자율 취약점 분석 시스템은 NGINX 소스코드를 스캔한 지 약 6시간 만에 이번 힙 오버플로우를 포함한 4건의 메모리 손상 취약점을 확인했습니다. 수천 명의 엔지니어와 보안 연구자가 18년간 검토해 온 코드베이스에서 자동화 분석 도구가 핵심 결함을 찾아낸 사례로, AI 기반 코드 분석의 가능성과 기존 수동 감사의 한계를 동시에 보여줍니다.
NGINX는 전 세계 웹사이트의 약 1/3이 사용하는 웹 서버이자 리버스 프록시로, 인터넷에 직접 노출되는 경우가 많습니다. 취약점의 트리거 조건은 rewrite와 set 디렉티브를 함께 사용하는 설정이며, 이는 API 게이트웨이나 레거시 마이그레이션 구성에서 흔히 나타나는 패턴입니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-42945(NGINX Rift) |
| CVSS 점수 | CVSS v4.0 9.2 / Critical |
| 취약점 유형 | CWE-122, 힙 기반 버퍼 오버플로우 |
| 영향 및 위험 |
- 인증 없이 워커 프로세스 충돌(DoS) - ASLR 비활성화 시 RCE 가능 - 반복 트리거를 통한 서비스 가용성 중단 |
| 취약 버전 |
NGINX Open Source 0.6.27 ~ 1.30.0 NGINX Plus R32 ~ R36 |
| 패치 버전 |
NGINX Open Source 1.30.1 / 1.31.0 NGINX Plus R32 P6 / R36 P4 |
■ 기술 분석
NGINX의 스크립트 엔진은 rewrite·set 디렉티브를 컴파일한 뒤, 길이를 계산하고 복사하는 방식으로 실행합니다.
rewrite 치환 문자열에 물음표(?)가 포함되면, ngx_http_script_start_args_code 함수가 메인 엔진의 e->is_args를 1로 설정합니다. 핵심 문제는 이 플래그가 이후 리셋되지 않는다는 점입니다.
뒤이어 set 디렉티브가 캡처 그룹을 참조하면 ngx_http_script_complex_value_code 함수가 호출됩니다. 이 함수는 길이 계산 시 ngx_memzero로 초기화된 별도의 서브 엔진(le)을 사용합니다. 따라서 le.is_args = 0 상태에서는 URI 이스케이프 없이 원시 캡처 길이만 반환합니다. 반면 복사 패스에서는 메인 엔진의 e->is_args = 1이 그대로 유지되어, ngx_escape_uri가 +, %, & 등의 문자를 각각 3바이트로 확장합니다.
결과적으로 raw_size만큼 할당된 버퍼에 raw_size + 2*N 바이트가 기록되면서 힙 오버플로우가 발생합니다.
⚠️ WARN
트리거 조건은 rewrite 치환에 ?가 포함되고, 이후 set·if·rewrite에서 unnamed PCRE 캡처를 참조하는 구성입니다.
이 패턴은 API 라우팅이나 레거시 마이그레이션에서 흔히 사용되므로, 설정 파일 전수 점검이 필요합니다.
취약한 설정 예시와 패치 전후의 핵심 로직은 다음과 같습니다.
# [트리거 설정 예시]
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
/* [패치 전] src/http/ngx_http_script.c ngx_http_script_complex_value_code() */
ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
/* le.is_args = 0, 길이 계산 시 이스케이프 미적용 */
/* [패치 후] 서브 엔진 le에 메인 엔진의 is_args·quote 상태 전파 */
le.is_args = e->is_args;
le.quote = e->quote;
/* 길이 계산 시에도 동일한 이스케이프가 적용되어 버퍼 크기 불일치를 해소 */
■ PoC
depthfirst는 ASLR이 비활성화된 환경에서 RCE를 시연하는 전체 PoC를 공개했습니다. NGINX의 다중 프로세스 아키텍처(master → fork → worker)에서는 힙 레이아웃이 워커 간에 동일하게 복제되므로, 공격자가 예측 가능한 힙 상태를 활용할 수 있다고 연구진은 설명합니다. 전체 익스플로잇 코드와 기술적 세부 사항은 depthfirst 연구 보고서에서 확인할 수 있습니다.
아래 코드는 depthfirst PoC에서 DoS 트리거 부분만 발췌·단순화한 취약 여부 확인 스크립트입니다. URI에 이스케이프 대상 문자(%26)를 대량으로 포함시켜 힙 오버플로우를 유발하고, 워커 프로세스 충돌 여부로 취약점 존재 가능성을 확인합니다. RCE 익스플로잇은 포함되어 있지 않습니다.
# 취약 여부 확인 스크립트 - depthfirst PoC의 DoS 트리거 부분 발췌·단순화
# RCE 익스플로잇이 아닌, 워커 프로세스 충돌 여부 확인 목적
import requests
target = "http://TARGET_IP/api/" + "%26" * 500
try:
r = requests.get(target, timeout=5)
print(f"Status: {r.status_code}")
except requests.exceptions.ConnectionError:
print("[!] 워커 프로세스 충돌 - CVE-2026-42945 취약 가능성 있음")
⚠️ WARN
위 코드를 허가 없이 외부 시스템에 실행하면 법적 책임이 발생할 수 있습니다.
반드시 자체 테스트 환경에서만 사용하십시오.
■ 탐지 및 점검
✅ CHECK
핵심 점검 조건은 rewrite 치환에 ?가 포함되어 있고, 이후 set·if·rewrite에서 unnamed 캡처($1, $2)를 참조하는지 확인하는 것입니다.
• nginx -v 명령으로 현재 버전이 1.30.1 / 1.31.0 미만인지 확인합니다.
• 설정 파일에서 취약 패턴을 검색합니다: grep -rn 'rewrite.*\?.*\$[0-9]' /etc/nginx/
• NGINX 에러 로그에서 워커 비정상 종료 시그널(signal 11 (SIGSEGV), signal 6 (SIGABRT))이 반복적으로 나타나는지 점검합니다.
• 액세스 로그에서 %26, %2B, %25 등 인코딩 문자가 대량 포함된 비정상 URI 패턴을 모니터링합니다.
• 배포판 패키지를 사용하는 경우, 패키지명이 아닌 실제 NGINX 바이너리 버전을 확인합니다(nginx -V 출력의 빌드 버전 참조).
■ 대응 방안
💡 TIP
대응 우선순위: ① 패치 적용 → ② 임시 설정 변경(named 캡처 전환) → ③ WAF/IDS 탐지 룰 배포
• NGINX Open Source는 1.30.1(stable) 또는 1.31.0(mainline)으로 업그레이드합니다. 워커가 패치된 바이너리를 로드하도록 nginx -s reload가 아닌 프로세스 재시작을 수행해야 합니다.
• NGINX Plus는 R32 P6 또는 R36 P4를 적용합니다. Instance Manager, App Protect WAF/DoS, Gateway Fabric, Ingress Controller도 F5 권고(K000161019)에 따라 함께 업데이트합니다.
• 즉시 패치가 불가능한 경우, unnamed 캡처($1, $2)를 named 캡처((?<name>...) / $name)로 변경하여 취약 코드 경로를 우회합니다.
• WAF 또는 IDS에 단일 URI 내 인코딩 문자(%26, %2B, %25)가 비정상적으로 다수 포함된 요청을 탐지·차단하는 룰을 배포합니다.
• 동시에 공개된 CVE-2026-42946, CVE-2026-40701, CVE-2026-42934도 패치 대상에 포함합니다.
[참고 자료]
F5 Security Advisory K000161019
GitHub Advisory GHSA-gcgv-v5gf-c543



