
1. Qu’est-ce que l’attaque HTTP/2 Rapid Reset ?
HTTP/2 introduit le multiplexage : plusieurs requêtes simultanées dans une seule connexion TCP, chacune identifiée par un Stream ID.
Dans une attaque Rapid Reset, l’attaquant ouvre des milliers de streams puis les ferme immédiatement via une frame RST_STREAM
, surchargeant le serveur avec des cycles ouverture/fermeture ultra-rapides.
Ce pattern peut saturer :
- La mémoire du serveur (table de sessions HTTP/2)
- Le CPU (gestion des états de streams)
- Le réseau (volume élevé de frames inutiles)
2. Exemple opérationnel d’attaque
Commandes simulant un Rapid Reset avec h2load
(outil HTTP/2 de test) :
h2load -n1000000 -c100 -m100 --rst-on-stream https://target.example.com/
Ici :
-n1000000
: nombre total de requêtes-c100
: connexions simultanées-m100
: streams max par connexion--rst-on-stream
: envoie un RST_STREAM immédiatement après HEADERS
3. Analyse Wireshark
Filtre HTTP/2 : http2.type == 3
(RST_STREAM)
Signes caractéristiques :
- Série de
HEADERS
suivies deRST_STREAM
en moins de 50 ms - Stream ID incrémentés rapidement (1, 3, 5…)
- Aucune frame DATA associée
4. Détection IDS avancée
4.1 Suricata
alert tls any any -> any any (msg:"HTTP/2 Rapid Reset possible";
flow:established,to_server;
content:"|00 03 00 00 00|"; offset:9; depth:5;
threshold: type both, track by_src, count 50, seconds 10;
sid:20230801; rev:2;)
Cette règle se déclenche si plus de 50 frames RST_STREAM sont envoyées par la même IP en 10 secondes.
4.2 Zeek
@load protocols/http2
global rst_count: table[addr] of count &default=0;
event http2_frame(c: connection, is_orig: bool, sid: count, ftype: count)
{
if ( ftype == 3 )
{
++rst_count[c$id$orig_h];
if ( rst_count[c$id$orig_h] > 50 )
{
print fmt("ALERTE Rapid Reset : %s", c$id$orig_h);
}
}
}
La même chose que pour Suriciate cette règle se déclenche si plus de 50 frames RST_STREAM sont envoyées par la même IP en 10 secondes.
5. Blocage réseau immédiat
iptables
iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 50 -j DROP
nftables
nft add rule inet filter input tcp dport 443 meter rapidreset { ip saddr limit rate over 100/second burst 50 packets } drop
6. Mitigation côté serveur
Nginx
http {
http2_max_concurrent_streams 50; # Limite streams par connexion
http2_max_requests 500; # Limite requêtes totales
http2_recv_timeout 3s; # Timeout court pour inactifs
}
Apache (mod_http2)
H2MaxSessionStreams 50
H2MaxWorkerIdleSeconds 3
Envoy Proxy
http2_protocol_options:
max_concurrent_streams: 50
initial_stream_window_size: 65535
7. Intégration SIEM
Dans Splunk, une requête pour identifier une IP envoyant un nombre anormal de RST_STREAM :
index=web_traffic "RST_STREAM"
| stats count by src_ip
| where count > 50
8. Scénario réel
En novembre 2023, une entreprise de e-commerce a subi une attaque Rapid Reset générant 15 millions de RST_STREAM/s.
Mitigation :
- Détection via Suricata
- Blocage d’IP via nftables
- Réduction des
http2_max_concurrent_streams
à 30 - Suivi SIEM pour vérifier arrêt de l’attaque
Conclusion
HTTP/2 Rapid Reset est un vecteur DDoS puissant qui exploite la logique interne du protocole.
Une défense efficace repose sur la détection IDS, le blocage réseau rapide, l’ajustement des paramètres serveur et la surveillance continue via SIEM.