NOW Briefing
$request_filename 참조를 제거해야 합니다.
nginx alias·rewrite 힙 버퍼 오버플로우 취약점 (CVE-2026-15176)
■ 개요
nginx는 웹서버이면서 리버스 프록시(클라이언트 요청을 받아 뒤쪽 서버로 전달하는 중계 서버) 역할도 하는 소프트웨어입니다. W3Techs 집계 기준 2026년 10월 17일 현재 전 세계 웹서버 점유율은 30.3%입니다. F5는 2026년 10월 14일 nginx 1.31.7(mainline)과 1.30.6(stable)을 공개하면서 보안 취약점 5건을 함께 수정했습니다. 그중 CVE-2026-15176은 alias 디렉티브를 rewrite와 함께 쓰는 설정에서 힙 버퍼 오버플로우(동적으로 할당한 메모리 영역의 경계를 넘겨 쓰는 오류)를 일으킵니다. alias는 요청 URI를 다른 파일 시스템 경로로 연결하는 설정입니다.
영향 범위는 nginx Open Source 0.1.29~1.30.5와 1.31.0~1.31.6이며, 상용 제품인 NGINX Plus의 R33~R36과 37.x 계열도 포함됩니다. 공격자는 인증 없이 원격 요청만으로 조건을 발동시킬 수 있고, 성공하면 요청을 처리하던 워커 프로세스가 비정상 종료되고 재시작될 수 있습니다. 다만 F5 권고 기준으로 alias를 쓰는 location, URI를 바꾸는 rewrite, 변환된 파일 경로 값을 참조하는 설정이 모두 겹쳐야 합니다. F5는 설정 의존성 때문에 공격 난이도를 높게 평가했지만, 조건을 만족하는 설정에서는 그대로 발동할 수 있습니다.
F5는 ASLR이 적용되지 않았거나 우회된 환경이라면 메모리 손상이 코드 실행으로 이어질 가능성도 제시했습니다. nginx 공식 보안 권고 목록은 이 건의 심각도를 medium으로 분류합니다. 공개 PoC는 확인되지 않았고, CISA의 악용된 취약점 목록(KEV)에도 등재되지 않았습니다. 국내에서는 F5 NGINX의 한국 총판이자 아시아 최초 NGINX 공인 컨설팅 파트너인 ㈜아이티언이 NGINX Plus와 Ingress Controller를 네이버 클라우드·NHN Cloud·KT Cloud·카카오 클라우드 마켓플레이스로 공급하고 있습니다. NHN Cloud 공식 한국어 퀵스타트 문서도 인스턴스 생성 후 웹서버 설치 단계에서 nginx를 표준 예시로 안내합니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-15176 (alias와 rewrite 조합 시 URI를 파일 경로로 변환하는 과정에서 힙 버퍼 오버플로우) |
| CVSS 점수 | • CVSS v3.1 8.1 • CVSS v4.0 9.2 |
| 취약점 유형 | CWE-122, 힙 버퍼 오버플로우 |
| 영향/위험 | • 원격 요청으로 워커 프로세스 비정상 종료 및 재시작 유발 가능 • F5 평가 기준 ASLR 미적용·우회 환경에서 코드 실행 가능성 제기 • 인증 없이 발동 가능, 단 특정 설정 조합이 전제로 필요 • 공개 PoC 및 실제 악용 사례 미확인 |
| 취약 버전 | • nginx Open Source 0.1.29~1.30.5 • nginx Open Source 1.31.0~1.31.6 • NGINX Plus R33~R36 • NGINX Plus 37.0.0~37.0.5.0, 37.1.0~37.1.0.0 |
| 패치 버전 | • nginx 1.31.7 (mainline) • nginx 1.30.6 (stable) • NGINX Plus 37.0.5.1, 37.1.0.1 |
■ 취약점 발생 원리
rewrite 디렉티브가 요청 URI를 바꾼 직후부터 새 location이 선택되기 전까지, 변경된 URI는 현재 적용 중인 location의 접두사와 일치하지 않는 구간이 생깁니다. alias는 location 접두사를 잘라내고 그 자리에 지정된 경로를 붙이는 방식으로 동작하므로, 이 불일치가 경로 계산에 그대로 반영됩니다. nginx는 요청 상태를 담은 구조체의 r->valid_location 플래그로 이 상황을 걸러내는데, 수정 커밋 설명에 따르면 이 플래그는 break 디렉티브나 파라미터를 쓴 경우만 처리합니다. break가 없으면 URI가 바뀐 시점부터 현재 rewrite 디렉티브 집합이 끝날 때까지 검사되지 않는 구간이 남습니다.
이 구간 안에서 URI를 파일 경로로 변환하면, location 접두사가 재작성된 URI보다 길 때 잘라낼 길이가 실제 문자열 길이를 넘어서면서 할당된 버퍼 경계를 넘겨 쓰게 됩니다. 이 변환을 실제로 일으키는 것은 nginx 내장 변수 $request_filename(요청 URI를 디스크상의 파일 경로로 바꾼 값)입니다. F5 권고와 커밋 설명 기준으로 return·set·if·add_header 같은 디렉티브나 log_format의 접근 로그 포맷에서 이 변수를 참조하면 nginx가 경로 변환을 실행합니다. alias, URI를 더 짧게 만드는 rewrite, 이 변수 참조가 한 location에서 모두 맞물릴 때 오버플로우가 성립합니다.
■ 패치 내용과 적용 범위
수정은 nginx 공식 저장소의 커밋 f8a23425(2026년 7월 10일)에서 이뤄졌습니다. 아래 코드는 해당 커밋의 src/http/ngx_http_core_module.c 변경분으로, 경로 변환을 담당하는 ngx_http_map_uri_to_path() 함수의 alias 검사 분기(1987행 부근) 한 줄만 바뀌었습니다.
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index 380ee21b29..30ae6e0ec8 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -1987,7 +1987,7 @@ ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *path,
alias = clcf->alias;
- if (alias && !r->valid_location) {
+ if (alias && (!r->valid_location || r->uri_changed)) {
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
"\"alias\" cannot be used in location \"%V\" "
"where URI was rewritten", &clcf->name);
기존에는 r->valid_location만 검사했기 때문에 break 없이 URI가 바뀐 구간이 검사망을 빠져나갔습니다. 패치는 URI 변경 여부를 나타내는 r->uri_changed 플래그를 조건에 추가해, 재작성된 URI를 alias location에서 파일 경로로 변환하려는 시도 자체를 차단합니다. 이 경로에 걸리면 함수는 ALERT 수준 오류 로그를 남기고 NULL을 반환해 해당 요청을 오류로 종료합니다. F5는 같은 수정을 mainline 1.31.7과 stable 1.30.6에 모두 반영했습니다.
■ 탐지 및 점검
• nginx -v로 구동 중인 버전을 확인하고, 1.30.x 계열은 1.30.6, 1.31.x 계열은 1.31.7보다 낮거나 그 이전 계열이면 영향 대상으로 분류합니다.
• 설정 디렉터리 전체에서 grep -rn "alias" /etc/nginx/를 실행해 alias를 쓰는 location을 추려낸 뒤, 같은 블록이나 상위 블록에 rewrite가 있는지 확인합니다.
• grep -rn "request_filename" /etc/nginx/로 return·set·if·add_header와 log_format에서 이 변수를 참조하는 지점을 찾아, 앞의 alias·rewrite 조건과 겹치는 location이 있는지 대조합니다.
• error_log에서 "alias" cannot be used in location 메시지를 검색합니다. 업그레이드 이후 이 로그가 새로 나타나면 URI가 재작성된 location에서 alias 경로 변환이 차단됐다는 신호이므로, 해당 location의 alias·rewrite·변수 참조 조합을 점검해야 합니다.
• error_log에서 워커 프로세스가 시그널로 종료된 기록(exited on signal)을 조회해, 패치 적용 전 기간에 반복적인 비정상 종료와 재시작이 있었는지 확인합니다.
✅ CHECK
F5 권고 기준으로 앞의 세 조건 중 하나라도 빠지면 이 취약점은 발동하지 않습니다.
반대로 log_format에 $request_filename이 전역으로 들어가 있으면 alias와 rewrite를 함께 쓰는 location마다 변수 참조 조건이 자동으로 충족되므로, 접근 로그 포맷을 가장 먼저 확인해야 합니다.
■ 대응 방안
• nginx를 1.31.7(mainline) 또는 1.30.6(stable) 이상으로 업그레이드합니다. 배포판 패키지를 사용하는 환경은 배포 벤더가 백포트한 패키지 버전에 이 수정이 포함됐는지 확인해야 합니다.
• 즉시 업그레이드가 어려운 경우 F5가 제시한 임시 대응책에 따라 해당 location에서 alias 사용을 중단하거나 $request_filename 참조를 제거합니다.
• NGINX Plus 37.x를 운영하는 조직은 37.0.5.1 또는 37.1.0.1로 업데이트하고, R33~R36을 운영하는 조직은 F5 보안 권고에서 자사 릴리스 트랙에 해당하는 수정 버전을 확인해 업데이트합니다.
• 업그레이드 후에는 alias와 rewrite를 함께 쓰던 location의 응답을 회귀 점검합니다. 패치가 해당 조합의 경로 변환을 오류로 처리하므로, 기존에 정상 응답하던 요청이 오류로 바뀔 수 있습니다.
⚠️ WARN
같은 릴리스에는 HTTP/3 요청 본문 주입(CVE-2026-95101), TLS 세션 티켓 키 교체 시 세션 위조(CVE-2026-97629), SSI와 비동기 파일 입출력(AIO) 조합에서의 해제된 메모리 재사용(use-after-free, CVE-2026-97205), 변수 포함 문자열 평가 시 버퍼 오버플로우(CVE-2026-93479)가 함께 수정됐습니다.
설정 변경으로 CVE-2026-15176만 우회하는 조치는 나머지 네 건을 해결하지 못하므로, 임시 대응책은 업그레이드 전까지의 시간 벌기로만 사용해야 합니다.
[참고 자료]
• nginx 2026 릴리스 뉴스 — 1.31.7 / 1.30.6
• nginx CHANGES — Changes with nginx 1.31.7
• 수정 커밋 f8a23425 — Avoid post-rewrite URI to path mapping with alias
• CVE-2026-15176 공식 레코드 (CNA: F5)
• securityonline — F5의 nginx 메모리 손상 취약점 3건 패치 분석
