
Analizza le richieste HTTP per minimizzare i rischi di attacchi HTTP Desync (precursore di HTTP request smuggling/splitting).
HTTP/1.1 ha attraversato una lunga evoluzione dal 1991 al 2014:
Ciò significa che esistono vari server e client, che potrebbero avere visioni diverse sui confini delle richieste, creando opportunità per attacchi di desincronizzazione (noti come HTTP Desync).
Potrebbe sembrare semplice seguire le ultime raccomandazioni RFC. Tuttavia, per sistemi su larga scala che esistono da tempo, ciò potrebbe comportare un impatto inaccettabile sulla disponibilità.
La libreria http_desync_guardian è progettata per analizzare le richieste HTTP al fine di prevenire gli attacchi HTTP Desync, bilanciando sicurezza e disponibilità.
Classifica le richieste in diverse categorie e fornisce raccomandazioni su come gestire ciascun livello.
Può essere utilizzata sia per intestazioni di richieste HTTP grezze, sia per richieste già parse da un motore HTTP. I consumatori possono configurare la raccolta di log e metriche. La registrazione è limitata in frequenza e tutti i dati utente sono offuscati.
Se pensi di aver trovato un problema di sicurezza, segui il nostro processo di notifica di sicurezza.
L'obiettivo principale di questa libreria è HTTP/1.1. Vedi test per tutti i casi coperti. I predecessori di HTTP/1.1 non supportano il riutilizzo della connessione, il che limita le opportunità di HTTP Desync,
tuttavia alcuni proxy potrebbero aggiornare tali richieste a HTTP/1.1 e riutilizzare le connessioni di backend, il che potrebbe permettere di creare richieste HTTP/1.0 dannose.
Ecco perché vengono analizzate utilizzando gli stessi criteri di HTTP/1.1. Per altre versioni del protocollo, ci sono le seguenti eccezioni:
HTTP/0.9 non sono mai considerate Compliant, ma sono classificate come Accettabili. Se è presente Content-Length/Transfer-Encoding, allora è Ambiguo.HTTP/1.0 - la presenza di Transfer-Encoding rende una richiesta Ambiguo.HTTP/2+ è fuori dall'ambito. Ma se il tuo proxy degrada HTTP/2 a HTTP/1.1, assicurati che la richiesta in uscita sia analizzata.Vedi documentazione per saperne di più.
Questa libreria è progettata per essere utilizzata principalmente da motori HTTP scritti in C/C++.
cargo install --force cbindgencbindgen --output http_desync_guardian.h --lang c per C.cbindgen --output http_desync_guardian.h --lang c++ per C++.cargo build --release. I binari si trovano nei file ./target/release/libhttp_desync_guardian.*.Scopri di più: esempi generico e Nginx.
#include "http_desync_guardian.h"
/*
* http_engine_request_t - già parsed dal motore HTTP
*/
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:
// La richiesta è buona. via libera
break;
case REQUEST_SAFETY_TIER_ACCEPTABLE:
// Rifiuta, se mode == STRICTEST
// Altrimenti, OK
break;
case REQUEST_SAFETY_TIER_AMBIGUOUS:
// La richiesta è ambigua.
// Rifiuta, se mode == STRICTEST
// Altrimenti inviala, ma non riutilizzare le connessioni FE/BE.
break;
case REQUEST_SAFETY_TIER_SEVERE:
// Invia 400 e chiudi la connessione FE.
break;
default:
// codice irraggiungibile
abort();
}
}
Vedi benchmark come esempio di utilizzo da Rust.
Se scopri un potenziale problema di sicurezza in http_desync_guardian, ti chiediamo di informare AWS Security tramite la nostra pagina di segnalazione delle vulnerabilità. Per favore, non creare un issue pubblico su github.
Vedi CONTRIBUTING per maggiori informazioni.
Questo progetto è concesso in licenza secondo la Apache-2.0 License.