Pesquisadores da Netflix e do Google encontraram oito vulnerabilidades em várias implementações do protocolo HTTP/2 que permitem a negação de serviço através do envio de um fluxo de solicitações de rede formatado de forma específica. Os problemas afetam, de uma forma ou de outra, a maioria dos servidores HTTP com suporte a HTTP/2 e levam ao esgotamento da memória disponível para o processo de trabalho ou à criação de uma carga excessiva na CPU. Atualizações para corrigir as vulnerabilidades já foram apresentadas em e , mas ainda para Apache httpd e .
Os problemas resultaram das complexidades introduzidas no protocolo HTTP/2, relacionadas ao uso de estruturas binárias, ao sistema de limitação de fluxos de dados dentro das conexões, ao mecanismo de priorização de fluxos e à presença de mensagens de controle semelhantes ao ICMP, que operam no nível da conexão HTTP/2 (por exemplo, operações de ping, redefinição e configuração de fluxo). Muitas implementações não limitavam adequadamente o fluxo de mensagens de controle, organizavam de forma ineficaz a operação da fila de prioridades ao processar solicitações ou utilizavam implementações não otimizadas dos algoritmos de controle de fluxo.
A maioria dos métodos de ataque identificados consiste em enviar ao servidor determinadas solicitações que levam à geração de um grande número de respostas. Se o cliente não lê os dados do soquete e não rompe a conexão, a fila de resposta do servidor continua a se encher. Esse comportamento cria uma carga no sistema de gerenciamento da fila de conexões de rede e, dependendo das características da implementação, leva ao esgotamento da memória ou dos recursos da CPU disponíveis.
Vulnerabilidades identificadas:
- CVE-2019-9511 (Data Dribble) — O atacante solicita um grande volume de dados em vários fluxos, manipulando o tamanho da janela deslizante e a prioridade do fluxo, forçando o servidor a colocar os dados em fila em blocos de 1 byte;
- CVE-2019-9512 (Ping Flood) — O atacante inunda continuamente mensagens de ping através da conexão HTTP/2, iniciando o preenchimento, do outro lado, da fila interna de respostas enviadas;
- CVE-2019-9513 (Resource Loop) — O atacante cria vários fluxos de solicitações e continuamente altera as prioridades dos fluxos, causando a mistura da árvore de prioridades;
- CVE-2019-9514 (Reset Flood) — O atacante cria vários fluxos
e envia um pedido incorreto por meio de cada fluxo, causando o envio de pacotes RST_STREAM pelo servidor, mas não os aceita para preencher a fila de respostas; - CVE-2019-9515 (Settings Flood) — o atacante envia um fluxo de quadros "SETTINGS" vazios, a que o servidor deve confirmar o recebimento de cada solicitação;
- CVE-2019-9516 (0-Length Headers Leak) — o atacante envia um fluxo de cabeçalhos com nome nulo e valor nulo, e o servidor aloca um buffer em memória para armazenar cada cabeçalho e não o libera até o término da sessão;
- CVE-2019-9517 (Internal Data Buffering) — o atacante abre
uma janela deslizante HTTP/2 para enviar dados pelo servidor sem restrições, mas mantendo a janela TCP fechada, o que impede a gravação real de dados no socket. Em seguida, o atacante envia solicitações que exigem uma grande resposta; - CVE-2019-9518 (Empty Frames Flood) — o atacante envia um fluxo de quadros do tipo DATA, HEADERS, CONTINUATION ou PUSH_PROMISE, mas com carga útil vazia e sem sinal de término do fluxo. O servidor gasta tempo processando cada quadro, desproporcional ao que o atacante consome em largura de banda.
Fonte: opennet.ru
