
Analyser les requêtes HTTP pour minimiser les risques d'attaques HTTP Desync (précurseur des attaques de type HTTP request smuggling/splitting).
HTTP/1.1 a connu une longue évolution de 1991 à 2014 :
Cela signifie qu'il existe une variété de serveurs et de clients, qui peuvent avoir des vues différentes sur les limites des requêtes, créant des opportunités d'attaques de désynchronisation (a.k.a. HTTP Desync).
Cela peut sembler simple de suivre les dernières recommandations RFC. Cependant, pour les systèmes à grande échelle qui existent depuis un certain temps, cela peut avoir un impact inacceptable sur la disponibilité.
La bibliothèque http_desync_guardian est conçue pour analyser les requêtes HTTP afin de prévenir les attaques HTTP Desync, en équilibrant sécurité et disponibilité.
Elle classe les requêtes en différentes catégories et fournit des recommandations sur la manière de gérer chaque niveau.
Elle peut être utilisée pour les en-têtes de requêtes HTTP brutes ou déjà analysées par un moteur HTTP. Les consommateurs peuvent configurer la journalisation et la collecte de métriques. La journalisation est limitée en débit et toutes les données utilisateur sont obscurcies.
Si vous pensez avoir trouvé un problème de sécurité, veuillez suivre notre processus de notification de sécurité.
L'objectif principal de cette bibliothèque est HTTP/1.1. Voir tests pour tous les cas couverts. Les prédécesseurs de HTTP/1.1 ne supportent pas la réutilisation de connexion, ce qui limite les opportunités de HTTP Desync,
cependant certains proxys peuvent mettre à niveau ces requêtes vers HTTP/1.1 et réutiliser les connexions backend, ce qui peut permettre de créer des requêtes HTTP/1.0 malveillantes.
C'est pourquoi elles sont analysées selon les mêmes critères que HTTP/1.1. Pour les autres versions de protocole, il y a les exceptions suivantes :
HTTP/0.9 - les requêtes ne sont jamais considérées comme Compliant, mais sont classées comme Acceptable. Si l'un des en-têtes Content-Length/Transfer-Encoding est présent, alors c'est Ambiguous.HTTP/1.0 - la présence de Transfer-Encoding rend une requête Ambiguous.HTTP/2+ est hors de portée. Mais si votre proxy downgrade HTTP/2 vers HTTP/1.1, assurez-vous que la requête sortante est analysée.Voir documentation pour en savoir plus.
Cette bibliothèque est conçue pour être principalement utilisée depuis des moteurs HTTP écrits en C/C++.
cargo install --force cbindgencbindgen --output http_desync_guardian.h --lang c pour C.cbindgen --output http_desync_guardian.h --lang c++ pour C++.cargo build --release. Les binaires sont dans les fichiers ./target/release/libhttp_desync_guardian.*.En savoir plus : exemples générique et 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();
}
}
Voir benchmarks comme exemple d'utilisation depuis Rust.
Si vous découvrez un potentiel problème de sécurité dans http_desync_guardian, nous vous demandons d'en informer
AWS Security via notre page de signalement de vulnérabilités. Veuillez ne pas créer de ticket public sur GitHub.
Voir CONTRIBUTING pour plus d'informations.
Ce projet est sous licence Apache-2.0.