
Analisar requisições HTTP para minimizar riscos de ataques HTTP Desync (precursor para contrabando/divisão de requisições HTTP).
O HTTP/1.1 passou por uma longa evolução desde 1991 até 2014:
Isso significa que existe uma variedade de servidores e clientes, que podem ter visões diferentes sobre os limites das requisições, criando oportunidades para ataques de dessincronização (também conhecidos como HTTP Desync).
Pode parecer simples seguir as recomendações mais recentes da RFC. No entanto, para sistemas de grande escala que existem há algum tempo, isso pode ter um impacto inaceitável na disponibilidade.
A biblioteca http_desync_guardian foi projetada para analisar requisições HTTP e prevenir ataques HTTP Desync, equilibrando segurança e disponibilidade.
Ela classifica as requisições em diferentes categorias e fornece recomendações sobre como cada nível deve ser tratado.
Pode ser usada tanto para cabeçalhos HTTP brutos quanto para requisições já analisadas por um motor HTTP. Os consumidores podem configurar a coleta de logs e métricas. O log é limitado por taxa e todos os dados do usuário são ofuscados.
Se você acredita ter encontrado um problema de impacto na segurança, siga o nosso Processo de Notificação de Segurança.
O foco principal desta biblioteca é o HTTP/1.1. Veja testes para todos os casos cobertos. Os predecessores do HTTP/1.1 não suportam reutilização de conexão, o que limita as oportunidades para HTTP Desync,
no entanto, alguns proxies podem atualizar tais requisições para HTTP/1.1 e reutilizar conexões de backend, o que pode permitir a criação de requisições HTTP/1.0 maliciosas.
É por isso que elas são analisadas usando os mesmos critérios do HTTP/1.1. Para outras versões do protocolo, existem as seguintes exceções:
HTTP/0.9 nunca são consideradas Compliant, mas são classificadas como Acceptable. Se algum Content-Length/Transfer-Encoding estiver presente, então é Ambiguous.HTTP/1.0 - a presença de Transfer-Encoding torna a requisição Ambiguous.HTTP/2+ está fora do escopo. Mas se o seu proxy rebaixar HTTP/2 para HTTP/1.1, certifique-se de que a requisição de saída seja analisada.Veja a documentação para saber mais.
Esta biblioteca foi projetada para ser usada principalmente a partir de motores HTTP escritos em C/C++.
cargo install --force cbindgencbindgen --output http_desync_guardian.h --lang c para C.cbindgen --output http_desync_guardian.h --lang c++ para C++.cargo build --release. Os binários estão nos arquivos ./target/release/libhttp_desync_guardian.*.Saiba mais: exemplos genérico e Nginx.
#include "http_desync_guardian.h"
/*
* http_engine_request_t - already parsed by the HTTP engine
*/
static int check_request(http_engine_request_t *req) {
http_desync_guardian_request_t guardian_request = construct_http_desync_guardian_from(req);
http_desync_guardian_verdict_t verdict = {0};
http_desync_guardian_analyze_request(&guardian_request, &verdict);
switch (verdict.tier) {
case REQUEST_SAFETY_TIER_COMPLIANT:
// The request is good. green light
break;
case REQUEST_SAFETY_TIER_ACCEPTABLE:
// Reject, if mode == STRICTEST
// Otherwise, OK
break;
case REQUEST_SAFETY_TIER_AMBIGUOUS:
// The request is ambiguous.
// Reject, if mode == STRICTEST
// Otherwise send it, but don't reuse both FE/BE connections.
break;
case REQUEST_SAFETY_TIER_SEVERE:
// Send 400 and close the FE connection.
break;
default:
// unreachable code
abort();
}
}
Veja benchmarks como um exemplo de uso a partir do Rust.
Se você descobrir um potencial problema de segurança no http_desync_guardian, pedimos que notifique
a AWS Security através da nossa página de relato de vulnerabilidades. Por favor, não crie uma issue pública no github.
Veja CONTRIBUTING para mais informações.
Este projeto é licenciado sob a Licença Apache-2.0.