
CVE-2026-42945 (NGINX Rift)에 대한 탐지 전용 스캐너, ngx_http_rewrite_module의 힙 오버플로우. 버전 탐지 + nginx.conf 패턴 분석. Python 3 표준 라이브러리 전용, 네트워크 호출 없음.
| 확인 | 방법 |
|---|
| 버전 | nginx -V, dpkg/rpm/apk, Dockerfile/compose 이미지 태그 |
| Config 패턴 | nginx.conf 및 모든 include된 파일의 중괄호 인식 파싱 |
| 에디션 | 취약 버전 | 수정 버전 |
|---|---|---|
| NGINX OSS | 0.6.27 – 1.30.1 | 1.31.0+ (또는 1.30.1 패치 적용) |
| NGINX Plus | R32 before R32P6 | R32P6+ |
| NGINX Plus | R36 before R36P4 | R36P4+ |
| NGINX Plus | R37+ | 영향 없음 |
1.30.1 참고 사항: 패치된 1.30.1 안정 빌드는 취약 버전과 동일한 버전 문자열을 보고하므로, 스캐너는 모든 1.30.1을
POTENTIALLY_VULNERABLE(종료 코드 1, 보수적)로 분류합니다. 패키지 변경 로그/어드바이저리 백포트를 확인하여 패치가 적용되었는지 확인하세요.
다음 세 가지 조건이 모두 충족되면 범위 블록이 플래그됩니다:
rewrite, if, 또는 set 지시어가 이름 없는 PCRE 캡처 참조($1–$9, 중괄호 형태 ${1}–${9} 포함)를 사용합니다.? 문자가 포함됩니다. (rewrite/set의 경우 정규식 패턴 인자는 제외 — 그곳의 ?는 PCRE 수량자입니다. if 조건은 보수적으로 스캔됩니다.)rewrite/if/set 지시어가 뒤따릅니다 (include는 포함하는 범위에 삽입되므로, include 경계를 넘는 쌍도 감지됩니다).# Clone and run
git clone https://github.com/simota/nginx-rift-scanner.git
cd nginx-rift-scanner
# Scan local nginx (binary in PATH, config at /etc/nginx/nginx.conf)
python3 scripts/scan_nginx_rift.py
# Custom paths
python3 scripts/scan_nginx_rift.py \
--nginx-binary /usr/sbin/nginx \
--config /etc/nginx/nginx.conf \
--prefix /etc/nginx \
--scan-dir /app
# JSON output (CI / SIEM)
python3 scripts/scan_nginx_rift.py --json
# Validate with included fixtures
python3 scripts/scan_nginx_rift.py --config fixtures/vulnerable.nginx.conf
python3 scripts/scan_nginx_rift.py --config fixtures/safe.nginx.conf
종료 코드: 0 = 이상 없음, 1 = 취약 / 잠재적 취약 버전 또는 설정 패턴 플래그됨.
| 플래그 | 기본값 | 설명 |
|---|---|---|
--nginx-binary PATH | nginx | nginx 실행 파일 경로 |
--config PATH | /etc/nginx/nginx.conf | 스캔할 루트 nginx 설정 파일 |
--prefix PATH | --config의 디렉토리 | 상대 include 경로를 해석하는 데 사용되는 nginx 설정 접두사 (nginx는 포함 파일의 디렉토리가 아닌 접두사 기준으로 해석) |
--scan-dir PATH | . | Dockerfile/compose 파일을 검색할 디렉토리 |
--json | — | JSON 보고서를 stdout으로 출력 |
업그레이드 (권장):
대체 방법 — ?도 포함하는 모든 rewrite/if/set 지시어에서 이름 없는 캡처를 이름 있는 캡처로 대체하세요:
# Vulnerable
rewrite ^/api/(\w+)$ /new-api?path=$1 last;
# Safe
rewrite ^/api/(?<action>\w+)$ /new-api?path=$action last;
설정 결과는 휴리스틱 기반입니다. 플래그된 지시어가 반드시 악용 가능성을 보장하지는 않습니다. ?가 URI 구성 경로에 있지 않을 수도 있고, 캡처 참조가 오버플로우를 일으키는 할당과 상호작용하지 않을 수도 있습니다. 모든 결과는 해결 우선순위를 정하기 전에 사람이 검토해야 합니다.
nginx 바이너리 (선택 사항 — 없으면 버전 확인 건너뜀)| 파일 | 예상 결과 |
|---|---|
fixtures/vulnerable.nginx.conf | 3개의 설정 결과, 종료 코드 1 |
fixtures/safe.nginx.conf | 0개의 설정 결과, 종료 코드 0 |
python3 -m unittest discover -s tests -v