
CVE-2026-42945에 대한 RCE 개념 증명입니다. 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이 표시되어 → NGX_ESCAPE_ARGS로 ngx_escape_uri를 호출하고, 이스케이프 가능한 각 바이트를 3바이트로 확장합니다.복사 과정에서 공격자가 제어하는 URI 데이터로 인해 크기가 부족한 힙 버퍼가 오버플로우됩니다. 악용은 요청 간 힙 펭슈이(heap feng shui)를 사용해 인접한 ngx_pool_t의 cleanup 포인터를 손상시키고(URI 바이트는 널 바이트를 포함할 수 없으므로 POST 본문을 통해 스프레이됨), 이를 가짜 ngx_pool_cleanup_s로 리디렉션하여 풀(pool) 소멸 시 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
Ubuntu 24.04.3 LTS에서 테스트되었습니다.
./setup.sh — 컨테이너를 빌드합니다.docker compose -f env/docker-compose.yml up — 취약한 NGINX 서버를 시작합니다.python3 poc.py --shell — 셸을 획득합니다.