
NGINX RCE 익스플로잇
CVE-2026-42945에 대한 RCE 개념 증명(PoC)으로, 2008년에 도입된 NGINX ngx_http_rewrite_module의 치명적인 힙 버퍼 오버플로우입니다. 이 버그는 rewrite 및 set 지시문을 사용하는 서버에 대해 인증 없이 원격 코드 실행을 가능하게 합니다.
이 취약점은 다른 세 가지 메모리 손상 문제(CVE-2026-42946, CVE-2026-40701, CVE-2026-42934)와 함께 depthfirst의 보안 분석 시스템이 NGINX 소스를 한 번 클릭으로 온보딩한 후 자율적으로 발견했습니다.
자신의 코드에서 이와 같은 문제를 찾고 싶으신가요? https://depthfirst.com/open-defense 에서 동일한 시스템을 사용해 보세요.
NGINX의 스크립트 엔진은 두 단계 프로세스를 사용합니다: 먼저 필요한 버퍼 크기를 계산한 다음 데이터를 복사합니다. rewrite 대체 문자열에 ?가 포함되면 메인 엔진에 is_args 플래그가 설정되지만, 길이 계산 단계는 새로 0으로 초기화된 서브 엔진에서 실행됩니다. 따라서:
is_args = 0을 확인 → 원시 캡처 길이를 반환합니다.is_args = 1을 확인 → 와 함께 를 호출하여 이스케이프 가능한 각 바이트를 3바이트로 확장합니다.NGX_ESCAPE_ARGSngx_escape_uri복사 과정에서 공격자가 제어하는 URI 데이터로 크기가 부족한 힙 버퍼가 오버플로우됩니다. 악용은 요청 간 힙 펭 슈이(heap feng shui)를 사용하여 인접한 ngx_pool_t의 cleanup 포인터를 손상시키고(POST 본문을 통해 스프레이, URI 바이트는 null 바이트를 포함할 수 없으므로), 이를 가짜 ngx_pool_cleanup_s로 리디렉션하여 풀 소멸 시 system()을 호출합니다.
이 버그에 대한 자세한 내용은 기술 문서에서 확인하세요.
| 제품 | 영향 | 수정 버전 |
|---|---|---|
| NGINX 오픈 소스 | 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
| NGINX Plus | R32 – R36 | R36 P4, R35 P2, R32 P6 |
전체 공급업체 권고: https://my.f5.com/manage/s/article/K000160932
K000161616: NGINX ngx_http_v3_module 취약점 — HTTP/3 QPACK은 단방향 인코더 스트림의 풀에서 세션 insert_buffer를 할당합니다. 해당 스트림을 닫으면 세션이 댕글링 포인터를 유지하는 동안 풀이 해제되므로, 이후 인코더 스트림이 NGINX 워커에서 힙 use-after-free를 트리거합니다.
K000162097: NGINX map 지시문 및 정규식 매칭 취약점 — 캡처 변수가 있는 map 지시문 정규식 매칭이 NGINX 워커 프로세스에서 힙 버퍼 오버플로우를 유발할 수 있습니다.
이 버그는 스트림 스크립트 엔진의 두 단계 복합 값 평가에 있습니다. ssl_preread를 사용하는 취약한 stream 구성에서 공격자가 제어하는 TLS SNI가 정규식 기반 변수에 입력됩니다. NGINX는 먼저 출력 버퍼 길이를 계산한 다음 출력을 복사합니다. map 정규식은 이 두 단계 사이에 전역 캡처 상태를 업데이트할 수 있습니다: 길이 계산 단계는 작은 값을 처리하는 반면, 복사 단계는 $1과 같은 더 큰 정규식 캡처를 읽어 워커에서 힙 경계를 벗어난 쓰기를 유발합니다.
동반된 CVE-2026-42533/ PoC는 전체 체인 익스플로잇입니다. 스트림 누수 프리미티브를 사용하여 ASLR 우회를 위한 힙 및 libc 베이스를 복구하고, HTTP 요청 본문을 통해 가짜 ngx_pool_cleanup_s 레코드를 스프레이한 다음, 오버플로우를 사용하여 인접한 NGINX 풀 cleanup 포인터를 손상시킵니다. 손상된 풀이 소멸되면 cleanup 디스패치가 libc system()으로 리디렉션되어 제공된 명령이 실행됩니다.