← 목록으로

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

itadol5j

Nginx CVE-2026-42945

🚨 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바이트로 확장 힙 버퍼 오버플로

구체적 흐름

  1. rewrite 지시어이름 없는 캡처 $1/$2 포함
  2. 치환 문자열? 포함, is_args = 1 트리거
  3. 길이 계산 단계: 새로 초기화된 하위 엔진 사용, is_args = 0
  4. 원본 길이 반환: 너무 작은 힙 버퍼 할당
  5. 데이터 복사 단계: 메인 엔진 사용, is_args = 1
  6. ngx_escape_uri 호출: 바이트 확장, 버퍼 오버플로
  7. 공격자가 제어 가능한 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

기술 분석: https://depthfirst.com/research/nginx-rift