
nginx 리라이트 모듈의 CVE-2026-42945 힙 버퍼 오버플로우에 대한 재현 가능한 AI 지원 재발견. 감사 프롬프트, PoC 트리거, ASan 크래시 재현, 방어 연구를 위한 기술 분석을 포함합니다.
이 저장소는 nginx ngx_http_rewrite_module에 대한 재현 가능한 AI 지원 취약점 재발견 실험을 문서화하며, 이후 CVE-2026-42945와 연결되었습니다.
실험은 의도적으로 범위를 좁혔습니다. 취약한 파일인 src/http/ngx_http_script.c가 모델에 직접 제공되어 감사(audit)되었습니다. 이는 AI 시스템이 전체 nginx 코드베이스에서 처음부터 자율적으로 문제를 찾았다는 주장이 아닙니다.
감사된 버그는 nginx rewrite 처리 중 오래된(스테일) 스크립트 엔진 상태로 인해 발생하는 힙 버퍼 오버플로입니다.
높은 수준에서:
?를 포함하는 rewrite 대체 문자열이 e->is_args = 1을 설정합니다.e->is_args가 지워지지 않습니다.set, if 또는 rewrite 표현식에서 $1과 같은 이름 없는 정규식 캡처를 복사할 때, 캡처가 원시(raw)로 복사될 것처럼 대상 버퍼의 크기를 조정할 수 있습니다.e->is_args = 1을 보고 캡처를 URI 이스케이프합니다.로컬 AddressSanitizer 재현은 다음에서 힙 버퍼 오버플로를 확인합니다:
ngx_escape_uri
ngx_http_script_copy_capture_code
ngx_http_rewrite_handler
.
├── README.md
├── LICENSE
├── prompts/
│ ├── audit_prompt.md
│ └── poc_prompt.md
├── poc/
│ ├── trigger.py
│ ├── nginx.conf
│ ├── reproduce.sh
│ └── expected_output.txt
├── docs/
│ ├── technical-analysis.md
│ ├── vulnerability-breakdown.md
│ └── methodology.md
└── screenshots/
└── asan-crash.png
PoC는 AddressSanitizer가 활성화된 취약한 nginx의 로컬 랩 빌드를 위해 설계되었습니다. 127.0.0.1:18080에서 nginx를 시작하고, 조작된 요청을 로컬 서버에 보낸 후 충돌 증거를 출력합니다.
영향을 받는 nginx 소스 트리를 사용하세요. 실험은 clang과 ASan으로 빌드된 nginx 1.30.0에서 검증되었습니다:
./auto/configure \
--prefix=/tmp/nginx-asan-poc \
--with-cc-opt='-O0 -g -fsanitize=address -fno-omit-frame-pointer' \
--with-ld-opt='-fsanitize=address'
make -j"$(getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu)"
이 저장소에서:
NGINX_BIN=/path/to/vulnerable/nginx/objs/nginx ./poc/reproduce.sh
이 저장소가 검증에 사용된 nginx 소스 체크아웃 내부에 직접 배치되면, 스크립트는 자동으로 ../../objs/nginx를 찾습니다.
성공적인 재현은 다음과 유사한 ASan 보고서를 출력합니다:
ERROR: AddressSanitizer: heap-buffer-overflow
WRITE of size 1
#0 ngx_escape_uri ngx_string.c:1687
#1 ngx_http_script_copy_capture_code ngx_http_script.c:1399
#2 ngx_http_rewrite_handler ngx_http_rewrite_module.c:180
poc/expected_output.txt를 참조하세요.

PoC에서 사용하는 nginx 구성은 의도적으로 작습니다:
location / {
rewrite ^(.*) /new?c=1;
set $myvar $1;
return 200 "$myvar\n";
}
첫 번째 rewrite는 대체 문자열에 ?가 포함되어 있으므로 e->is_args를 설정합니다. 이후의 set은 그 오래된 상태가 여전히 있는 동안 $1을 평가합니다.
최소 패치는 정규식 rewrite가 끝날 때 스크립트 엔진의 인수 상태 플래그를 재설정합니다:
e->is_args = 0;
e->quote = 0;
이 실험에 사용된 소스 트리에서 수정은 다음 커밋으로 나타납니다:
524977e7c534e87e5b55739fa74601c9f1102686
Rewrite: fixed escaping and possible buffer overrun
핵심은 패치의 크기가 아니라 복원하는 상태 불변성입니다: 길이 단계와 쓰기 단계는 캡처가 URI 인수로 복사되고 있는지에 대해 일치해야 합니다.
이 실험은 최첨단 코딩 에이전트를 감사 보조 도구로 사용했습니다. 프롬프트는 모델이 src/http/ngx_http_script.c의 메모리 안전 문제에 집중하고, 두 단계(길이/쓰기) 불일치에 세심한 주의를 기울이도록 명시적으로 지시했습니다.
중요한 제한 사항:
정확한 프롬프트는 prompts/audit_prompt.md와 prompts/poc_prompt.md에 포함되어 있습니다.
이 저장소는 방어 연구, 패치 검증 및 재현성을 위해 제공됩니다. PoC는 자신이 통제하는 로컬 랩 인스턴스에서만 실행하십시오.
이 저장소의 문서와 PoC 하네스는 MIT 라이선스에 따라 배포됩니다. nginx 자체는 포함되지 않으며 자체 라이선스에 따릅니다.