
NGINX Rift — 18년간 숨겨졌던 치명적 취약점의 모든 것
2026년 5월, 전 세계 웹 서버 시장의 약 39~43%를 차지하는 NGINX에서 18년 만에 발견된 치명적 취약점이 공개됐다. 취약점명은 'NGINX Rift', 공식 CVE는 CVE-2026-42945이다. CVSS v4 점수 9.2의 초고위험 취약점이다. 인증 없는 공격자가 특수하게 조작된 HTTP 요청 한 건으로 원격 코드 실행(RCE)까지 가능한 경우가 있다.
이 취약점은 2008년부터 코드에 숨어 있었다. 발견자는 자율 취약점 분석 플랫폼 depthfirst이며, NGINX 소스 코드 온보딩 한 번으로 6시간 만에 자율 발견했다. 18년간 아무도 발견하지 못한 버그가 Automated Vulnerability Analysis 시스템의 도움으로 빠르게 현실화됐다.
취약점이 존재하는 이유 — 두 패스의 불일치
NGINX의 ngx_http_rewrite_module은 URL 리다이렉트와 변수 할당에 핵심적인 모듈이다. 이 모듈의 스크립트 엔진은 두 단계 패스로 동작한다.
첫 번째 패스에서는 리소스 크기를 계산하고 메모리를 할당한다. 두 번째 패스에서는 실제 데이터를 기록한다.
취약점은 바로 이 두 패스 간 계약이 깨지는 지점에서 발생한다.
rewrite 치환 문자열에 물음표(?)가 포함되어 있으면, ngx_http_script_start_args_code 함수가 내부 플래그 e->is_args = 1을 설정한다. 이후 set 지시어에서 정규식 캡처 그룹 $1, $2 등을 참조하면 길이 계산은 0으로 초기화된 서브 엔진 위에서 실행된다. 이때는 이스케이프가 적용되지 않은 원본 캡처 길이만 계산한다.
그러나 복사 단계에서는 메인 엔진의 is_args = 1 상태가 그대로 유지되면서 ngx_escape_uri가 NGX_ESCAPE_ARGS 모드로 호출된다. URI에 포함된 +, %, & 같은 문자가 각각 3바이트로 확장된다. 문제는 버퍼 크기는 첫 번째 패스의 작은 값 기준으로 할당됐기 때문에, 확장된 데이터가 힙 버퍼를 넘치게 된다.
공격자가 제어하는 URI 데이터가 버퍼를 덮어쓰므로, 이 오버플로는 랜덤한 메모리 손상이 아니라 공격자 제어 메모리 오염이다.
익스플로잇 동작 원리
공격은 요청 간 힙 풍수(heap feng shui) 기법을 사용한다. NGINX는 요청을 처리할 때 워커 프로세스를fork 하는데, 마스터에서fork된 워커 프로세스는 같은 메모리 레이아웃을 공유한다. 공격자는 다음 전략을 사용한다.
1. 스프레이 단계: URI 바이트에 null 바이트를 넣을 수 없으므로, POST 본문을 통해 힙을 조작한다.
2. 포인트 오염: 인접한 ngx_pool_t의 cleanup 포인터를 오염시킨다.
3. 코드 실행: 오염된 포인터를 가짜 ngx_pool_cleanup_s로 리다이렉트하고, 풀 파괴 시 system() 호출로 연결한다.
또 하나의 핵심 요소는 워커 크래시를 이용한 ASLR 우회다. 워커가 크래시되면 마스터가 동일한 힙 레이아웃을 가진 새 워커를spawn한다. 공격자는 이를 이용해 무제한으로 크래시를 일으키며 ASLR 우회를 시도할 수 있다.
depthfirst 연구진은 ASLR을 비활성화한 환경에서 인증 없는 RCE에 성공하는 PoC를 공개했다. 완전한 ASLR 우회 기법은 아직 이론적 단계이지만, 시간과 반복으로돌파 가능하다.
함께 발견된 3개의 취약점
depthfirst의 자율 스캔은 총 5개 발견사항을 보고했고, 그 중 4개가 NGINX에 의해 확인됐다.
| CVE | 점수 | 유형 |
|---|---|---|
| CVE-2026-42945 | 9.2 (치명) | 힙 버퍼 오버플로 |
| CVE-2026-42946 | 8.3 (높음) | SCGI/uWSGI 과대 메모리 할당 |
| CVE-2026-40701 | 6.3 (중간) | SSL 모듈 Use-After-Free |
| CVE-2026-42934 | 6.3 (중간) | Charset 모듈 OOB 읽기 |
CVE-2026-42946은 SCGI와 uWSGI 모듈의 상태 불일치로 약 1TB 키 길이가 발생해 워커가 크래시되는 문제다.
영향을 받는 버전과 수정 방법
영향을 받는 제품
| 제품 | 취약 버전 | 수정 버전 |
|---|---|---|
| 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 Gateway Fabric | 1.3.0 ~ 2.5.1 | 수정 브랜치로 이동 |
| NGINX Ingress Controller | 3.5.0 ~ 5.4.1 | 수정 브랜치로 이동 |
F5 BIG-IP, BIG-IQ, Distributed Cloud, Silverline는 영향을 받지 않는다.
즉시 패치
가장 우선적인 조치는 패치 적용이다.
# NGINX Open Source — Ubuntu/Debiansudo apt update && sudo apt install nginx=1.31.0# 또는 소스 빌드wget https://nginx.org/download/nginx-1.31.0.tar.gz./configure && make && sudo make install# NGINX Plus — F5 계정에서 R36 P4 다운로드sudo systemctl restart nginx
패치 적용 후 반드시 워커 프로세스가 재시작되도록 해야 한다. 바이너리만 교체하고 재시작하지 않으면 패치가 적용되지 않는다.
즉각적 패치가 불가능할 경우 — 임시 완화책
패치 배포 시간이 필요한 경우, 이름 없는 캡처를 이름 있는 캡처로 변환하면 취약 코드가 실행되지 않는다.
# 취약한 설정 — 이름 없는 캡처 + ? 포함 치환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;
핵심은 두 가지 조건이 동시에 만족되어야 노출된다.
• rewrite 치환 문자열에 ?가 포함된 경우
• 그다음 줄에 set 지시어로 $1 같은 이름 없는 캡처를 참조하는 경우
둘 중 하나라도 없으면 공격 표면이 형성되지 않는다. 그러나 복잡한 설정에서는 두 조건이 의외로 쉽게 충족되므로, 가장 확실한 방법은 패치 적용이다.
왜 이번 발견이 중요한가
이 버그의 가치가 단순한 CVE 너머에 있다.
첫째, 18년간 탐지되지 않았다. 수동 코드 감사, 퍼저, 정적 분석 등 전통적 방법으로는 찾지 못했던 버그를 자율 취약점 분석 시스템이 6시간 만에 발견했다. AI 기반 취약점 발견이 실전에서 빠르게 현실화되고 있다는 증거다.
둘째, 영향을 받는 범위가 방대하다. NGINX는 전 세계 웹 서버의 약 39~43%를 점유한다. Apache와 함께 인터넷의 기반인 소프트웨어다. 이 소프트웨어에서 인증 없는 RCE가 가능한 취약점이 18년간 존재했다.
셋째, 완화의 착각에 대한 경고다. "ASLR을 켜놨으니 괜찮다"는 말이 많다. 그러나 이 취약점에서는 워커 크래시를 통한 힙 레이아웃 반복 확보가 가능하기 때문에, ASLR이 주는 보호 효과가 크게 약화된다. 침임 깊이 방어 기법은 중요하지만, 취약점 자체를 패치하는 것이 가장 확실하다.
마무리
NGINX Rift는 2026년 가장 중요한 보안 취약점 중 하나다. 18년간 숨겨졌던 치명적 힙 오버플로, 인증 없는 원격 코드 실행 가능성, 전 세계 웹복무기적 3분의 1이 영향받는 규모를 생각하면 긴급한 조치가 필요하다.
개발자가 해야 할 일:
• 사용 중인 NGINX 버전을 확인하고 1.31.0 이상으로 업그레이드
• 즉시 패치가 어려운 경우 이름 없는 캡처 설정 점검
• Nginx Ingress Controller, NGINX Gateway Fabric 등 주변 제품군도 함께 확인
호련망 기반 인프라를 운영하는 모든 개발자와 운영자는 지금 이 취약점에 대한 패치를 가장 먼저 처리해야 한다.
📚 출처
• GeekNews — NGINX Rift: 새로운 NGINX 익스플로잇
• Cyber Kendra — NGINX Rift: An 18-Year-Old Bug
• Depth First — NGINX Rift Achieving NGINX RCE
📚 출처
'자동화&툴 리뷰' 카테고리의 다른 글
| Artifact Keeper — Rust로 만든 오픈소스 범용 아티팩트 레지스트리 완벽 가이드 (0) | 2026.05.17 |
|---|---|
| Mullvad exit IP는 놀라울 정도로 식별 가능함 (0) | 2026.05.17 |
| RustFS - Rust로 만든 S3 호환 분산 객체 스토리지 완벽 가이드 (0) | 2026.05.16 |
| Claude, 프로그래밍 방식 사용을 월간 크레딧 구조로 변경 — 개발자가 반드시 알아야 할 핵심 정리 (0) | 2026.05.15 |
| Sovereign Tech Fund, KDE 소프트웨어 개발에 100만 유로 이상 투자 완벽 가이드 (0) | 2026.05.15 |