← voltar
CVE-2023-44487highsob ataqueCWE-400

CVE-2023-44487

98Vexday Risk Score

Priorize a correção. Ela está sob exploração confirmada pelo CISA e tem prova de conceito pública.

ssvc Actcvss 7.5epss 100%
da publicação à arma0 dias
Publicada no NVD10 de out.
1ª PoC10 de out.
CISA KEV10 de out.
probabilidade de exploração
100%top 1% das CVEs
exploração observada
simCISA + VulnCheck
51 exploit(s) público(s)
Ação exigida pela CISAprazo federal: 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.

Resumo

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.

Detalhamento técnico

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.

Como é explorada

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).

Versões

Afetadas
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.
Corrigidas em
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.

Como se proteger

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.

Como detectar

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.

Pesquisado e redigido com IA a partir do advisory do fornecedor e de análises públicas, com as fontes acima. Confira sempre a versão corrigida no advisory oficial antes de agir.
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
Produtos afetados
n/a · n/a
PoCs públicas encontradas51
exploitdbwww.exploit-db.com/exploits/52426não verificadogithubgithub.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/12f36ea6cd3enão verificadovulncheckvulncheck.com/xdb/95898a14699anão verificadovulncheckvulncheck.com/xdb/2a1d7187487enão verificadovulncheckvulncheck.com/xdb/a64a9ab88fd5não verificadovulncheckvulncheck.com/xdb/6dd9a135b0d8não verificadovulncheckvulncheck.com/xdb/54af2e2a4404não verificadovulncheckvulncheck.com/xdb/0f9d4f2a05f8não verificadovulncheckvulncheck.com/xdb/f0fe97192105não verificadovulncheckvulncheck.com/xdb/de08f4feae4cnão verificadovulncheckvulncheck.com/xdb/1a4725458b4anão verificadovulncheckvulncheck.com/xdb/34690740d2d3não verificadovulncheckvulncheck.com/xdb/f5782b81dab1não verificadovulncheckvulncheck.com/xdb/b3d01bf4f362não verificadovulncheckvulncheck.com/xdb/c3bd71694fc8não verificadovulncheckvulncheck.com/xdb/f2040c1e3da3não verificadovulncheckvulncheck.com/xdb/9ae3b81b8bd9não verificadovulncheckvulncheck.com/xdb/5331b5b1af5anão verificadovulncheckvulncheck.com/xdb/dcaf0e10df00não verificadovulncheckvulncheck.com/xdb/ad0b2af920fdnão verificadovulncheckvulncheck.com/xdb/b81499235b44não verificadovulncheckvulncheck.com/xdb/8fa92d2789bdnão verificadovulncheckvulncheck.com/xdb/9fffe4fac461não verificadovulncheckvulncheck.com/xdb/1a0aa0f9ed90não verificadovulncheckvulncheck.com/xdb/e7e84a1490d3não verificado
⚠ Recursos públicos, para você avaliar a exposição de sistemas que controla ou está autorizado a testar. Teste apenas com autorização.