
웹 서버가 MadeYouReset(CVE-2025-8671)에 취약한지 확인하는 Python 스크립트 — 서버가 자체 스트림을 재설정하도록 속여 Rapid Reset 완화 조치를 우회하는 HTTP/2 DoS 공격입니다. 비정상적인 WINDOW_UPDATE 프레임을 보내 대상을 프로브하고 서버가 응답하는지 검사합니다.
웹 서버가 CVE-2025-8671(CVSS 7.5 High)로 추적되는 MadeYouReset HTTP/2 서비스 거부(DoS) 취약점에 잠재적으로 취약한지 감지하는 경량 Python 스크립트입니다.
MadeYouReset은 2025년 8월 텔아비브 대학교와 Imperva의 연구원들이 공개한 HTTP/2 DoS 취약점입니다. 널리 사용되는 많은 서버 구현체에서 HTTP/2 스트림 회계(accounting)와 내부 백엔드 처리 간의 불일치를 악용합니다.
이 공격은 의도적으로 잘못된 형식의 HTTP/2 제어 프레임(예: RFC 9113 §6.9.1에 따라 금지된 increment=0이 포함된 WINDOW_UPDATE)을 전송하여 서버 자체가 RST_STREAM 프레임을 발행하도록 강제합니다. 서버는 프로토콜 수준에서 스트림을 닫힌 것으로 처리하면서도 백엔드에서 요청 처리를 계속하므로, 공격자는 클라이언트 측 RST_STREAM을 하나도 보내지 않고도 MAX_CONCURRENT_STREAMS 제한을 우회해 서버 리소스를 고갈시킬 수 있습니다.
이는 이전 Rapid Reset 공격(CVE-2023-44487)에 대해 도입된 완화 조치를 우회하는 방법입니다.
영향을 받는 것으로 알려진 소프트웨어:
| 제품 | CVE |
|---|---|
| Apache Tomcat 9.x / 10.x / 11.x | CVE-2025-48989 |
| Netty < 4.1.124.Final / 4.2.4.Final | CVE-2025-55163 |
| F5 BIG-IP | CVE-2025-54500 |
| IBM WebSphere Application Server Liberty | CVE-2025-36047 |
| Varnish, Fastly, Jetty, SUSE, Wind River | CVE-2025-8671 |
h2를 협상하는 TLS 핸드셰이크를 수행합니다.SETTINGS 프레임을 전송합니다.HEADERS 프레임으로 요청 스트림을 엽니다.WINDOW_UPDATE 프레임(increment=0)을 전송합니다.RST_STREAM 수신(GOAWAY 없음) → 취약할 가능성이 높음.GOAWAY 수신 → 올바른 RFC 동작. 패치되었을 가능성이 높음.이 스크립트는 읽기 전용 수동 프로브를 수행합니다. 서버를 악용하거나 스트레스 테스트하지 않습니다.
git clone https://github.com/ayushghatkar8080/MadeYouReset_Tester.git
cd MadeYouReset_Tester
# No pip install needed — no dependencies
python3 main.py <url> [OPTIONS]
| 플래그 | 기본값 | 설명 |
|---|---|---|
--timeout SECONDS | 8 | 소켓 읽기 타임아웃 |
--no-color | off | ANSI 색상 출력 비활성화 |
# Basic check
python3 main.py https://example.com
# Custom port and longer timeout
python3 main.py https://example.com:8443 --timeout 15
# CI-friendly (no colour)
python3 main.py https://example.com --no-color
| 코드 | 의미 |
|---|---|
0 | 취약하지 않음 — 서버가 GOAWAY로 응답함(올바른 RFC 동작) |
1 | 취약할 가능성이 높음 — 서버가 스트림에서 RST_STREAM을 보냈지만 GOAWAY는 없음 |
2 | 판정 불가 — HTTP/2 없음, 연결 오류 또는 모호한 응답 |
종료 코드 덕분에 CI 파이프라인이나 자동화 스크립트에 쉽게 통합할 수 있습니다.
========================================================
MadeYouReset (CVE-2025-8671) Checker
========================================================
Target : https://vulnerable-server.example.com
Host : vulnerable-server.example.com:443
Path : /
Timeout : 8.0s
────────────────────────────────────────────────────────
[*] Connecting to vulnerable-server.example.com:443 ...
✓ TCP connection established
[*] Performing TLS handshake (ALPN: h2, http/1.1) ...
→ Negotiated protocol : h2
✓ HTTP/2 (h2) negotiated via ALPN
[*] Sending HTTP/2 client preface ...
✓ Preface + SETTINGS sent
[*] Waiting for server SETTINGS ...
← Frame type=0x04 stream=0 length=18
✓ Server SETTINGS received
✓ Sent SETTINGS ACK
[*] Opening HTTP/2 stream 1 (HEADERS frame) ...
✓ HEADERS sent on stream 1
[*] Sending malformed WINDOW_UPDATE (increment=0) on stream 1 ...
RFC 9113 §6.9.1: increment=0 is a stream-level FLOW_CONTROL_ERROR
✓ Malformed WINDOW_UPDATE sent
[*] Analysing server response (timeout=8.0s) ...
← RST_STREAM stream=1 error_code=0x00000003
────────────────────────────────────────────────────────
RESULT
────────────────────────────────────────────────────────
[LIKELY VULNERABLE]
Server responded with RST_STREAM on stream 1
(error_code=0x00000003) but did NOT send GOAWAY.
Recommended actions:
• Patch: Apache Tomcat ≥10.1.44/11.0.10/9.0.108,
Netty ≥4.1.124.Final / 4.2.4.Final,
and other vendor advisories for CVE-2025-8671.
• Interim: disable HTTP/2 or deploy a WAF/proxy that
validates HTTP/2 frames before forwarding.
========================================================
| 조치 | 상세 |
|---|---|
| 패치 | HTTP/2 스택에 대한 최신 공급업체 업데이트 적용(위 표 참조) |
| HTTP/2 비활성화 | 임시 완화 조치로 HTTP/1.1로 대체 |
| WAF / 프록시 | 에지에서 HTTP/2 프레임을 검증하는 리버스 프록시 또는 WAF 배포 |
| 속도 제한 | 클라이언트별 연결 상한 및 RST_STREAM 속도 제한 적용 |
이 도구는 승인된 보안 테스트 및 연구 목적으로만 사용해야 합니다.
소유하지 않았거나 명시적인 서면 허가를 받지 않은 시스템에 대해 이 스크립트를 실행하지 마십시오.
저자는 오용에 대해 어떠한 책임도 지지 않습니다.