Nginx Rift 이해하기: RCE로 이어지는 10년 된 힙 오버플로우

"Nginx Rift" (CVE-2026-42945)의 공개는 인프라 커뮤니티에 큰 파장을 일으켰습니다. 이 취약점은 최근 기능에 의해 도입된 새로운 버그가 아니라, 2008년 버전 0.6.27부터 존재해 온 ngx_http_rewrite_module 내의 힙 버퍼 오버플로우입니다.

Nginx는 전 세계적으로 가장 널리 배포된 웹 서버 중 하나이기 때문에, 인증되지 않은 원격 코드 실행(RCE)을 가능하게 하는 결함은 애플리케이션, PHP 백엔드 또는 기타 서비스를 위한 트래픽을 관리하기 위해 URL 재작성 규칙을 사용하는 모든 조직에 중대한 관심사입니다.

기술적 근본 원인

이 취약점은 전형적인 "2단계(two-pass)" 스크립트 엔진 버그에서 기인합니다. ngx_http_rewrite_module에서 Nginx는 첫 번째 단계에서 길이를 계산하고, 두 번째 단계에서 ngx_escape_uri를 사용하여 실제 복사 단계를 수행합니다.

특정 구성 패턴이 사용될 때—구체적으로 교체 문자열에 물음표(?)를 포함하는 rewrite 지시어와, 그 뒤를 잇는 이름 없는 정규식 캡처 그룹(예: $1 또는 $2)을 참조하는 후속 set, if, 또는 다른 rewrite 지시어가 사용될 때—길이 계산이 URI의 확장을 고려하지 못합니다. 이러한 불일치는 데이터가 실제로 버퍼로 복사될 때 힙 버퍼 오버플로우를 유발합니다.

익스플로잇 체인: 오버플로우에서 RCE까지

공개된 PoC(Proof of Concept)는 이러한 메모리 손상이 어떻게 완전한 RCE로 무기화될 수 있는지를 보여줍니다. 공격 벡터는 다음과 같습니다:

  1. 교차 요청 힙 펜싱(Cross-Request Heap Feng Shui): 공격자는 여러 요청에 걸쳐 힙 레이아웃을 조작하여 대상 객체를 예측 가능한 위치에 배치합니다.
  2. 풀 클린업 포인터 손상(Pool Cleanup Pointer Corruption): 오버플로우를 트리거하여 공격자는 Nginx의 메모리 풀 클린업 메커니즘 내의 포인터를 손상시켜 프로세스의 제어 흐름을 하이재킹할 수 있습니다.

ASLR 논쟁

보안 전문가들 사이에서 중요한 논의 주제는 주소 공간 레이아웃 무작위화(ASLR)의 역할입니다. 제공된 PoC는 시연을 단순화하기 위해 ASLR이 비활성화된 상태를 가정합니다. 그러나 커뮤니티의 보안 전문가들이 언급했듯이, ASLR은 심층 방어(defense-in-depth) 조치이지 완전한 해결책이 아닙니다.

"ASLR은 공격을 더 어렵게 만들기 위한 심층 방어 기술입니다. 거의 모든 경우에 ASLR 우회는 시간과 기술의 문제일 뿐입니다. 두 가지 요구 사항 모두 몇 주마다 LLM 에이전트에 의해 계속해서 낮아지고 있습니다."

ASLR이 완전한 면역력을 제공한다고 가정하는 것은 위험한 오해입니다. 시스템 완화 조치의 현재 상태와 관계없이 근본 원인은 패치되어야 합니다.

완화 및 해결 방법

즉각적인 패치

F5는 Nginx에 대한 패치를 출시했습니다. 사용자는 즉시 다음 버전으로 업데이트해야 합니다:

  • OSS: 1.31.0 및 1.30.1
  • Plus: 공식 F5 권고 사항(K000161019)을 참조하십시오.
  • OpenResty: 1.27 및 1.29 버전에 대한 패치가 출시되었습니다.

구성 워크아라운드

즉각적인 패치가 불가능한 경우, 주요 완화 방법은 rewrite 정의에서 이름 없는 캡처 그룹을 사용하지 않는 것입니다.

취약한 패턴: rewrite ^/old/(.*)$ /new/$1?arg=1 last;

완화된 패턴: $1$2를 이름 있는 캡처(예: $user_id 또는 $section)로 교체하십시오. 이름 있는 캡처는 오버플로우를 트리거하는 rewrite module의 특정 로직 경로를 피할 수 있습니다.

더 넓은 영향

Nginx Rift의 발견은 Nginx 소스 코드를 원클릭 온보딩한 후 보안 분석 도구에 의해 자율적으로 발견되었다는 점에서 특히 주목할 만합니다. 이는 "forever bugs"—거의 20년 동안 눈에 띄지 않게 숨어 있던 취약점—를 찾는 데 있어 자동화된 분석과 AI 지원 발견의 역할이 증가하고 있음을 강조합니다.

나아가, 이 취약점은 C 기반 소프트웨어의 수명에 대한 논의를 불러일으켰습니다. Nginx의 안정성은 찬사를 받지만, 메모리 안전하지 않은 언어의 내재적 위험은 Go (Caddy) 또는 Java (Jetty)와 같은 메모리 안전 언어(memory-safe languages)로 작성된 대안에 대한 관심을 지속적으로 유도하고 있습니다. 비록 해당 언어들도 고유한 특약한 취약점 세트를 가지고 있음에도 불구하고 말입니다.

Sources