18년간 잠복해 온 Nginx 취약점 CVE-2026-42945: 원리·PoC·수정 방법 총정리

🚨 18년간 잠복해 온 Nginx 고위험 취약점 CVE-2026-42945: 원리, PoC 및 수정 방법
2026년 5월 13일, 보안 연구기관 depthfirst가 F5와 공동으로 NGINX 역사상 최고 위험도 취약점을 대대적으로 공개했습니다 — CVE-2026-42945:
- CVSS v4.0 점수 9.2: 고위험 취약점에 해당
- 힙 버퍼 오버플로: 원격 코드 실행(RCE)으로 이어질 수 있음
- 18년간 잠복: 2008년 코드베이스에 유입
- 전 세계 975만 개 사이트에 영향: 중국의 254만 개 이상 웹사이트가 영향 받음
- PoC 공개됨: 기안신(QiAnXin)이 성공적으로 재현
이는 NGINX 핵심 모듈의 역사적 취약점으로, 공격자는 특제 HTTP 요청 하나만 보내면 원격으로 서버를 장악할 수 있습니다.
🔍 취약점 개요
기본 정보
| 취약점 속성 | 상세 |
|---|---|
| 취약점 번호 | CVE-2026-42945 |
| CVSS 점수 | v4.0: 9.2 | v3.1: 8.1 |
| 취약점 유형 | 힙 기반 버퍼 오버플로(Heap-based Buffer Overflow) |
| 위협 유형 | 원격 코드 실행(RCE), 서비스 거부(DoS) |
| 악용 조건 | 인증 불필요, HTTP 요청 구성만으로 가능 |
| 영향 컴포넌트 | ngx_http_rewrite_module(NGINX 핵심 내장 모듈) |
| 발견 기관 | depthfirst(자동화 시스템이 6시간 만에 발견) |
영향 범위
- 전 세계 975만 개 사이트영향 받음
- 중국 254만 개 웹사이트영향 받음
- NGINX는 전 세계 웹사이트의 약 1/3을 호스팅하며, 파급력이 매우 큽니다
- 코드는 2008년에 작성되어 18년간 잠복해 왔습니다
⚠️ 트리거 조건
세 조건이 모두 동시에 충족되어야 함
취약점 트리거에는 구성이 특정 조건 조합을 충족해야 합니다:
| 조건 | 설명 | 예시 |
|---|---|---|
| 1. 이름 없는 PCRE 캡처 | rewrite 지시어가 이름 없는 캡처 그룹을 사용 | $1, $2, $3… |
| 2. 치환 문자열에 물음표 포함 | 치환 문자열에 ? 문자 포함 | /profile.php?id=$1&tab=$2 |
| 3. 뒤에 rewrite/if/set가 따름 | rewrite 지시어 뒤에 다른 지시어가 바로 따름 | rewrite … last; if (…) { … } |
취약한 설정 예시
# 易受攻击配置
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# 后跟其他指令
if ($arg_debug) {
set $debug_flag 1;
}
이 설정은 세 조건을 모두 충족합니다:이름 없는 캡처 $1/$2, 치환 문자열에 ? 포함, 뒤에 if 지시어가 따름.
🔬 취약점 원리
2단계 처리의 상태 불일치
NGINX 스크립트 엔진은 2단계 처리를 사용합니다:
- 1단계: 필요한 버퍼 크기 계산
- 2단계: 데이터를 버퍼로 복사
취약점의 핵심은 is_args 플래그 관리 오류입니다:
| 단계 | is_args 상태 | 처리 로직 | 결과 |
|---|---|---|---|
| 길이 계산 단계 | is_args = 0 | 원본 캡처 길이 반환 | 버퍼 크기 과소평가 |
| 데이터 복사 단계 | is_args = 1 | ngx_escape_uri 호출, 각 바이트가 3바이트로 확장 | 힙 버퍼 오버플로 |
구체적 흐름
- rewrite 지시어이름 없는 캡처 $1/$2 포함
- 치환 문자열? 포함, is_args = 1 트리거
- 길이 계산 단계: 새로 초기화된 하위 엔진 사용, is_args = 0
- 원본 길이 반환: 너무 작은 힙 버퍼 할당
- 데이터 복사 단계: 메인 엔진 사용, is_args = 1
- ngx_escape_uri 호출: 바이트 확장, 버퍼 오버플로
- 공격자가 제어 가능한 URI 데이터가 오버플로 영역에 기록됨
악용 방식
요청 간 힙 풍수(Heap Feng Shui):
- POST 요청 본문으로 힙 메모리 스프레이(URI에는 null 바이트를 포함할 수 없기 때문)
- 오버플로 데이터가 인접한 ngx_pool_t의 cleanup 포인터를 파괴
- ngx_pool_cleanup_s 위조, system()을 가리킴
- pool이 파괴될 때system() 호출 트리거
- RCE 구현
ASLR 영향
- ASLR 활성화: Worker 프로세스 크래시(DoS)만 유발
- ASLR 비활성화: 원격 코드 실행(RCE) 가능
📊 영향 버전
NGINX Open Source
| 버전 범위 | 수정 버전 |
|---|---|
| 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
NGINX Plus
| 버전 범위 | 수정 버전 |
|---|---|
| R32 – R36 | R36 P4, R35 P2, R32 P6 |
기타 영향 컴포넌트
- NGINX Instance Manager: 2.16.0 – 2.21.1
- NGINX App Protect WAF: 4.9.0 – 5.8.0
- NGINX Ingress Controller: 3.5.0 – 5.4.1
- NGINX Gateway Fabric: 1.3.0 – 2.5.1
- F5 DoS for NGINX: 4.8.0
🔥 PoC 현황
PoC 공개됨
- GitHub 저장소: https://github.com/DepthFirstDisclosures/Nginx-Rift
- 기안신(QiAnXin)이 재현: 위협정보센터 보안 연구원이 성공적으로 재현
- 기술 세부 정보 공개: depthfirst가 기술 분석 발표
- 실제 공격 악용: 아직 발견되지 않음
PoC 사용 방법
# 构建容器 ./setup.sh # 启动易受攻击的 NGINX 服务器 docker compose -f env/docker-compose.yml up # 执行 PoC 获取 Shell python3 poc.py --shell
✅ 수정 방법
방법 1: 버전 업그레이드
# 升级到修复版本 NGINX Open Source >= 1.31.0 NGINX Open Source >= 1.30.1 NGINX Plus >= R32 P6 NGINX Plus >= R36 P4 # 升级后重启 NGINX nginx -s reload
방법 2: 설정 수정(완화 조치)
설정에서 이름 없는 캡처 그룹을 이름 있는 캡처 그룹으로 교체:
# 易受攻击配置(未命名捕获) rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last; # 修复后配置(命名捕获) rewrite ^/users/(?[0-9]+)/profile/(?.*)$ /profile.php?id=$user_id&tab=$section last;
이름 있는 캡처 그룹은 취약점을 트리거하지 않습니다.
방법 3: 설정 점검
취약한 설정이 있는지 점검:
# 搜索易受攻击的 rewrite 指令 grep -E "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/nginx.conf grep -rE "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/conf.d/
🔍 발견 과정
자동화 시스템이 발견
depthfirst의 보안 분석 시스템:
- 6시간 만에5개 문제 발견
- 4개가 NGINX에서 확인됨
- CVE-2026-42945가 가장 심각한 취약점
- 2008년으로 거슬러 올라가며, 거의 모든 표준 빌드 버전에 존재
기타 관련 취약점
- CVE-2026-42946: 메모리 손상 문제
- CVE-2026-40701: 메모리 손상 문제
- CVE-2026-42934: 메모리 손상 문제
📝 요약
CVE-2026-42945는 NGINX 역사상 고위험 취약점입니다:
- 18년 잠복: 2008년 코드베이스에 유입
- CVSS 9.2: 힙 버퍼 오버플로, RCE로 이어질 수 있음
- 트리거 조건: rewrite 지시어가 이름 없는 캡처 사용 + 치환 문자열에 ? 포함 + 뒤에 다른 지시어가 따름
- 영향 범위: 전 세계 975만 개 사이트, 중국 254만 개 웹사이트
- PoC 공개: GitHub 저장소 + 기안신(QiAnXin)이 재현
- 수정 방법: 버전 업그레이드 또는 이름 있는 캡처 그룹 사용
18년 잠복 취약점이 터졌으니, 최대한 빨리 업그레이드하거나 설정을 수정하시기 바랍니다.
공식 공지: https://my.f5.com/manage/s/article/K000161019
PoC 저장소: https://github.com/DepthFirstDisclosures/Nginx-Rift