Foram reveladas informações sobre o método de ataque "Continuation flood", que afeta várias implementações do protocolo HTTP/2, incluindo Apache httpd, Apache Traffic Server, Node.js, oghttp, Go net/http2, Envoy, oghttp e nghttp2. A vulnerabilidade pode ser explorada para realizar ataques contra servidores que suportam HTTP/2.0 e, dependendo da implementação, leva ao esgotamento de memória (cessação do processamento de requisições ou término inesperado de processos) ou à criação de alta carga na CPU (retardamento do processamento de requisições). Na opinião do pesquisador que descobriu a vulnerabilidade, o problema identificado é mais perigoso do que a vulnerabilidade "Rapid Reset" encontrada no ano passado, que foi utilizada para realizar os maiores ataques DDoS da época.
O alto nível de risco é explicado pelo fato de que, para interromper o funcionamento servidor, causar término inesperado ou redução significativa de desempenho, basta criar um fluxo de requisições especialmente formatadas a partir de um computador comum. Em certos casos, um único TCP-conexão pode ser suficiente para realizar o ataque. Além disso, o tráfego relacionado ao ataque não se destaca nos logs em meio às requisições normais dos usuários.
A vulnerabilidade é causada pelas características do processamento dos quadros HEADERS e CONTINUATION nas requisições via protocolo HTTP/2. Os quadros HEADERS são usados no HTTP/2 para transmitir cabeçalhos HTTP, enquanto os quadros CONTINUATION servem para fragmentar o envio de cabeçalhos HTTP em várias etapas (por exemplo, quando os cabeçalhos não cabem em um único quadro ou quando os cabeçalhos que podem ser preenchidos na fase atual devem ser enviados primeiro, seguidos pelos cabeçalhos cujos valores não podem ser determinados ainda). Quando os cabeçalhos são transmitidos em várias etapas, primeiro um quadro HEADERS é enviado sem o sinalizador END_HEADERS, seguido por vários quadros CONTINUATION com cabeçalhos adicionais, e a lista é finalizada com um quadro CONTINUATION com o sinalizador END_HEADERS.
O método de ataque consiste no envio de um fluxo contínuo de quadros CONTINUATION sem a definição do sinalizador END_HEADERS. Tal atividade leva à transmissão para servidor um grande número de cabeçalhos que o servidor mantém na memória até que a memória disponível para o processo se esgote. Para criar uma alta carga na CPU, além de esgotar a memória, um atacante pode aproveitar a compressão do conteúdo dos quadros CONTINUATION utilizando o formato HPACK, cuja análise requer cálculos. Em implementações do protocolo HTTP/1.1, para proteger contra a inundação do servidor com cabeçalhos, foi aplicado um limite ao tamanho dos cabeçalhos e um tempo limite para o envio de conexões. Para HTTP/2, devido à complexidade do protocolo, muitas implementações não previram métodos semelhantes de proteção contra o envio infinito de cabeçalhos.
A vulnerabilidade representa maior perigo para usuários do Node.js (CVE-2024-27983), pois esta implementação permite um crash ao enviar apenas alguns quadros para o servidor. Devido ao estado de corrida no Node.js, para provocar um encerramento anômalo através da verificação Assert, é suficiente encerrar as conexões durante o envio de um fluxo de cabeçalho inacabado (crash, se durante o fechamento das conexões um quadro CONTINUATION com a flag END_HEADERS ainda não tiver chegado). A vulnerabilidade foi corrigida no Node.js 18.20.1, 21.7.2 e 20.12.1, assim como nas versões mais recentes das bibliotecas llhttp e undici. Nas novas versões do Node.js, também foi corrigida uma vulnerabilidade menos perigosa (CVE-2024-27982) da classe "request smuggling", que permite a manipulação do valor "Content Length" para intervir no conteúdo das solicitações de outros usuários processadas no mesmo fluxo entre o frontend e o backend.
Vulnerabilidades relacionadas ao processamento de CONTINUATION em outras implementações do HTTP/2.0:
- oghttp (CVE-2024-27919) — consumo de memória ilimitado.
- Tempesta FW (CVE-2024-2758) — contorno de restrições.
- Biblioteca PHP amphp/http, amphp/http-client e amphp/http-server (CVE-2024-2653) — consumo de memória ilimitada, até o esgotamento total da memória disponível.
- Pacote Go net/http (CVE-2023-45288) — criação de alta carga na CPU.
- Biblioteca nghttp2 (CVE-2024-28182) — provocação de negação de serviço.
- Apache Httpd (CVE-2024-27316) — consumo excessivo de memória e criação de carga na CPU.
- Apache Traffic Server (CVE-2024-31309) — consumo excessivo de recursos.
- Envoy (CVE-2024-30255) — criação de alta carga na CPU (para uma carga total de um núcleo da CPU, é necessário um fluxo de 300Mbit/s).
Fonte: opennet.ru
