
Ferramenta altamente configurável para verificar a vulnerabilidade de um servidor contra o CVE-2023-44487 enviando rapidamente frames HEADERS e RST_STREAM e documentando as respostas do servidor.
CVE-2023-44487 é uma exploração contra o próprio protocolo HTTP2. No HTTP2, as solicitações de dados são iniciadas enviando um frame HEADERS. Após receber este frame, um servidor começará a processar sua solicitação, enviando posteriormente frames DATA até que todos os dados sejam transmitidos. O HTTP2 também especificou um frame RST_STREAM, que pode ser usado para fechar um stream a qualquer momento. Para prevenir ataques, os servidores geralmente limitam o número máximo de streams abertos simultaneamente (para 100 por padrão). Se os clientes realmente esperarem que todos os recursos sejam consumidos, esse limite raramente é atingido. O ataque funciona por uma razão simples: um cliente pode enviar um frame RST_STREAM em qualquer momento. Um frame RST_STREAM fecha um stream, e streams fechados não são contados como um stream simultâneo. Isso significa que um cliente pode enviar solicitações rapidamente, sem nunca atingir esse limite, simplesmente fechando uma conexão imediatamente após enviar uma solicitação. O servidor sendo atacado, em alguns casos, ainda começará a carregar os dados, criando uma carga excessiva.
Esta ferramenta visa verificar a vulnerabilidade de um servidor a esse ataque. Ela estabelece uma ou mais conexões HTTP2 concorrentes e subsequentemente envia os números especificados de frames HEADER, seguidos por frames RST_STREAM.
Ela também fornece várias outras opções de configuração, como atraso entre frames HEADERS e RST_STREAM, o número de streams a abrir, a quantidade de frames a enviar por stream e assim por diante. Após o ataque ser concluído, ela imprime um resumo contendo informações sobre o número de frames recebidos, bem como o número de erros e frames GOAWAY recebidos. Isso pode ajudá-lo a identificar se seus serviços são vulneráveis ao CVE-2023-44487.
Atualmente, esta ferramenta é distribuída apenas como código-fonte, o que significa que é necessário um . A ferramenta pode ser executada rodando . Há também um script python que pode ser usado para plotar informações de latência escritas no arquivo .
go installgo run main.go <opções>monitor.logAlém disso, criei um novo conjunto de ferramentas python para medições mais precisas e extensas.
O arquivo runner.py localizado na pasta tooling lerá os valores definidos no seu config.py (veja config-sample.py para detalhes) e executará todos os testes para todos os contêineres docker definidos.
Em seguida, executará o teste mais bem-sucedido (maior mediana + latência média) para todos os caminhos definidos no array paths. Ele gerará gráficos e arquivos de log para cada teste executado.
Este conjunto de ferramentas ainda está em desenvolvimento. Só o criei porque estava com preguiça de realmente executar todos esses testes manualmente para o nosso artigo de pesquisa.
Sinta-se à vontade para enviar um PR para limpá-lo ou torná-lo utilizável para mais do que apenas nosso caso de uso.
Atualmente, as seguintes opções de CLI estão implementadas:
| Flag | Padrão | Significado |
|---|---|---|
| frames | 1 | o número de frames HEADERS e RST_STREAM a enviar em qualquer stream |
| connections | 1 | o número de conexões TLS para executar o ataque (concorrentemente) |
| consecutiveSends | 1 | número de frames HEADERS a enviar antes de enviar frames RST_STREAM (por fluxo) |
| connectAttempts | 1 | número de conexões consecutivas para executar o teste (por rotina de conexão) |
| delay | 0 | o tempo (em ms) a esperar entre o envio de frames HEADERS e RST_STREAM |
| ignoreGoAway | false | se true, streams GOAWAY não farão com que a rotina de recebimento termine. Em vez disso, aguardará até que nenhum frame seja recebido por mais de 10 segundos. |
| monitor | false | ativar monitoramento de desempenho |
| monitorDelay | 100 | o tempo (em ms) a esperar entre testar a latência de resposta |
| monitorLog | ./monitor.log | o arquivo para escrever logs de atraso do monitor |
| routines | 1 | o número de streams a atacar |
| skipValidation | true | se true, o certificado do servidor não será validado (este é o padrão - não nos importamos com segurança, já que somos o atacante de qualquer forma) |
| timeout | 1000 | tempo a esperar por novos frames antes de considerar a tentativa de conexão como inválida e interrompê-la |
| url | https://localhost:433/ | a url para executar o ataque |
A ferramenta imprimirá muitas informações de depuração, bem como um resumo. As informações de depuração contêm informações sobre a forma como a conexão foi estabelecida e sobre o progresso atual e o tipo de frames atualmente sendo enviados.
O resumo será algo assim (dependendo da sua configuração)
####################SUMMARY####################
Packet types received:
PING: 2
HEADERS: 12
SETTINGS: 0
DATA: 11
GOAWAY: 3
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Attack ending reasons (per receiving thread):
GoAway events: 3
Timeout events: 0
Error events: 0
Summary for connection 2
PING: 1
HEADERS: 9
SETTINGS: 0
DATA: 6
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Summary for connection 1
PING: 1
HEADERS: 3
SETTINGS: 0
DATA: 5
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Summary for connection 0
PING: 0
HEADERS: 0
SETTINGS: 0
DATA: 0
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Se você acha que há outras estatísticas que precisam ser coletadas - não hesite em me contatar ou criar uma issue!
Esta ferramenta é destinada APENAS para fins de pesquisa. Não se destina a executar ataques contra servidores que não sejam de sua propriedade ou gerenciados por você. Não me responsabilizo pela precisão das estatísticas fornecidas, nem por ataques e suas consequências para servidores e serviços.