Vulnérabilité d’inondation de CONTINUATION HTTP/2 : détails techniques
- L’inondation de
CONTINUATION est une catégorie de vulnérabilités découverte dans plusieurs implémentations du protocole HTTP/2, et elle représente une menace plus grave que l’attaque Rapid Reset.
- Les conséquences de l’attaque vont du crash du serveur à la dégradation des performances, et les requêtes d’attaque n’apparaissent pas dans les journaux d’accès HTTP.
Préface
- En octobre 2023, l’auteur a découvert l’attaque HTTP/2 Rapid Reset et a décidé de commencer des recherches sous l’angle de l’analyse de sécurité de HTTP/2.
Brève introduction à HTTP/2
- La principale différence entre HTTP/1.1 et HTTP/2 est que le second est un protocole binaire, dans lequel le client et le serveur échangent des frames au lieu de lignes de texte.
- Une explication des frames
HEADERS et CONTINUATION est nécessaire.
Frame HEADERS
- La frame
HEADERS est utilisée pour transmettre les en-têtes HTTP des requêtes et des réponses, et compresse les données d’en-tête à l’aide de l’algorithme d’encodage HPACK.
- Des flags comme
END_HEADERS et END_STREAM peuvent être définis sur la frame.
Frame CONTINUATION
- La frame
CONTINUATION est très similaire à la frame HEADERS, mais elle ne possède que le flag END_HEADERS ; lorsque ce flag est défini, cela signifie que le flux d’en-têtes est terminé.
Vulnérabilité d’inondation de CONTINUATION
- Si un client démarre un nouveau flux HTTP/2 et envoie des frames
HEADERS et CONTINUATION sans que le flag END_HEADERS ne soit jamais défini, le serveur doit analyser un flux d’en-têtes infini et le stocker en mémoire.
- En HTTP/1.1, les limites de taille des en-têtes et les timeouts de requête/en-tête protègent contre des en-têtes infinis, mais dans de nombreux serveurs HTTP/2, ces protections sont absentes ou mal implémentées.
Consommation CPU : cas de Golang
- Golang est un exemple de consommation CPU causée par l’inondation de
CONTINUATION ; il utilise une classe abstraite appelée http2MetaHeadersFrame pour traiter les frames HEADERS et CONTINUATION.
- Le décodeur HPACK est configuré pour arrêter l’émission des en-têtes lorsqu’il atteint la limite de taille des en-têtes, mais en l’absence du flag
END_HEADERS, la fonction ne retourne pas et continue à décoder les en-têtes.
Manque de mémoire
- Le manque de mémoire est l’un des cas les plus graves : certaines implémentations ne limitent pas la taille de la liste d’en-têtes construite à l’aide des frames
CONTINUATION.
- Dans les implémentations sans timeout des en-têtes, une seule connexion HTTP/2 peut suffire à faire planter le serveur.
Crash par assertion atteignable : Node.js (cas particulier)
- Node.js gère correctement un flux infini de frames
CONTINUATION, mais un bug de concurrence de données se produit lorsque la connexion est interrompue au milieu du flux d’en-têtes.
- Node.js suit les allocations mémoire dans le destructeur de
Http2Session, et lorsque la connexion est coupée, la valeur current_nghttp2_memory_ est mise à jour simultanément, ce qui peut provoquer un crash.
Comparaison avec les vulnérabilités HTTP/2 précédentes
- Plusieurs vulnérabilités HTTP/2 ont déjà été signalées par le passé, et l’inondation de
CONTINUATION fonctionne différemment des vulnérabilités précédentes.
- Au lieu d’envoyer des en-têtes vides, l’inondation de
CONTINUATION envoie de nombreux en-têtes arbitraires, jusqu’à la limite de taille de frame définie par le serveur.
Remarques finales
- Le trafic HTTP/2 représente environ 60 % de tout le trafic HTTP humain ; compte tenu de l’importance des projets affectés, une part significative d’Internet a été touchée par une vulnérabilité facilement exploitable.
- Si cette vulnérabilité avait été exploitée dans la nature, elle aurait été très difficile à déboguer pour les administrateurs de serveurs sans connaissances appropriées sur HTTP/2.
L’avis de GN⁺
- Cette vulnérabilité peut gravement nuire à la disponibilité des serveurs et, comme elle n’est pas consignée dans les logs, elle est difficile à tracer et à contrer.
- Les administrateurs de serveurs doivent appliquer régulièrement les mises à jour de sécurité et utiliser des outils d’analyse du trafic pour détecter les schémas anormaux.
- Ce type de vulnérabilité doit alerter la communauté de la cybersécurité et souligne l’importance d’une conception et d’implémentations de protocole plus sûres.
- D’un point de vue critique, cette vulnérabilité révèle un défaut fondamental de conception dans un protocole largement utilisé, ce qui soulève des questions de fiabilité concernant l’infrastructure de base d’Internet.
- À moins d’être un expert disposant de connaissances dans le domaine concerné, il peut être difficile de comprendre et de gérer une vulnérabilité aussi complexe ; il est donc nécessaire de renforcer la formation et la sensibilisation à la sécurité.
1 commentaires
Commentaires Hacker News
Ce problème a récemment été corrigé dans Bandit
Critique de la culture de développement
Liste des serveurs / reverse proxies non affectés
Réflexion sur la sécurité de HTTP/1.1
Éloges envers l’auteur
Mention de Slowloris v2
Mention d’une faute de frappe
Regard critique sur HTTP/2