deni de service
Produits et Services PRODUITS & SERVICES

De multiples failles DoS HTTP/2 découvertes par Netflix

HTTP/2 est un protocole réseau populaire qui sous-tend de grandes parties du web.

Netflix a identifié plusieurs failles de déni de service (DoS) dans de nombreuses implémentations de ce dernier. Leur exploitation risquerait de mettre des serveurs hors service.

HTTP/2 est la dernière version du HTTP, le protocole d’application qui gère la communication entre les serveurs web et les clients. Sorti en 2015, HTTP/2 a introduit plusieurs améliorations destinées à rendre les sessions plus rapides et plus fiables.

Les mises à jour comprennent :

  • La compression d’en-tête HTTP. Dans les versions HTTP précédentes, seul le corps d’une requête pouvait être compressé, même si pour les petites pages web, les en-têtes, qui incluent souvent des données telles que les cookies et qui sont toujours envoyés au format texte, peuvent être plus volumineux que le corps.
  • Flux multiplexés et paquets binaires. Le téléchargement de plusieurs éléments en parallèle est facilité et le rendu des pages web composées de nombreuses parties est accéléré.
  • Serveur Push. Cette fonctionnalité permet au serveur d’envoyer des informations pouvant être mises en cache, dont le client pourrait avoir besoin ultérieurement, et ce même si la demande n’a pas encore été faite.

Des fonctionnalités comme celles-ci peuvent aider à réduire le temps de latence et à améliorer le classement par les moteurs de recherche. Le problème est que davantage de complexité signifie aussi davantage de bugs.

Netflix explique ce problème dans son article :

Les algorithmes et les mécanismes permettant de détecter et d’atténuer les comportements “anormaux” sont beaucoup plus vagues et restent un exercice laissé au responsable de l’implémentation. Il ressort de l’examen de divers progiciels qu’une telle situation a conduit à une variété d’implémentations avec de nombreuses bonnes idées, sans oublier malheureusement son lot de faiblesses. 

Ces faiblesses sont au nombre de huit, chacune avec son propre numéro CVE et son surnom.

Certaines failles rappellent d’autres attaques de déni de service DoS non-HTTP/2.

Les failles de type ping flooding, par exemple, sont bien connues et bien comprises dans les cercles DDoS : c’est lorsque vous continuez de demander à un serveur : “Êtes-vous là?”, même si vous connaissez parfaitement la réponse et que vous le faites uniquement pour faire perdre du temps au serveur, en le faisant travailler pour rien.

Dans la version HTTP/2 (CVE-2019-9512), des requêtes ping répétées peuvent forcer le serveur à mettre en file d’attente des réponses, lui faire prendre du retard et même le pousser à cesser de répondre.

Il y a trois autres attaques de type flooding.

Le reset flood (CVE-2019-9514) ouvre plusieurs flux et envoie des requêtes non valides sur chacun d’eux afin de générer une réponse RST_STREAM. Les serveurs sont supposés utiliser des frames RST_STREAM pour mettre fin à une session lorsqu’un navigateur annule le téléchargement d’un fichier ou quitte une page. Un serveur obligé de traiter un grand nombre de ces requêtes peut faire face à un déni de service.

Un settings flood, désignée par CVE-2019-9515, envoie un flux de frames SETTINGS à son pair. Le serveur est censé répondre à chaque demande SETTINGS, entraînant ainsi une situation similaire au ping flood mentionné ci-dessus.

Le troisième type de flood est une attaque de frames vides (CVE-2019-9518). Elle envoie un flux constant de frames avec une charge virale inexistante et le serveur perd du temps à les gérer.

Plusieurs autres attaques reposent sur la manipulation du serveur en créant des paquets non valides, inhabituels ou sans objet.

L’attaque de type data dribble (CVE-2019-9511) utilise plusieurs flux de manière à forcer le serveur à mettre en file d’attente les données par petites quantités. Cela peut consommer les ressources du CPU et de la mémoire.

L’attaque de type resource loop (CVE-2019-9513) modifie constamment la priorité de plusieurs flux, mettant sous pression ainsi inutilement le code qui est censé organiser les priorités du serveur.

L’attaque de type zero-length headers leak (CVE-2019-9516) envoie des en-têtes de données marqués comme vides, bien qu’il faille de la mémoire pour envoyer et recevoir le bloc de données qui dit la chose suivante : “Voici un élément vide”. Si le serveur conserve les en-têtes tels quels en mémoire, plutôt que de les vider, car ils ne décodent rien finalement, un attaquant pourrait être en mesure de consommer littéralement la mémoire sur le serveur.

Enfin, une attaque de type internal data buffering (CVE-2019-9517) demande au serveur un fichier volumineux, mais n’ouvre pas le canal de données nécessaire requis par le protocole pour que le serveur puisse répondre en envoyant les données. Si le serveur charge une partie ou la totalité des données demandées dans des mémoires tampons internes mais qu’il n’a nulle part où l’envoyer, il risque de planter en raison de la charge importante au niveau de la mémoire.

Il s’agit d’un problème important pour la santé générale du web car 25% des sites web utilisent le HTTP/2.

Une liste des éditeurs concernés est fournie dans la note CERT associée, avec des liens vers les sites web des éditeurs afin d’obtenir des informations concernant les mises à jour.


Billet inspiré de Multiple HTTP/2 DoS flaws found by Netflix, sur Sophos nakedsecurity.