← back
CVE-2023-44487highunder attackCWE-400

CVE-2023-44487

98Vexday Risk Score

Prioritize patching. It under exploitation confirmed by CISA and has a public proof of concept.

ssvc Actcvss 7.5epss 100%
from disclosure to weapon0 days
Published on NVDOct 10
1st PoCOct 10
CISA KEVOct 10
exploitation probability
100%top 1% of all CVEs
observed exploitation
yesCISA + VulnCheck
51 public exploit(s)
Action required by CISAfederal deadline: 2023-10-31

Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.

Summary

Rapid Reset é uma falha de design no protocolo HTTP/2 (CWE-400, consumo descontrolado de recursos) que permite negação de serviço explorando a forma como o protocolo trata cancelamento de streams via RST_STREAM. Não é uma falha de um produto específico: afeta praticamente toda implementação de servidor, proxy ou biblioteca HTTP/2 que não limite a taxa de abertura/cancelamento de streams por conexão. A CVE ganhou peso real porque foi usada em ataques DDoS de escala recorde entre agosto e outubro de 2023 contra Cloudflare, Google e AWS, antes mesmo da divulgação pública.

Technical detail

No HTTP/2 multiplexado, um cliente abre um stream enviando um frame HEADERS com a requisição e pode cancelá-lo unilateralmente a qualquer momento enviando RST_STREAM, sem coordenação com o servidor. O protocolo assume que o cancelamento é imediato e não impõe custo ao cliente por isso — mas o servidor, ao receber o HEADERS, já alocou estrutura de stream, fez parsing de headers (com decompressão HPACK), roteou a URL para um recurso e, em topologias de proxy reverso, muitas vezes já encaminhou a requisição ao backend antes de processar o RST_STREAM.

O ataque consiste em abrir um número muito grande de streams em uma única conexão TCP e cancelar cada um imediatamente após enviá-lo, sem esperar resposta. Como o cliente nunca deixa um stream aberto por muito tempo, ele nunca atinge o limite de streams concorrentes (SETTINGS_MAX_CONCURRENT_STREAMS) que normalmente restringe o abuso de HTTP/2. Isso rompe a defesa histórica contra flood de streams: o volume de requisições processadas por conexão deixa de depender do round-trip time e passa a depender só da largura de banda disponível no cliente.

O resultado é uma assimetria de custo brutal: o atacante paga quase nada para enviar HEADERS+RST_STREAM, enquanto o servidor paga o custo completo de alocação, parsing e roteamento para cada requisição cancelada. Em servidores com poucas conexões concorrentes é possível gerar um volume de "requisições por segundo" efetivas muito acima do que a infraestrutura foi dimensionada para tratar, sem nunca completar uma requisição de fato.

O CWE aplicável é CWE-400 (Uncontrolled Resource Consumption). Não há um único ponto de código vulnerável: cada implementação de HTTP/2 (Netty, Tomcat, Jetty, nghttp2, swift-nio-http2, golang.org/x/net, akka-http, H2O, Envoy, HAProxy, gRPC, hyper, entre outras) precisou de correção própria, porque a lacuna está na ausência de limite de taxa para reset de streams por conexão, não em uma implementação incorreta de um RFC.

How it’s exploited

O vetor é rede pura: qualquer cliente TCP capaz de estabelecer conexões HTTP/2 pode disparar o ataque, sem autenticação, sem interação do usuário e sem pré-condição de configuração no lado do servidor — basta que o serviço aceite HTTP/2. A complexidade de execução é baixa; existem PoCs públicas (por exemplo o gerador de tráfego usado para reproduzir o comportamento, referenciado nos advisories) que abrem e resetam streams em loop.

Na prática documentada, os operadores de CDN e provedores de nuvem relataram exploração massiva entre agosto e outubro de 2023, com picos de requisições por segundo muito acima de qualquer DDoS de camada 7 registrado até então (a Cloudflare descreveu ataques na ordem de centenas de milhões de requisições por segundo usando botnets relativamente modestos em número de máquinas, justamente pela eficiência da técnica). A CISA confirmou exploração ativa no mundo real, o que motivou a inclusão no catálogo KEV.

O resultado final do ataque é indisponibilidade do serviço — esgotamento de threads, conexões de worker, memória ou CPU do servidor/proxy, ou saturação de backend por requisições encaminhadas antes do cancelamento chegar — sem qualquer comprometimento de confidencialidade ou integridade (por isso C:N/I:N no vetor CVSS, com impacto concentrado em A:H).

Versions

Affected
Não há uma faixa única — a vulnerabilidade é de design de protocolo (HTTP/2) e afeta múltiplas implementações independentes, cada uma com sua própria faixa vulnerável. Exemplos documentados: golang.org/x/net < 0.17.0; nghttp2 < 1.57.0; swift-nio-http2 < 1.28.0; akka-http-core < 10.5.3 (branches 2.12/2.13) e <= 10.1.15 (branch 2.11, sem correção); Apache Tomcat 8.5.x < 8.5.94, 9.0.x < 9.0.81, 10.1.x < 10.1.14, 11.0.0-M1 a < 11.0.0-M12; Eclipse Jetty 9.3.x/9.4.x < 9.4.53, 10.0.x < 10.0.17, 11.0.x < 11.0.17, 12.0.x < 12.0.2. Outras implementações afetadas (Netty, Envoy, HAProxy, gRPC-go, hyper, Node.js, .NET, Caddy, H2O, proxygen, Traffic Server) têm faixas próprias registradas em seus respectivos advisories.
Fixed in
Varia por projeto — não há versão de correção única. Confirmadas nas fontes: golang.org/x/net 0.17.0; nghttp2 1.57.0; swift-nio-http2 1.28.0; akka-http-core 10.5.3; Apache Tomcat 8.5.94 / 9.0.81 / 10.1.14 / 11.0.0-M12; Eclipse Jetty 9.4.53 / 10.0.17 / 11.0.17 / 12.0.2. Para os demais componentes (Netty, Envoy, HAProxy, gRPC, hyper, Node.js, .NET, Caddy, H2O, proxygen, Traffic Server, nginx), consultar o advisory específico do respectivo projeto para a versão exata corrigida.

How to protect

Não existe um único patch de fornecedor: a correção precisa ser aplicada implementação por implementação, e a lista de versões corrigidas varia por projeto. Entre as citadas nos advisories: golang.org/x/net corrigido em 0.17.0; nghttp2 corrigido em 1.57.0; swift-nio-http2 em 1.28.0; akka-http-core em 10.5.3 (ramos 2.12/2.13) — o ramo 2.11 (<=10.1.15) não recebeu correção; Apache Tomcat em 8.5.94, 9.0.81, 10.1.14 e 11.0.0-M12; Eclipse Jetty em 9.4.53, 10.0.17, 11.0.17 (módulos http2) e 12.0.2 (módulo jetty-http2). Outros projetos afetados incluem Netty, Envoy, HAProxy, gRPC-go, hyper, Node.js, .NET/ASP.NET Core, Caddy, Traffic Server, H2O, proxygen e Tengine, cada um com seu próprio ciclo de release — checar o advisory específico do stack em uso é obrigatório, já que a faixa de versão vulnerável e a corrigida não são as mesmas entre projetos.

Quando atualizar não é viável de imediato, o paliativo real é limitar a taxa de reset de streams por conexão (janela deslizante de RST_STREAM, como implementado no swift-nio-http2 1.28) ou derrubar a conexão de clientes que excedem um número razoável de streams abertos/cancelados por segundo — algumas implementações expõem isso via callback (nghttp2_on_frame_recv_callback, contando RST_STREAM) ou via configuração de limite de conexões HTTP/2 e goaway forçado. Reduzir MAX_CONCURRENT_STREAMS não mitiga o ataque, porque o Rapid Reset especificamente contorna esse limite ao nunca deixar streams simultaneamente abertos. Desabilitar HTTP/2 e forçar HTTP/1.1 remove a exposição por completo, ao custo de multiplexação e performance — é mitigação funcional, mas não é solução, apenas troca de superfície.

O que não funciona: rate limiting apenas por número de conexões TCP ou por requisições HTTP completas não pega o ataque, porque as requisições nunca completam — o controle precisa olhar para frames RST_STREAM e HEADERS dentro da conexão HTTP/2, não para requisições HTTP terminadas nos logs de acesso tradicionais.

How to detect

O sinal característico é o padrão HEADERS seguido imediatamente de RST_STREAM, repetido em alto volume dentro de uma mesma conexão TCP/HTTP2 — um número de streams abertos-e-cancelados por segundo muito acima do padrão de navegação humana ou de clientes legítimos. Ferramentas com telemetria de frame HTTP/2 (proxies, WAFs com inspeção de protocolo, ou logging customizado de RST_STREAM via callback da biblioteca HTTP/2) conseguem captar isso; logs de acesso HTTP tradicionais não mostram nada de anormal, porque as requisições nunca completam e frequentemente nem aparecem no log de acesso do servidor de aplicação.

Em nível de rede, indicadores indiretos incluem picos de CPU/memória do processo servidor sem aumento correspondente de requisições completadas nos logs, aumento de conexões HTTP/2 de curta duração com contagem de streams por conexão anormalmente alta, e alertas de rate limiting de conexão disparando repetidamente para os mesmos IPs de origem — mas sem visibilidade a nível de frame HTTP/2, a detecção fica limitada a sintomas de esgotamento de recursos, não à causa raiz.

Researched and written with AI from the vendor advisory and public analysis, with the sources above. Always confirm the fixed version in the official advisory before acting.
The HTTP/2 protocol allows a denial of service (server resource consumption) because request cancellation can reset many streams quickly, as exploited in the wild in August through October 2023.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Affected products
n/a · n/a
public PoCs found51
exploitdbwww.exploit-db.com/exploits/52426unverifiedgithubgithub.com/bcdannyboy/CVE-2023-44487246githubgithub.com/secengjeff/rapidresetclient76githubgithub.com/Appsynergy-io/CVE-2023-4448756githubgithub.com/studiogangster/CVE-2023-4448722githubgithub.com/nxenon/cve-2023-4448715githubgithub.com/threatlabindonesia/CVE-2023-44487-HTTP-2-Rapid-Reset-Exploit-PoC9githubgithub.com/ndrscodes/http2-rst-stream-attacker6githubgithub.com/moften/CVE-2023-44487-HTTP-2-Rapid-Reset-Attack2githubgithub.com/ReToCode/golang-CVE-2023-444872githubgithub.com/tpirate/cve-2023-44487-POC2githubgithub.com/aulauniversal/CVE-2023-444871githubgithub.com/zanks08/cve-2023-44487-demo1githubgithub.com/tahaXafous/CVE-2023-44487-dos1githubgithub.com/CerberusMrXi/CVE-2023-44487-HTTP2-DoS-Rapid-Reset-Exploit1githubgithub.com/Hirokiii/CVE-2023-444870githubgithub.com/madhantr0/http2-security-lab0githubgithub.com/ReGeLePuMa/HTTP-2-Rapid-Reset-DDos0githubgithub.com/madhusudhan-in/CVE_2023_44487-Rapid_Reset0githubgithub.com/BMG-Black-Magic/CVE-2023-444870githubgithub.com/sn130hk/CVE-2023-444870githubgithub.com/ByteHackr/CVE-2023-444870githubgithub.com/pabloec20/rapidreset0githubgithub.com/TYuan0816/cve-2023-444870githubgithub.com/sigridou/CVE-2023-44487-0githubgithub.com/sastraadiwiguna-purpleeliteteaming/DDoS-Purple-Teaming-Offensive-Multi-Vector-7-Tier-Defensive-Holistic-Blueprint-0githubgithub.com/TLevente20/HTTP-2-RapidReset-CVE-2023-44487-Testlab0vulncheckvulncheck.com/xdb/12f36ea6cd3eunverifiedvulncheckvulncheck.com/xdb/95898a14699aunverifiedvulncheckvulncheck.com/xdb/2a1d7187487eunverifiedvulncheckvulncheck.com/xdb/a64a9ab88fd5unverifiedvulncheckvulncheck.com/xdb/6dd9a135b0d8unverifiedvulncheckvulncheck.com/xdb/54af2e2a4404unverifiedvulncheckvulncheck.com/xdb/0f9d4f2a05f8unverifiedvulncheckvulncheck.com/xdb/f0fe97192105unverifiedvulncheckvulncheck.com/xdb/de08f4feae4cunverifiedvulncheckvulncheck.com/xdb/1a4725458b4aunverifiedvulncheckvulncheck.com/xdb/34690740d2d3unverifiedvulncheckvulncheck.com/xdb/f5782b81dab1unverifiedvulncheckvulncheck.com/xdb/b3d01bf4f362unverifiedvulncheckvulncheck.com/xdb/c3bd71694fc8unverifiedvulncheckvulncheck.com/xdb/f2040c1e3da3unverifiedvulncheckvulncheck.com/xdb/9ae3b81b8bd9unverifiedvulncheckvulncheck.com/xdb/5331b5b1af5aunverifiedvulncheckvulncheck.com/xdb/dcaf0e10df00unverifiedvulncheckvulncheck.com/xdb/ad0b2af920fdunverifiedvulncheckvulncheck.com/xdb/b81499235b44unverifiedvulncheckvulncheck.com/xdb/8fa92d2789bdunverifiedvulncheckvulncheck.com/xdb/9fffe4fac461unverifiedvulncheckvulncheck.com/xdb/1a0aa0f9ed90unverifiedvulncheckvulncheck.com/xdb/e7e84a1490d3unverified
⚠ Public resources, to assess the exposure of systems you control or are authorized to test. Test only with authorization.