
가벼운 HTTP/2 프로브로, 승인된 환경에서 CVE-2019-9511 (Data Dribble) 및 CVE-2019-9513 (Priority Churn) DoS 벡터를 제어된 방식으로 검증합니다.
CVE-2019-9511 및 CVE-2019-9513 CVE와 관련된 동작을 제어된 방식으로 검증하기 위한 스크립트 저장소입니다. 두 CVE 모두 HTTP/2 구현에서 서비스 거부(DoS) 벡터와 관련되어 있습니다.
스크립트는 승인된 환경에서 기술 검증을 지원하기 위해 만들어졌으며, 서버가 HTTP/2를 협상하고 Data Dribble 및 Priority Churn과 관련된 특정 패턴에 응답하는지 관찰할 수 있도록 합니다. 서비스 거부 공격을 수행하지 않습니다.
목표는 낮은 요청 볼륨으로 경량화되고 안전한 방식으로 벡터를 증명하며, 환경을 중단시키지 않는 것입니다.
| CVE | 이름 | 스크립트 | 설명 |
|---|---|---|---|
CVE-2019-9511 | HTTP/2 Data Dribble | data_dribble_probe.py | 제어된 방식으로 소량의 데이터를 해제하여 HTTP/2 흐름 제어 동작을 검증합니다. |
CVE-2019-9513 | HTTP/2 Priority Churn / Resource Loop | priority_churn_probe.py | 낮은 강도로 PRIORITY 프레임 처리 동작을 검증합니다. |
CVE-2019-9511, 일명 HTTP/2 Data Dribble은 흐름 창 조작 및 점진적 데이터 전달을 효율적으로 처리하지 못하는 일부 HTTP/2 구현에 영향을 미칩니다.
이 시나리오에서 공격자는 서버에 데이터를 요청하고 흐름 제어를 조작하여 응답이 열린 상태로 유지되도록 하고 1바이트 패킷과 같은 작은 블록으로 전달되도록 할 수 있습니다. 구현에 따라 이 동작은 과도한 CPU, 메모리 또는 연결 리소스 소비를 유발하여 서비스 거부 위험을 초래할 수 있습니다.
이 저장소에서 관련 스크립트는 다음과 같습니다:
data_dribble_probe.py
스크립트의 목적은 공격적인 부하를 생성하거나 중단을 유발하지 않고 경량 방식으로 동작을 검증하는 것입니다.
참고 자료:
CVE-2019-9513, 일명 HTTP/2 Priority Churn 또는 Resource Loop은 스트림의 우선순위 트리에 대한 지속적인 변경을 많은 비용을 들여 처리하는 일부 HTTP/2 구현에 영향을 미칩니다.
이 시나리오에서 공격자는 여러 스트림을 생성하고 반복적으로 우선순위를 변경하여 우선순위 트리에 변동을 일으킬 수 있습니다. 구현에 따라 이 동작은 과도한 CPU 소비를 유발하여 서비스 거부로 이어질 수 있습니다.
이 저장소에서 관련 스크립트는 다음과 같습니다:
priority_churn_probe.py
스크립트의 목적은 DoS 공격을 수행하지 않고 낮은 강도로 서버가 PRIORITY 프레임을 수락하고 처리하는지 검증하는 것입니다.
참고 자료:
CVE-2019-9511 및 CVE-2019-9513 CVE는 nginx, Apache, Tomcat과 같은 단일 특정 웹 서버 버전에만 국한되지 않습니다.
이 CVE는 다양한 제품, 라이브러리, 프록시, 로드밸런서 및 서버의 특정 HTTP/2 구현에 영향을 미칩니다. 따라서 분석된 환경에서 어떤 구성 요소가 HTTP/2를 협상하고 처리하는지 고려하여 검증을 수행해야 합니다.
관련될 수 있는 구성 요소의 예:
nginx
Apache HTTP Server
Envoy
HAProxy
Tomcat
Jetty
Node.js
Go net/http2
nghttp2
CDN
WAF
Load Balancer
Ingress Controller Kubernetes
첫 번째 기술적 기준은 서비스가 ALPN을 통해 HTTP/2를 협상하는지 확인하는 것입니다. 서비스가 h2를 협상하지 않으면 이 스크립트는 적용되지 않습니다.
버전별 취약점 확인은 식별된 구성 요소 제조업체의 공식 권고를 기반으로 이루어져야 합니다.
스크립트를 실행하기 전에 대상이 ALPN을 통해 HTTP/2를 협상하는지 확인하십시오.
명령어에는 https:// 없이 도메인만 사용하십시오.
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
플레이스홀더와 함께 사용할 수도 있습니다:
openssl s_client -alpn h2 -connect <HOST>:443 </dev/null 2>/dev/null | grep -i "ALPN"
예상 출력:
ALPN protocol: h2
출력에 h2가 표시되면 서비스가 HTTP/2를 협상하므로 스크립트를 적용할 수 있습니다.
반환값이 없거나 협상된 프로토콜이 http/1.1과 같이 다른 경우 해당 엔드포인트에는 스크립트를 적용할 수 없습니다.
| 스크립트 | 관련 CVE | 목적 | 사용 시기 |
|---|---|---|---|
data_dribble_probe.py | CVE-2019-9511 | 창 제어를 사용하여 소량의 데이터 블록을 해제하는 Data Dribble 관련 동작 검증 | 서버가 HTTP/2를 지원하고 축소된 창으로 DATA 프레임 전달 동작을 확인할 필요가 있을 때 사용 |
priority_churn_probe.py | CVE-2019-9513 | 낮은 강도로 PRIORITY 프레임을 사용하여 Priority Churn 관련 동작 검증 | 서버가 HTTP/2를 지원하고 스트림 우선순위 변경을 처리하는지 확인할 필요가 있을 때 사용 |
스크립트 사용의 가장 논리적인 순서는 다음과 같습니다:
1. Pré-validação HTTP/2 com openssl
↓
2. priority_churn_probe.py
↓
3. data_dribble_probe.py
먼저 openssl 명령어를 사용하여 대상이 HTTP/2를 협상하는지 확인합니다. 그런 다음 priority_churn_probe.py를 사용하여 서버가 우선순위 프레임을 수락하고 처리하는지 검증합니다. 마지막으로 data_dribble_probe.py를 사용하여 축소된 흐름 창에서 서버가 제어된 방식으로 소량의 데이터를 해제하는 동작을 관찰합니다.
두 스크립트 모두 경량 프로브입니다. 이들은 중단을 유발하는 것이 아니라 관찰된 동작에 대한 기술적 증거를 생성하는 것을 목표로 합니다.
priority_churn_probe.py는 HTTP/2 Priority Churn으로 알려진 CVE-2019-9513 관련 동작 검증을 위한 경량 PoC입니다.
스크립트는 TLS를 통해 HTTP/2 연결을 설정하고, 작은 HTTP 스트림을 열고, PRIORITY 프레임을 통해 우선순위 변경을 전송합니다. 그런 다음 이러한 프레임 전송 전후의 지연 시간을 측정하여 처리에 변화가 있는지 관찰합니다.
PING을 사용하여 초기 지연 시간 측정;PRIORITY 프레임 전송;공격적인 DoS 테스트를 수행하지 않고 Priority Churn 벡터와 관련된 우선순위 프레임을 서버가 수락하고 처리하는지 검증해야 할 때 이 스크립트를 사용하십시오.
이 스크립트는 펜테스트, HTTP/2 노출 분석, 취약하거나 잠재적으로 민감한 동작의 기술적 증명에서 제어된 검증에 적합합니다.
스크립트는 명령줄 인수를 통해 값을 받습니다:
--host
--port
--paths
--shuffles
| 매개변수 | 설명 |
|---|---|
--host | 승인된 대상의 FQDN. https://를 포함하지 마십시오. |
--port | HTTP/2 서비스를 사용할 수 있는 TLS 포트. 기본값: 443. |
--paths | HTTP/2 스트림을 열기 위한 간단한 경로 목록. |
--shuffles | 우선순위 변경 주기 수. 안전한 테스트를 위해 낮게 유지. |
가벼우며 공개적이고 영향이 적은 다음 경로를 사용하십시오:
/
/robots.txt
/favicon.ico
/health
/login
무거운 작업, 복잡한 쿼리, 보고서 생성, 업로드, 고급 검색 또는 백엔드에 부하를 발생시키는 기능을 실행하는 경로는 피하십시오.
python3 priority_churn_probe.py --host exemplo.com.br --port 443 --paths / /robots.txt /favicon.ico --shuffles 10
[OK] PING antes: 45.20 ms; após churn: 52.80 ms; shuffles=10
Sinal 9513: PRIORITY frames aceitos e processados; aumento sutil pós-churn evidencia o vetor (sem DoS).
스크립트가 HTTP/2를 협상하고, 스트림을 열고, PRIORITY 프레임을 전송할 수 있다면 서버가 이러한 유형의 동작을 처리한다는 것을 나타냅니다.
변동 이후의 미세한 지연 시간 증가는 벡터가 존재한다는 기술적 증거로 사용될 수 있지만, 그 자체만으로 심각한 영향의 증거로 해석되어서는 안 됩니다. 최종 분류는 컨텍스트, 서버 버전, 아키텍처, 완화 조치, WAF/CDN 및 HTTP/2 구성에 따라 달라집니다.
data_dribble_probe.py는 HTTP/2 Data Dribble으로 알려진 CVE-2019-9511 관련 동작 검증을 위한 경량 PoC입니다.
스크립트는 TLS를 통해 HTTP/2 연결을 설정하고, 단일 스트림을 열고, 흐름 제어 창을 조작하여 소량의 데이터를 해제함으로써 DATA 프레임의 점진적 전달 동작을 시뮬레이션합니다.
공격적인 부하를 생성하지 않고 Data Dribble 벡터와 관련된 축소된 흐름 제어 패턴에 서버가 응답하는지 검증해야 할 때 이 스크립트를 사용하십시오.
이 스크립트는 특히 자동화된 도구가 가능한 노출을 지적하고 운영 위험을 낮추어 수동으로 검증해야 할 때 제어된 기술적 증명에 적합합니다.
스크립트는 명령줄 인수를 통해 값을 받습니다:
--host
--path
--port
--bytes
| 매개변수 | 설명 |
|---|---|
--host | 승인된 대상의 FQDN. https://를 포함하지 마십시오. |
--path | 테스트에서 요청할 경로. |
--port | HTTP/2 서비스를 사용할 수 있는 TLS 포트. 기본값: 443. |
--bytes | 테스트 중 해제된 총 바이트 수. 안전한 검증을 위해 낮게 유지. |
서버에 간단하고 정적이거나 비용이 낮은 다음 경로를 사용하십시오:
/
/robots.txt
/favicon.ico
/health
/login
데이터베이스 조회, 무거운 인증, 비동기 처리, 문서 생성 또는 내부 시스템 호출을 수행하는 엔드포인트는 피하십시오.
python3 data_dribble_probe.py --host exemplo.com.br --path / --port 443 --bytes 12
[OK] HTTP/2 negociado; DATA frames recebidos: 12; bytes liberados: 12; tempo(ms): 1450
Sinal 9511: múltiplos DATA minúsculos entregues sob janela=1 (prova do caminho 'dribble' sem stress).
스크립트가 HTTP/2를 협상하고 흐름 창이 해제됨에 따라 작은 DATA 프레임을 수신하면 서버가 이 흐름 제어 패턴을 처리한다는 것을 나타냅니다.
이 동작은 벡터의 기술적 증거로 사용될 수 있지만, 심각도는 사용된 서버, 버전, 연결 제한, 로드밸런서, CDN, WAF, 타임아웃 및 남용 방지 조치와 같은 실제 환경 컨텍스트를 고려해야 합니다.
스크립트는 Python 3 및 h2 라이브러리가 필요합니다.
python3
pip
h2
ssl
socket
argparse
ssl, socket, time, argparse, select 라이브러리는 Python 표준 라이브러리의 일부입니다.
주요 외부 종속성은 다음과 같습니다:
h2
직접 설치:
python3 -m pip install h2
가상 환경을 사용한 설치:
python3 -m venv venv
source venv/bin/activate
pip install h2
설치 확인:
python3 -c "import h2; print('h2 instalado com sucesso')"
스크립트는 ALPN을 통한 HTTP/2 협상에 의존합니다.
실행 전에 서버가 HTTP/2를 지원하는지 확인하십시오:
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
예상 출력:
ALPN protocol: h2
서버가 h2를 협상하지 않으면 스크립트를 적용할 수 없습니다.
--host 매개변수에 FQDN만 사용