
CVE-2026-42945 (NGINX Rift)를 위한 로컬 읽기 전용 스캐너로, 취약한 rewrite 구성을 확인하기 위해 NGINX, OpenResty 및 Tengine 인스턴스를 검사하며 익스플로잇을 실행하거나 서비스를 수정하지 않습니다.
이 리포지토리는 Linux / Windows 서버에서 Nginx, OpenResty, Tengine에 CVE-2026-42945 관련 위험이 있는지 로컬에서 진단하기 위한 두 개의 단독 점검 스크립트를 제공합니다.
스크립트는 읽기 전용 수집과 로컬 판단만 수행하며, 취약점 PoC를 실행하지 않고, 공격 요청을 보내지 않으며, 설정을 수정하지 않고, 서비스를 재시작하지 않으며, 소프트웨어를 업그레이드하지 않습니다.
CVE-2026-42945는 NGINX Rift로도 알려져 있으며, 공개 자료에서는 ngx_http_rewrite_module의 힙 버퍼 오버플로 문제로 설명됩니다. NVD 설명에 따르면, rewrite 지시문과 후속 rewrite / if / set 지시문이 특정 조합을 이루고, 이름 없는 PCRE 캡처 변수(예: $1, $2)와 물음표 ?를 포함하는 대체 문자열이 관련될 때, 공격자는 HTTP 요청을 구성하여 NGINX worker 프로세스에서 힙 버퍼 오버플로를 트리거할 수 있습니다. 이 문제로 worker 프로세스가 재시작될 수 있습니다. ASLR이 비활성화된 특정 조건에서는 코드 실행 위험이 있습니다.
NGINX 공식 보안 권고는 CVE-2026-42945를 ngx_http_rewrite_module의 버퍼 오버플로로 표시했으며, NGINX 오픈 소스에 대한 수정 경계를 다음과 같이 제시했습니다.
| 상태 | NGINX 오픈 소스 버전 |
|---|---|
| 수정됨 | 1.31.0+ / 1.30.1+ |
| 영향 의심 | 0.6.27-1.30.0 |
배포판, 상용 제품, OpenResty, Tengine 또는 자체 빌드의 경우 패치 백포트나 버전 매핑 차이가 있을 수 있습니다. 스크립트는 최대한 증거를 수집하려고 하지만, 최종적으로는 공급업체 공지를 참고하여 수동으로 확인하는 것이 좋습니다.
이 도구는 취약점 활용 검증 도구가 아닌, 로컬 수집 및 정적 설정 점검 도구입니다. 다음 조합에 중점을 둡니다.
rewrite 지시문의 대체 문자열에서 이스케이프되지 않은 $1, $2 등 이름 없는 캡처 변수 사용.rewrite 대체 문자열에 이스케이프되지 않은 ? 포함. \? 형태의 리터럴 물음표는 위험 조건으로 간주하지 않음.rewrite, if 또는 set 지시문 존재.위험 패턴 예시:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?endpoint=$1 last;
set $flag 1;
}
위험은 단일 rewrite 또는 set에서 비롯되는 것이 아니라, 버전, 설정 컨텍스트 및 실행 순서가 함께 트리거 조건을 형성합니다. 적중 후에도 해당 설정이 실제로 활성화된 설정인지, 외부 요청에 의해 도달 가능한지, 배포판에 의해 패치 백포트되었는지 수동 확인을 권장합니다.
| 파일 | 설명 |
|---|---|
check_nginx_linux.sh | Linux 로컬 점검 스크립트 |
check_nginx_windows.ps1 | Windows 로컬 점검 스크립트 |
README.md | 중국어 설명 |
README.en.md | 영문 README |
초기 버전 지원:
rewrite 설정 식별.summary.txt, summary.json 및 원본 증거 디렉터리 출력.초기 버전 미포함:
관리자 권한으로 실행하는 것을 권장합니다.
root 또는 sudo 권한이 있는 계정 사용.비관리자 권한에서도 스크립트는 최대한 수집을 시도합니다. 전체 nginx -T 활성 설정을 내보낼 수 없는 경우 결과에 수동 확인 필요로 표시됩니다.
check_nginx_linux.sh를 서버에 업로드한 후 실행:
chmod +x check_nginx_linux.sh
sudo ./check_nginx_linux.sh
sudo를 사용할 수 없는 경우 직접 실행:
./check_nginx_linux.sh
check_nginx_windows.ps1를 서버에 업로드한 후, "관리자 권한으로 실행"한 PowerShell에서 실행:
powershell -ExecutionPolicy Bypass -File .\check_nginx_windows.ps1
스크립트는 스크립트가 위치한 디렉터리에 결과 디렉터리를 생성합니다. 디렉터리 이름에는 호스트명, 시간, 스크립트 프로세스 ID가 포함되어 동시 실행 시 증거가 섞이지 않도록 합니다.
nginx_check_<호스트명>_<시간>_<프로세스ID>/
summary.txt
summary.json
raw/
host_info.txt
process_info.txt
service_info.txt
package_info.txt
nginx_paths.txt
instances/
instance_01/
nginx_invocation.txt
nginx_version.txt
nginx_build.txt
nginx_config_dump.txt
risky_config_matches.txt
instance_02/
...
| 파일 또는 디렉터리 | 설명 |
|---|---|
summary.txt | 중국어 요약. 수동 확인 및 회신에 적합 |
summary.json | 구조화된 결과. 후속 배치 요약에 편리 |
raw/ | 원시 명령 출력 및 증거 파일 |
raw/instances/instance_XX/ | 각 인스턴스의 독립 버전, 설정 및 위험 증거 |
요약에 기록되는 항목:
| 필드 | 설명 |
|---|---|
인스턴스 수 | 로컬에서 발견되어 개별 점검된 Nginx / OpenResty / Tengine 후보 인스턴스 수 |
설정 크기 | nginx -T로 내보낸 원시 설정 결과 파일 크기 |
스캔 라인 수 | 스크립트가 실제로 스캔한 설정 출력 줄 수 |
위험 설정 적중 수 | 적중된 위험 rewrite 규칙 수 |
증거 요약 | 최대 위험 인스턴스의 증거 미리보기. 전체 증거는 해당 인스턴스 디렉터리 참조 |
Nginx 설정이 많은 경우 스크립트는 콘솔에 전체 설정을 출력하지 않습니다. 전체 활성 설정은 해당 인스턴스 디렉터리의 nginx_config_dump.txt에 저장됩니다. 설정 내보내기 파일이 10MB를 초과하면 스크립트는 계속 자동 스캔하며 raw/ 결과를 참고하여 수동 샘플 점검을 권장합니다.
서버에서 여러 nginx, openresty, tengine 후보 실행 파일이 발견되면 스크립트는 각각 점검하고 인스턴스 상세를 생성합니다.
전체 요약의 결론은 가장 위험한 인스턴스를 기준으로 합니다. 전체 결론은 보수적 우선순위를 따릅니다.
영향 있음 - 위험 설정 있음수동 확인 필요영향 있음 - 위험 설정 없음영향 없음Nginx 미설치여기서 수동 확인 필요는 영향 있음 - 위험 설정 없음보다 높은 순위로, 확인되지 않은 인스턴스가 있어 추가 확인이 필요함을 의미하며, 위험 설정이 확인되었다는 의미는 아닙니다.
| 결론 | 의미 |
|---|---|
Nginx 미설치 | Nginx / OpenResty / Tengine 명령, 프로세스 또는 서비스 발견되지 않음 |
영향 없음 | 명확히 수정된 버전이며 위험 설정 발견되지 않음 |
영향 있음 - 위험 설정 없음 | 버전이 영향을 받을 것으로 의심되지만 위험 rewrite 설정 발견되지 않음 |
영향 있음 - 위험 설정 있음 | 버전이 영향을 받거나 파생 버전 확인 필요, 위험 rewrite 설정 발견됨 |
수동 확인 필요 | 버전 불명, 파생 버전, 설정 수집 실패, 권한 부족 또는 증거 불충분 |
| 제품 | 버전 판단 |
|---|---|
NGINX 1.31.0+ | 수정됨, 스크립트는 수정됨(mainline)으로 표시 |
NGINX 1.30.1+ | 수정됨, 스크립트는 수정됨(stable)으로 표시 |
NGINX 0.6.27-1.30.0 | 영향 의심 |
| OpenResty / Tengine | 버전 및 설정 수집 가능, 버전 영향 관계는 기본적으로 수동 확인 필요 |
배포판의 경우 "버전 번호는 낮지만 패치가 백포트된" 경우가 있을 수 있습니다. 공급업체 패치 증명을 제공할 수 있는 경우 summary.txt 및 패키지 버전 정보를 통해 수동 확인할 수 있습니다.
location, server, if 등의 컨텍스트에서 rewrite / if / set 조합을 확인하세요.?를 포함하는 rewrite 대체 문자열에서 $1, $2 등 이름 없는 캡처 변수를 계속 사용하지 않도록 하세요.nginx -T로 설정을 완전히 내보낼 수 없는 경우 스크립트는 안전하다고 판단하지 않습니다.