Le jardin HTTP
Le HTTP Garden est un ensemble de serveurs HTTP et de proxys configurés pour être composables, ainsi que des scripts permettant d'interagir avec eux de manière à faciliter grandement la recherche de vulnérabilités. Pour quelques démos intéressantes des vulnérabilités que vous pouvez trouver avec HTTP Garden, consultez notre conférence ShmooCon 2024.
Remerciements
Nous tenons à remercier nos amis de Galois, Trail of Bits, Narf Industries et Dartmouth College pour avoir rendu ce projet possible.
Ce matériel est basé sur des travaux soutenus par la Defense Advanced Research Projects Agency (DARPA) sous le numéro de contrat HR0011-19-C-0076.
Commencer
Dépendances
- Le HTTP Garden fonctionne sur Linux x86_64 et n'a pas été testé sur d'autres plates-formes.
- Les serveurs cibles sont créés et exécutés dans des conteneurs Docker, vous aurez donc besoin de Docker.
- Vous aurez également besoin des packages Python suivants, que vous pouvez obtenir depuis PyPI (c'est-à-dire avec
pip
) ou depuis le gestionnaire de packages de votre système :
-
docker
- Pour interagir avec Docker
-
pyyaml
-
tqdm
- Pour les barres de progression
Si vous installez des packages Python avec le gestionnaire de packages de votre système, sachez que les noms des packages peuvent devoir être préfixés par py3-
, python3-
ou python-
, selon le système.
- Je recommande également fortement d'installer rlwrap à partir de votre gestionnaire de paquets, car cela rend la réplique Garden beaucoup plus amusante.
Bâtiment
- Construisez l'image de base :
docker build ./images/http-garden-soil -t http-garden-soil
Cette image contient quelques utilitaires de base, ainsi qu'un AFL++ forké qui facilite la collecte de couverture des processus sans les tuer.
- Créez des serveurs HTTP et des proxys :
docker compose build gunicorn hyper nginx haproxy nginx_proxy
Il y a bien sûr bien plus de cibles dans le jardin HTTP que celles que nous venons de construire. C'est juste que leur construction prend beaucoup de temps. Même la construction de ces quelques-uns prendra quelques minutes !
En cours d'exécution
- Démarrez quelques serveurs et proxys :
docker compose up gunicorn hyper nginx haproxy nginx_proxy
rlwrap python3 tools/repl.py
- Filtrez une requête GET de base via HAProxy, puis via un proxy inverse Nginx, puis envoyez le résultat aux serveurs d'origine Gunicorn, Hyper et Nginx et affichez si leurs interprétations correspondent :
garden> payload 'GET / HTTP/1.1rnHost: whateverrnrn' # Set the payload
garden> transduce haproxy nginx_proxy # Run the payload through the reverse proxies
[1]: 'GET / HTTP/1.1rnHost: whateverrnrn'
haproxy
[2]: 'GET / HTTP/1.1rnhost: whateverrnrn'
nginx_proxy
[3]: 'GET / HTTP/1.1rnHost: echornConnection: closernrn'
garden> servers gunicorn hyper nginx # Select the servers
garden> grid # Show their interpretations
g
u
n
i h n
c y g
o p i
r e n
n r x
+-----
gunicorn|✓ ✓ ✓
hyper | ✓ ✓
nginx | ✓
On dirait qu'ils sont tous d'accord. Essayons une charge utile plus intéressante :
garden> payload 'POST / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn0nrn'
garden> grid
g
u
n
i h n
c y g
o p i
r e n
n r x
+-----
gunicorn|✓ ✓ X
hyper | ✓ X
nginx | ✓
Il y a un écart ! En effet, Nginx prend en charge n
en tant que ligne se terminant par des lignes de fragments, mais pas Hyper et Gunicorn. Nginx viole techniquement la RFC 9112 ici, mais l'impact est probablement minime.
Disposition du répertoire
images
Le répertoire images
contient un sous-répertoire pour chaque serveur HTTP et transducteur du Garden. Chaque cible obtient sa propre image Docker. Tous les programmes sont construits à partir des sources lorsque cela est possible. Afin que nous puissions facilement créer plusieurs versions de chaque cible, toutes les cibles sont paramétrées avec une URL de référentiel ( APP_REPO
), un nom de branche ( APP_BRANCH
) et un hachage de validation ( APP_VERSION
).
tools
Le répertoire tools
contient les scripts utilisés pour interagir avec les serveurs. À l'intérieur, vous trouverez
-
diagnose_anomalies.py
: Un script pour énumérer les bizarreries bénignes de l'analyse HTTP dans les systèmes testés à ignorer lors du fuzzing, -
repl.py
: L'interface utilisateur principale du HTTP Garden, -
update.py
: Un script qui met à jour les hachages de validation dans docker-compose.yml
, - ... et quelques scripts supplémentaires qui ne sont pas destinés à l'utilisateur.
Cibles
Serveurs HTTP
Nom | Fonctionne localement ? | Couverture collectée ? |
---|
aiohttp | Oui | Oui |
apache_httpd | Oui | Oui |
apache_tomcat | Oui | Non |
chéroot | Oui | Oui |
cpp_httplib | Oui | Non |
dart_stdlib | Oui | Non |
éclipse_grizzly | Oui | Non |
Eclipse_jetty | Oui | Non |
http rapide | Oui | Non |
go_stdlib | Oui | Non |
licorne | Oui | Oui |
eau | Oui | Oui |
haproxy_fcgi | Oui | Non |
hyper | Oui | Non |
hypercorne | Oui | Oui |
ktor | Oui | Non |
libévent | Oui | Non |
libmicrohttpd | Oui | Non |
libsoup | Oui | Non |
lumièretpd | Oui | Oui |
mangouste | Oui | Oui |
netty | Oui | Non |
nginx | Oui | Oui |
noeud_stdlib | Oui | Non |
openlitespeed | Oui | Non |
openwrt_uhttpd | Oui | Oui |
php_stdlib | Oui | Non |
phusion_passenger | Oui | Non |
protocole_http1 | Oui | Non |
puma | Oui | Non |
servicetalk | Oui | Non |
tornade | Oui | Non |
tordu | Oui | Non |
licorne | Oui | Non |
uvicorne | Oui | Oui |
serveuse | Oui | Oui |
brique en ligne | Oui | Non |
c'est | Non | Non |
openbsd_httpd | Non | Non |
Transducteurs HTTP
Nom | Fonctionne localement ? |
---|
apache_httpd_proxy | Oui |
apache_traffic_server | Oui |
go_stdlib_proxy | Oui |
h2o_proxy | Oui |
haproxy | Oui |
haproxy_invalide | Oui |
lighttpd_proxy | Oui |
nghttpx | Oui |
nginx_proxy | Oui |
openlitespeed_proxy | Oui |
pingora | Oui |
livre | Oui |
calmar | Oui |
vernis | Oui |
akamai | Non |
awselb_classic | Non |
awselb_application | Non |
aws_cloudfront | Non |
éruption nuageuse | Non |
rapidement | Non |
google_classique | Non |
google_global | Non |
iis_proxy | Non |
openbsd_relayd | Non |
Insectes
Ce sont les bugs que nous avons trouvés en utilisant HTTP Garden. Si vous en trouvez quelques-uns, veuillez soumettre un PR pour les ajouter à cette liste ! Chaque bug est décrit avec les champs suivants :
- Cas d'utilisation : type d'attaque qu'un attaquant peut exécuter avec ce bug
- Exigences : Options de configuration requises ou autres serveurs pour que ce bug soit exploité.
- Risque : Aucun | Faible | Moyen | Élevé, suivi d'une brève explication.
- Aucun : le bug n'est probablement pas exploitable.
- Faible : le bug pourrait être exploitable, mais il nécessite une configuration vraiment étrange ou s'appuierait sur un proxy se comportant d'une manière que je n'ai jamais vue.
- Moyen : le bug est probablement exploitable, mais n'a qu'un impact modéré ou nécessite une combinaison improbable serveur/transducteur.
- Élevé : le bug est exploitable dans les configurations et combinaisons serveur/transducteur courantes.
- Charge utile : un exemple de charge utile qui déclenche le bug
- Programmes concernés : une liste des serveurs sur lesquels ce bogue est présent, ainsi que la chronologie des rapports et des correctifs. Étant donné que certains bugs d'implémentation sont courants, cela les empêche d'encombrer la liste :)
Bogues du serveur
Ce sont des bugs dans la manière dont les serveurs acceptent et interprètent les requêtes.
- Le constructeur Python
int
est utilisé pour analyser la taille des morceaux, donc 0x
, _
, +
et -
sont mal interprétés.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui interprète la taille des morceaux comme leur préfixe valide le plus long, mais les transmet tels quels.
- Risque : moyen. Voir le bug 7 du transducteur.
- Charge utile :
GET / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn0_2ernrnGET / HTTP/1.1rnHost: arnContent-Length: 5rnrn0rnrn
- Programmes concernés :
- AIOHTTP :
- 1er août 2023 : signalé via l’avis de sécurité de GH.
- 7 octobre 2023 : corrigé dans la version 3.8.6.
- Gunicorne :
- 1er août 2023 : signalé via le problème GH.
- 25 décembre 2023 : corrigé dans le commit.
- Tornade:
- 2 août 2023 : signalé via l'avis de sécurité de GH.
- 10 août 2023 : corrigé dans le commit.
-
x00
, r
ou n
sont incorrectement autorisés dans les valeurs d'en-tête.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui transmet ces octets dans les valeurs d'en-tête, ou accepte et transmet
n
comme terminateur de ligne d'en-tête. - Risque : élevé. Voir les bugs de transducteur 10, 12 et 16.
- Charge utile :
GET / HTTP/1.1rnHost: arnHeader: vnx00raluernrn
- Programmes concernés :
- AIOHTTP :
- 1er août 2023 : signalé via l’avis de sécurité de GH.
- 7 octobre 2023 : corrigé dans la version 3.8.6.
- Gunicorne :
- 31 janvier 2024 : signalé via un problème GH.
- 31 janvier 2024 : reste inchangé.
- Tornade:
- 11 août 2023 : signalé via le problème GH.
- 31 janvier 2024 : reste inchangé.
- Les espaces sont supprimés de manière incorrecte à la fin des noms d’en-tête.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui considère les espaces avant le
:
comme faisant partie du nom de l'en-tête. - Risque : Faible. Je ne connais aucun transducteur vulnérable, mais James Kettle dit qu'il en existe au moins un.
- Charge utile :
GET / HTTP/1.1rnHost: whateverrnContent-Length : 34rnrnGET / HTTP/1.1rnHost: whateverrnrn
- Programmes concernés :
- AIOHTTP :
- 2 août 2023 : signalé via l'avis de sécurité de GH.
- 7 octobre 2023 : corrigé dans la version 3.8.6.
- Chéroot :
- 4 février 2024 : signalé via le problème GH.
- 4 février 2024 : reste inchangé.
- OpenLiteSpeed :
- 31 juillet 2023 : signalé par e-mail.
- 10 août 2023 : corrigé dans OLS 1.7.18.
- 14 août 2023 : attribué CVE-2023-40518.
- Les espaces sont supprimés de manière incorrecte à partir du début du premier nom d’en-tête.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui considère les espaces au début du premier nom d'en-tête comme faisant partie du nom d'en-tête.
- Risque : Faible. Je ne connais aucun transducteur vulnérable.
- Charge utile :
GET / HTTP/1.1rntContent-Length: 1rnrnX
- Programmes concernés :
- AIOHTTP :
- 20 août 2023 : signalé via le commentaire d’avis de sécurité de GH.
- 7 octobre 2023 : corrigé dans la version 3.8.6.
- Les versions HTTP sont interprétées comme leur préfixe valide le plus long.
- Cas d'utilisation : ???
- Exigences : N/A
- Risque : Aucun
- Charge utile :
GET /test HTTP/1.32rnrn
- Programmes concernés :
- AIOHTTP :
- 14 octobre 2023 : signalé via le numéro GH et PR.
- 15 octobre 2023 : corrigé dans le commit.
- Les méthodes HTTP sont interprétées comme leur préfixe valide le plus long.
- Cas d'utilisation : contournement de l'ACL
- Exigences : Un transducteur qui transmet les noms de méthodes non valides tels quels.
- Risque : moyen. Explication omise car les bugs correspondants ne sont pas encore signalés.
- Charge utile :
G=":<>(e),[T];?" /get HTTP/1.1rnrn
- Programmes concernés :
- AIOHTTP :
- 14 octobre 2023 : signalé via le numéro GH et PR.
- 15 octobre 2023 : corrigé dans le commit.
- Les URI ne sont pas du tout validés.
- Cas d'utilisation : ???
- Exigences : N/A
- Risque : Aucun
- Charge utile :
GET ! HTTP/1.1rnrn
- Programmes concernés :
- AIOHTTP :
- 16 octobre 2023 : signalé via le problème GH.
- 16 octobre 2023 : Corrigé en PR.
- Certains octets non-ASCII sont incorrectement autorisés dans les noms d'en-tête.
- Cas d'utilisation : ???
- Exigences : N/A
- Risque : Aucun
- Charge utile :
GET / HTTP/1.1rnxefoo: barrnrn
- Programmes concernés :
- AIOHTTP :
- 17 octobre 2023 : signalé via PR.
- 18 octobre 2023 : corrigé via la fusion du PR ci-dessus.
- Daphné :
- 4 février 2024 : signalé via le problème GH.
- 10 février 2024 : corrigé dans le commit.
- Mangouste:
- 13 octobre 2023 : signalé via le problème GH.
- 5 décembre 2023 : corrigé dans le commit.
-
n
est autorisé comme espace de séparation dans une ligne de requête.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui transmet les requêtes HTTP/0.9 avec
n
tel quel et réutilise la connexion sous-jacente. - Risque : Faible. Je ne connais aucun transducteur vulnérable.
- Charge utile :
GET /nHTTP/1.1rnrn
- Programmes concernés :
- AIOHTTP :
- 17 octobre 2023 : signalé via PR.
- 18 octobre 2023 : corrigé via la fusion.
- Le constructeur Python
int
est utilisé pour analyser les valeurs Content-Length
, donc _
, +
et -
sont mal interprétés.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui interprète les valeurs
Content-Length
comme leur préfixe valide le plus long, mais les transmet telles quelles. - Risque : Faible. Je ne connais aucun transducteur vulnérable, mais Matt Grenfeldt dit qu'il en existe au moins un.
- Charge utile :
GET / HTTP/1.1rnHost: arnContent-Length: +1_0rnrn0123456789
- Programmes concernés :
- AIOHTTP :
- 1er août 2023 : signalé via l’avis de sécurité de GH.
- 7 octobre 2023 : corrigé dans la version 3.8.6.
- Serveur http CPython :
- 2 avril 2023 : signalé via le problème GH.
- 2 avril 2023 : corrigé dans le commit.
- Tornade:
- 2 août 2023 : signalé via l'avis de sécurité de GH.
- 10 août 2023 : corrigé dans le commit.
- Temps de travail :
- 1er juin 2023 : signalé via le problème GH.
- 7 juin 2023 : corrigé dans le commit 88c5c78.
- Les requêtes contenant plusieurs en-têtes
Transfer-Encoding: chunked
sont acceptées et traitées comme n’ayant pas de corps de message.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui transmet les requêtes contenant plusieurs en-têtes
Transfer-Encoding
. - Risque : élevé. Voir le bug du transducteur 28.
- Charge utile :
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnTransfer-Encoding: chunkedrnrn1rnZrn0rnrn
- Programmes concernés :
- Tornade:
- 7 octobre 2023 : signalé via l'avis de sécurité de GH.
- 6 juin 2024 : corrigé dans la publication de l'avis de sécurité.
-
xa0
et x85
sont supprimés du début et de la fin des valeurs d'en-tête.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui transmet les valeurs
Transfer-Encoding
inconnues et les traite différemment des valeurs chunked
. - Risque : moyen. Voir le bug du transducteur 18.
- Charge utile :
POST / HTTP/1.1rnHost: whateverrnTransfer-Encoding: xa0chunkedxa0rnrn0rnrn
- Programmes concernés :
- Tornade:
- 4 février 2024 : signalé via le commentaire d'avis de sécurité de GH.
- 4 février 2024 : reste inchangé.
-
r
est traité comme un terminateur de ligne dans les lignes du champ d'en-tête.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui transmet
r
dans les noms d'en-tête. - Risque : élevé. Voir le bug 10 du transducteur.
- Charge utile :
GET / HTTP/1.1rnVisible: :/rSmuggled: :)rnrn
- Programmes concernés :
- Serveur http CPython :
- 31 janvier 2024 : signalé via un problème GH.
- 31 janvier 2024 : reste inchangé.
- Mangouste:
- 7 juillet 2023 : signalé via le problème GH.
- 9 juillet 2023 : corrigé dans le commit 6957c37.
- Les caractères ASCII non autorisés sont incorrectement autorisés dans les noms d'en-tête.
- Cas d'utilisation : ???
- Exigences : N/A
- Risque : Aucun
- Charge utile :
GET / HTTP/1.1rnx00x01x02x03x04x05x06x07x08tx0bx0cx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1f "(),/;<=>?@[/]{}: whateverrnrn
- Programmes concernés :
- Daphné :
- 4 février 2024 : signalé via le problème GH.
- 10 février 2024 : corrigé dans le commit.
- Mangouste:
- 13 octobre 2023 : signalé via le problème GH.
- 5 décembre 2023 : corrigé dans le commit.
- Tornade:
- 11 août 2023 : signalé via le problème GH.
- 31 janvier 2024 : reste inchangé. OpenLiteSpeed :
- 31 juillet 2023 : signalé par e-mail.
- 10 août 2023 : corrigé dans OLS 1.7.18.
- Les versions HTTP ne sont pas validées.
- Cas d'utilisation : ???
- Exigences : N/A
- Risque : Aucun
- Charge utile :
GET / HTTP/rr1.1rnrn
- Programmes concernés :
- HTTP rapide :
- 4 février 2024 : signalé via le problème GH.
- 11 février 2024 : corrigé dans le commit.
- Les valeurs
Content-Length
vides sont traitées comme si elles étaient 0
.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui interprète les valeurs
Content-Length
vides comme autre chose que 0. - Risque : Faible. Je ne connais aucun transducteur de ce type.
- Charge utile :
GET / HTTP/1.1rnHost: whateverrnContent-Length: rnrn
- Programmes concernés :
- Allez sur Internet/http :
- 31 juillet 2023 : signalé via un problème GH
- 11 août 2023 : corrigé dans le commit.
- Lighttpd :
- 1er août 2023 : signalé via le système de suivi des problèmes.
- 3 août 2023 : corrigé dans le commit.
- OpenLiteSpeed :
- 31 juillet 2023 : signalé par e-mail.
- 10 août 2023 : corrigé dans OLS 1.7.18.
- Les tailles de morceaux vides sont traitées comme si elles étaient
0
.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui accepte et transmet
rn
supplémentaires entre les morceaux. - Risque : Faible. Je ne connais aucun transducteur de ce type.
- Charge utile :
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnrnrnrn
- Programmes concernés :
- Allez sur Internet/http :
- 2 décembre 2023 : signalé via le problème GH.
- 4 janvier 2024 : corrigé dans le commit.
- Hyper :
- 1er décembre 2023 : signalé par e-mail.
- 18 décembre 2023 : corrigé dans le commit.
- Mangouste:
- 3 janvier 2024 : signalé via le problème GH.
- 3 janvier 2024 : Corrigé en PR.
- Les noms d’en-tête vides sont acceptés par erreur.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui accepte et transmet
rn:rn
, et le traite comme la fin du bloc d'en-tête. - Risque : Faible. Je ne connais aucun transducteur de ce type.
- Charge utile :
GET / HTTP/1.1rn: ignoredrnHost: whateverrnrn
- Programmes concernés :
- Allez sur Internet/http :
- 24 janvier 2024 : signalé via le problème GH.
- 30 janvier 2024 : corrigé dans le commit.
- Gunicorne :
- 4 décembre 2023 : signalé via le problème GH.
- 25 décembre 2023 : corrigé dans le commit.
- Noeud.js :
- 13 octobre 2023 : signalé via le problème GH.
- 17 octobre 2023 : corrigé dans le commit.
- Tornade:
- 13 octobre 2023 : signalé via le commentaire sur le problème GH.
- 15 octobre 2023 : reste inchangé.
- Toutes les séquences d'espaces non
rn
sont supprimées du début des valeurs d'en-tête (après le :
).
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui accepte et transmet les fins de ligne
n
nues dans les lignes de champ. - Risque : moyen. Voir le bug du transducteur 16.
- Charge utile :
GET / HTTP/1.1rnHost: arnUseless:nnGET / HTTP/1.1rnrn
- Programmes concernés :
- Gunicorne :
- 2 juin 2023 : signalé par e-mail.
- 31 janvier 2024 : signalé via un problème GH.
- 31 janvier 2024 : reste inchangé.
- Les octets
xa0
et x85
sont supprimés des extrémités des noms d'en-tête, avant le :
.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui accepte et transmet
xa0
ou x85
dans les noms d'en-tête. - Risque : moyen. Voir le bug du transducteur 6.
- Charge utile :
GET / HTTP/1.1rnHost: arnContent-Lengthx85: 10rnrn0123456789
- Programmes concernés :
- Gunicorne :
- 27 juin 2023 : signalé par e-mail.
- 25 décembre 2023 : corrigé dans le commit.
-
,chunked
est traité comme un encodage distinct de chunked
.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui transmet la valeur
Transfer-Encoding
,chunked
telle quelle, et l'interprète comme équivalente à chunked
. - Risque : élevé. Voir le bug du transducteur 9.
- Charge utile :
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: ,chunkedrnContent-Length: 5rnrn0rnrn
- Programmes concernés :
- Gunicorne :
- 6 novembre 2023 : signalé via le problème GH.
- 25 décembre 2023 : corrigé dans le commit.
- Mangouste:
- 6 novembre 2023 : signalé via le problème GH.
- 1er décembre 2023 : corrigé dans le commit.
- Passager:
- 6 novembre 2023 : signalé par e-mail.
- 22 janvier 2024 : corrigé dans la version.
- Les tailles de fragments non valides sont interprétées comme leur préfixe valide le plus long.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui accepte et transmet des tailles de morceaux avec un préfixe invalide (par exemple avec le préfixe
0x
). - Risque : élevé. Voir les bugs de transducteur 2 et 19.
- Charge utile :
GET / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn0_2ernrnGET / HTTP/1.1rnHost: arnContent-Length: 5rnrn0rnrn
- Programmes concernés :
- H2O :
- 1er août 2023 : signalé par e-mail.
- 12 décembre 2023 : Corrigé en PR.
- OpenLiteSpeed :
- 31 juillet 2023 : signalé par e-mail.
- 10 août 2023 : corrigé dans OLS 1.7.18.
- WEBrick :
- 9 novembre 2023 : signalé via le problème GH.
- 3 février 2024 : corrigé dans PR.
- Les requêtes avec plusieurs en-têtes
Content-Length
contradictoires sont acceptées, en donnant la priorité au premier.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui accepte et transmet les requêtes avec 2 en-têtes
Content-Length
, en donnant la priorité au dernier. - Risque : moyen. Voir le bug du transducteur 22.
- Charge utile :
GET / HTTP/1.1rnHost: arnContent-Length: 1rnContent-Length: 0rnrnZ
- Programmes concernés :
- H2O :
- 30 novembre 2023 : signalé par e-mail.
- 10 juillet 2024 : signalé via un problème GH.
- 10 juillet 2024 : reste inchangé.
- OpenLiteSpeed :
- 26 juin 2024 : signalé via un problème GH.
- 10 juillet 2024 : reste inchangé.
- Dépassement d'entier 8 bits dans les numéros de version HTTP.
- Cas d'utilisation : ???
- Exigences : N/A
- Risque : Aucun
- Charge utile :
GET / HTTP/4294967295.255rnrn
- Programmes concernés :
- Libévent :
- 17 janvier 2024 : PR soumis.
- 18 janvier 2024 : Corrigé lors de la fusion.
- Les tailles de morceaux sont analysées à l'aide de
strtoll(,,16)
, donc les préfixes 0x
, +
et -
sont acceptés par erreur.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui interprète la taille des morceaux comme leur préfixe valide le plus long, mais les transmet tels quels.
- Risque : moyen. Voir le bug du transducteur 2.
- Charge utile :
GET / HTTP/1.1rnTransfer-Encoding: chunkedrnrn
- Programmes concernés :
- Libévent :
- 18 janvier 2024 : PR soumis.
- 18 février 2024 : Corrigé lors de la fusion.
- OpenLiteSpeed :
- 2 août 2023 : signalé par e-mail.
- 11 août 2023 : corrigé dans OLS 1.7.18.
- Les en-têtes
Content-Length
négatifs peuvent être utilisés pour forcer le serveur dans une boucle occupée infinie.
- Cas d'utilisation : DoS
- Exigences : Aucune.
- Risque : élevé. Ce bug est trivial à exploiter.
- Charge utile :
GET / HTTP/1.1rnHost: arnContent-Length: -48rnrn
- Programmes concernés :
- Mangouste:
- 27 avril 2023 : signalé par e-mail.
- 16-18 mai 2023 : corrigé dans les commits 4663090, 926959a et 2669991.
- Attribué CVE-2023-34188.
- Le bloc d'en-tête HTTP est tronqué à la réception d'un en-tête sans nom ni valeur.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui transmet les noms d'en-tête vides.
- Risque : moyen. Voir bonus bonus bug 2.
- Charge utile :
GET / HTTP/1.1rn:rnI: am chopped offrnrn
- Programmes concernés :
- Mangouste:
- 26 juin 2023 : signalé via le problème GH.
- 29 juin 2023 : corrigé dans le commit 415bbf2.
- Les noms d'en-tête peuvent être séparés des valeurs uniquement par l'espace ; non
:
obligatoire.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui transmet les lignes d'en-tête qui ne contiennent pas de
:
. - Risque : moyen. Voir le bug du transducteur 14.
- Charge utile :
GET / HTTP/1.1rnContent-Length 10rnrn0123456789
- Programmes concernés :
- Mangouste:
- 7 juillet 2023 : signalé via le problème GH.
- 7 juillet 2023 : corrigé dans le commit 5dff282.
- Les en-têtes
Content-Length
non valides sont interprétés comme équivalents à leur préfixe valide le plus long.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui transmet les valeurs
Content-Length
avec des préfixes non valides (par exemple 0x
ou +
) - Risque : élevé. Voir le bug du transducteur 1.
- Charge utile :
GET / HTTP/1.1rnContent-Length: 1ZrnrnZ
- Programmes concernés :
- Mangouste:
- 31 juillet 2023 : signalé via un problème GH
- 17 août 2023 : corrigé dans le commit.
- OpenLiteSpeed :
- 31 juillet 2023 : signalé par e-mail.
- 10 août 2023 : corrigé dans OLS 1.7.18.
- Le bloc d'en-tête peut se terminer de manière incorrecte sur
rnrX
, où X
peut être n'importe quel octet.
- Cas d'utilisation : ???
- Exigences : Un transducteur qui transmet les noms d'en-tête commençant par
r
, ou autorise r
comme espace de début de ligne de pliage de ligne. - Risque : Faible. Je ne connais pas un tel transducteur.
- Charge utile :
GET / HTTP/1.1rnHost: arnrZGET /evil: HTTP/1.1rnHost: arnrn
- Programmes concernés :
- Noeud.js :
- 7 juillet 2023 : signalé via le rapport HackerOne.
- 31 juillet 2023 : corrigé dans le commit llhttp.
- 16 septembre 2023 : corrigé dans la validation de nœud.
- Les lignes de fragments se terminent de manière incorrecte sur
rX
, où X
peut être n'importe quel octet.
- Cas d'utilisation : demande de contrebande.
- Exigences : Un transducteur qui transmet
r
dans l'espace facultatif dans un chunk-ext. - Risque : élevé. Voir le bug du transducteur 3.
- Charge utile :
GET / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn5rr;ABCDrn34rnErn0rnrnGET / HTTP/1.1rnHost: arnContent-Length: 5rnrn0rnrn
- Programmes concernés :
- Noeud.js :
- 9 juillet 2023 : signalé via le commentaire de HackerOne.
- 31 juillet 2023 : corrigé dans le commit llhttp.
- 16 septembre 2023 : corrigé dans la validation de nœud.
- Les en-têtes
Content-Length
sont interprétés avec strtoll(,,0)
, donc les premiers 0
, +
, -
et 0x
sont mal interprétés.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui transmet
0
s principaux dans les valeurs Content-Length
, ce qui est autorisé par la norme. - Risque : élevé. Ceci est exploitable par rapport aux transducteurs conformes aux normes.
- Charge utile :
GET / HTTP/1.1rnHost: whateverrnContent-Length: 010rnrn01234567
- Programmes concernés :
- OpenLiteSpeed :
- 31 juillet 2023 : signalé par e-mail.
- 10 août 2023 : corrigé dans OLS 1.7.18.
- Les requêtes avec plusieurs en-têtes
Content-Length
en conflit sont acceptées, en donnant la priorité au dernier.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui accepte et transmet les requêtes avec 2 en-têtes
Content-Length
, en donnant la priorité au premier. - Risque : Faible. Je ne connais aucun transducteur de ce type, mais l'existence d'un tel transducteur semble extrêmement probable.
- Charge utile :
GET / HTTP/1.1rnHost: arnContent-Length: 0rnContent-Length: 1rnrnZ
- Programmes concernés :
- HTTP rapide :
- 4 février 2024 : signalé par e-mail.
- 11 février 2024 : corrigé dans le commit.
-
r
est autorisé dans les valeurs d'en-tête.
- Cas d'utilisation : ???
- Exigences : Un transducteur qui interprète et transmet mal
r
dans les valeurs d'en-tête. - Risque : Faible. Je ne connais aucun transducteur de ce type.
- Charge utile :
GET / HTTP/1.1rnHost: whateverrnHeader: varluernrn
- Programmes concernés :
- OpenLiteSpeed :
- 31 juillet 2023 : signalé par e-mail.
- 10 août 2023 : corrigé dans OLS 1.7.18.
- Les valeurs d'en-tête sont tronquées à
x00
.
- Cas d'utilisation : contournement de l'ACL
- Exigences : Un transducteur qui transmet
x00
dans les valeurs d'en-tête. - Risque : moyen. Voir le bug du transducteur 12.
- Charge utile :
GET / HTTP/1.1rnHost: whateverrnTest: testx00THESE BYTES GET DROPPEDrnConnection: closernrn
- Programmes concernés :
- OpenLiteSpeed :
- 3 novembre 2023 : signalé par e-mail.
- 10 juillet 2024 : Fixé au plus tard à cette date.
- Libévent :
- 29 janvier 2024 : signalé via l'avis de sécurité de GH.
- 31 janvier 2024 : reste inchangé.
- Les retours chariot sont transmis dans l'espace facultatif suivant le point-virgule dans une extension de bloc.
- Cas d'utilisation : demande de contrebande
- Exigences : Un serveur qui traite
rr
comme équivalent à rn
à cet emplacement. - Risque : élevé. Voir le bug du serveur 31.
- Charge utile :
POST /abc HTTP/1.1rnTransfer-Encoding: chunkedrnHost: h2o.http-garden.usrnrn41;a=brrXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrn0rnrnGET /bad_path/pwned HTTP/1.1rnHost: arnContent-Length: 412rnrn0rnrnGET /def HTTP/1.1rnHost: h2o.http-garden.usrnrn
- Programmes concernés :
- Réseau de diffusion de contenu Akamai :
- 3 décembre 2023 : signalé par e-mail.
- 10 juillet 2024 : Fixé au plus tard à cette date.
- Les noms d’en-tête peuvent continuer sur plusieurs lignes.
- Cas d’utilisation : demande de contrebande.
- Exigences : un transducteur qui transmet les lignes d'en-tête qui ne contiennent pas de
:
. - Risque : moyen. Voir le bug du transducteur 14.
- Charge utile :
POST / HTTP/1.1rnHost: whateverrnTransfer-rnEncoding: chunkedrnContent-Length: 5rnrn0rnrn
- Programmes concernés :
- Passager:
- 6 novembre 2023 : signalé par e-mail.
- 22 janvier 2024 : corrigé dans la version.
-
Content-Length
vide dans les requêtes est interprétée comme « lecture jusqu'à expiration du délai ».
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui accepte et transmet les valeurs d'en-tête
Content-Length
vides et les traite comme équivalentes à 0. - Risque : moyen. Voir les bugs de transducteur 5 et 11.
- Charge utile :
GET / HTTP/1.1rnHost: localhostrnContent-Length: rnrnGET / HTTP/1.1rnHost: localhostrnrn
- Programmes concernés :
- Puma:
- 16 juin 2023 : signalé par e-mail.
- 17 août 2023 : corrigé dans Puma 6.3.1 et 5.6.7. Voir avis.
- Les corps des messages fragmentés se terminent sur
rnXX
, où XX
peut être constitué de deux octets quelconques.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui préserve les champs de fin et n'ajoute pas d'espace entre les valeurs
:
et dans les champs de fin. (ATS est l'un de ces serveurs) - Risque : élevé. Les exigences pour exploiter ce bug n'exigent pas que le transducteur viole les normes.
- Charge utile :
GET / HTTP/1.1rnTransfer-Encoding: chunkedrnrn0rnX:POST / HTTP/1.1rnrn
- Programmes concernés :
- Puma:
- 31 juillet 2023 : signalé par e-mail.
- 17 août 2023 : corrigé dans Puma 6.3.1 et 5.6.7. Voir avis.
- Attribué CVE-2023-40175.
- Les méthodes et versions HTTP ne sont pas validées.
- Cas d'utilisation : ???
- Exigences : N/A
- Risque : Aucun.
- Charge utile :
x00 / HTTP/............0596.7407.rnrn
- Programmes concernés :
- Serveuse:
- 17 octobre 2023 : PR soumis.
- 4 février 2024 : Corrigé lors de la fusion de PR.
-
xa0
et x85
sont supprimés du début et de la fin des valeurs d'en-tête, à l'exception de l'en-tête Transfer-Encoding
.
- Cas d'utilisation : contournement de l'ACL de la valeur d'en-tête
- Exigences : Un transducteur qui accepte et transmet
xa0
et x85
en place. - Risque : moyen. La norme permet aux transducteurs de transmettre du texte d'observation dans les valeurs d'en-tête.
- Charge utile :
GET /login HTTP/1.1rnHost: arnUser: x85adminxa0rnrn
- Programmes concernés :
- Serveuse:
- 4 février 2024 : signalé via le problème GH.
- 4 février 2024 : corrigé dans le commit.
- Les valeurs
Content-Length
vides sont interprétées comme équivalentes à 0
et prioritaires sur toutes les valeurs Content-Length
ultérieures.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui transmet les valeurs
Content-Length
vides avant celles non vides et interprète celles non vides. - Risque : élevé. Voir le bug 11 du transducteur.
- Charge utile :
GET / HTTP/1.1rnContent-Length: rnContent-Length: 43rnrnPOST /evil HTTP/1.1rnContent-Length: 18rnrnGET / HTTP/1.1rnrn
- Programmes concernés :
- WEBrick :
- 14 août 2023 : signalé via un problème GH.
- 15 août 2023 : Corrigé en PR.
-
x00
est supprimé des extrémités des valeurs d'en-tête.
- Cas d'utilisation : contournement de l'ACL
- Exigences : Un transducteur qui transmet
x00
dans les valeurs d'en-tête. - Risque : moyen. Voir le bug du transducteur 12.
- Charge utile :
GET / HTTP/1.1rnEvil: evilx00rnrn
- Programmes concernés :
- WEBrick :
- 30 novembre 2023 : signalé via le problème GH.
- 3 février 2024 : corrigé dans PR.
- Tous les codages de transfert inconnus sont traités comme équivalents à
chunked
.
- Cas d'utilisation : demande de contrebande
- Exigences : un transducteur qui transmet les codages de transfert autres que
identity
et chunked
. Ceci est autorisé par la norme. - Risque : élevé. Cela permet la contrebande de demandes contre certains transducteurs conformes aux normes.
- Charge utile :
POST / HTTP/1.1rnHost: arnTransfer-Encoding: bleghrnrn1rnZrn0rnrn
- Programmes concernés :
- HTTP rapide :
- 4 février 2024 : signalé par e-mail.
- 11 février 2024 : corrigé dans le commit.
- Les connexions sont fermées prématurément lorsqu'une requête non valide est acheminée après une requête valide.
- Cas d'utilisation : ???
- Exigences : Aucune.
- Risque : Aucun.
- Charge utile :
GET / HTTP/1.1rnConnection: closernrnInvalidrnrn
- Programmes concernés :
- Mangouste:
- 29 janvier 2024 : signalé via le problème GH.
- 13 février 2024 : corrigé dans le commit.
- Uvicorne :
- 29 janvier 2024 : signalé via le commentaire de discussion de GH.
- 6 février 2024 : corrigé par inadvertance dans le commit.
- Les octets supérieurs à
x80
sont supprimés du début et de la fin des valeurs d’en-tête.
- Cas d'utilisation : multitude de problèmes.
- Exigences : un transducteur qui transmet les en-têtes d'hôte contenant des octets supérieurs à
x80
. - Risque : moyen.
- Charge utile :
POST / HTTP/1.1rnHost: xffaxffrnTransfer-Encoding: xffchunkedxffrnrn1rnZrn0rnrn
- Programmes concernés :
- Chignon:
- 13 février 2024 : signalé via le problème GH.
- 13 février 2024 : reste inchangé.
- Lorsqu'un fragment invalide est reçu, la connexion n'est pas fermée et le début du message suivant est placé après le premier
rn
suivant le fragment invalide.
- Cas d'utilisation : empoisonnement de la file de réponses.
- Exigences : Un transducteur qui transmet les morceaux invalides.
- Risque : moyen.
- Charge utile :
POST / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnrnINVALID!!!rnGET / HTTP/1.1rnHost: whateverrnrn
- Programmes concernés :
- Chéroot :
- 14 février 2024 : signalé via le problème GH.
- 14 février 2024 : reste inchangé.
- Les requêtes pipeline dans le tampon de requête initial sont interprétées comme le corps du message de la première requête dans le tampon, même si elle a un en-tête
Content-Length: 0
.
- Cas d'utilisation : demande de contrebande
- Exigences : Un transducteur qui ne modifie pas les limites des éléments du flux entrant.
- Risque : Faible. Je ne connais aucun transducteur de ce type
- Charge utile :
POST / HTTP/1.1rnContent-Length: 0rnConnection:keep-alivernHost: arnid: 0rnrnPOST / HTTP/1.1rnHost: arnid: 1rnContent-Length: 34rnrn
GET / HTTP/1.1rnHost: arnid: 2rnrn
- Programmes concernés :
- Puma:
- 2 février 2024 : signalé par e-mail.
- 2 février 2024 : corrigé dans le commit.
Bugs du transducteur
Il s’agit de bugs dans la manière dont les transducteurs interprètent, normalisent et transmettent les demandes.
- Les valeurs
Content-Length
préfixées par 0x
sont acceptées et transmises de manière incorrecte, sans validation du corps du message.
- Cas d'utilisation : demande de contrebande
- Exigences : un serveur qui interprète
Content-Length
comme son préfixe valide le plus long, ou interprète Content-Length
avec le préfixe 0x
. - Risque : moyen. Voir les bugs des serveurs 10, 29 et 32.
- Charge utile :
POST / HTTP/1.1rnHost: akamai.my-domain.coolrnContent-Length: 0x10rnrnZ
- Programmes concernés :
- Réseau de diffusion de contenu Akamai :
- 7 septembre 2023 : signalé par e-mail.
- 27 novembre 2023 : notification du correctif par e-mail.
- Les valeurs de taille de bloc non valides sont acceptées et transmises de manière incorrecte.
- Cas d'utilisation : demande de contrebande
- Exigences : Un serveur backend HTTP/1.1
- Risque : élevé. Ce bug était exploitable pour la contrebande de requêtes contre des backends arbitraires.
- Charge utile :
POST / HTTP/1.1rnHost: akamai.my-domain.coolrnTransfer-Encoding: chunkedrnrnZrnZZrnZZZrnrn
- Programmes concernés :
- Réseau de diffusion de contenu Akamai :
- 7 septembre 2023 : signalé par e-mail.
- 27 novembre 2023 : notification du correctif par e-mail.
-
r
est incorrectement autorisé dans les espaces chunk-ext avant le ;
.
- Cas d'utilisation : demande de contrebande
- Exigences : Un serveur qui interprète mal
r
à cet emplacement. - Risque : élevé. Voir le bug du serveur 31.
- Charge utile :
POST / HTTP/1.1rnHost: server.my-domain.coolrnTransfer-Encoding: chunkedrnrn2rr;arn02rn41rn0rnrnGET /bad_path/pwned HTTP/1.1rnHost: arnContent-Length: 430rnrn0rnrnGET / HTTP/1.1rnHost: server.my-domain.coolrnrn
- Programmes concernés :
- Réseau de diffusion de contenu Akamai :
- 7 septembre 2023 : signalé par e-mail.
- 27 novembre 2023 : notification du correctif par e-mail.
- Serveur de trafic Apache :
- 20 septembre 2023 : signalé via le problème GH.
- 13 février 2024 : Corrigé en PR.
- Équilibreur de charge d'application Google Cloud Classic :
- 13 septembre 2023 : signalé via Google IssueTracker.
- 30 janvier 2024 : Fixé au plus tard à cette date.
- Les messages contenant des fragments non valides sont transférés sans leur corps de message.
- Cas d'utilisation : ???
- Exigences : N/A
- Risque : Aucun.
- Charge utile :
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnrn1r0n
- Programmes concernés :
- Livre:
- 13 juin 2024 : signalé via un problème GH.
- 14 juin 2024 : corrigé dans le commit.
- Les en-têtes
Content-Length
vides sont transmis de manière incorrecte.
- Cas d'utilisation : demande de contrebande
- Exigences : un serveur qui interprète les valeurs
Content-Length
vides comme autre chose que 0 - Risque : moyen. Voir le bug du serveur 38.
- Charge utile :
GET / HTTP/1.1rnhost: whateverrncontent-length: rnrn
- Programmes concernés :
- Serveur de trafic Apache :
- 2 août 2023 : signalé via le problème GH.
- 6 août 2023 : corrigé via PR.
- Les octets non autorisés sont acceptés et transmis dans les noms d'en-tête.
- Cas d'utilisation : demande de contrebande
- Exigences : un serveur qui interprète mal ces octets non valides dans les noms d'en-tête.
- Risque : moyen. Voir le bug du serveur 41.
- Charge utile :
GET / HTTP/1.1rnHost: fanoutrnHeaderx85: valuernrn
- Programmes concernés :
- Serveur de trafic Apache :
- 29 juin 2023 : signalé par e-mail.
- 18 septembre 2023 : signalé via le problème GH.
- 31 janvier 2024 : reste inchangé.
- OpenBSD relayé :
- 10 novembre 2023 : signalé par e-mail.
- 28 novembre 2023 : corrigé dans le commit.
- Les tailles de fragments sont interprétées comme leur préfixe valide le plus long et réémis.
- Cas d'utilisation : demande de contrebande
- Exigences : Un serveur qui interprète les préfixes
0_
ou 0x
sur la taille des morceaux. - Risque : élevé. Voir les bogues du serveur 1 et 25, et le bogue du transducteur 19.
- Charge utile:
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnrn1these-bytes-never-get-validatedrnZrn0rnrn
- Programmes affectés:
- APACHE TRACMING Server:
- 10 octobre 2023: signalé via le numéro de GH.
- 13 février 2024: Fixé en pr.
- Place d'espace :)
-
Transfer-Encoding: ,chunked
sont transmis intacts et interprétés comme équivalents à chunked
.
- Cas d'utilisation: demande de contrebande
- Exigences: un serveur qui ignore les S et les gâteries
Transfer-Encoding
inconnues ,chunked
distincts de chunked
. - Risque: élevé. Voir Bogue du serveur 21.
- Charge utile:
POST / HTTP/1.1rnHost: arnTransfer-Encoding: ,chunkedrnrn0rnrn
- Programmes affectés:
- Azure CDN:
- 15 octobre 2023: Rapport via le rapport de vulnérabilité du MSRC.
- 29 novembre 2023: Fixé au plus tard au plus tard cette date.
- 12 décembre 2023: "Cette affaire ne répond pas à la barre pour l'entretien par le MSRC alors que la contrebande de HTTP ne considère pas une vulnérabilité et nous fermerons cette affaire."
- nghttpx:
- 14 octobre 2023: rapporté par e-mail.
- 17 octobre 2023: Fixé en pr.
-
r
est mal transmis dans les valeurs d'en-tête.
- Cas d'utilisation: demande de contrebande
- Exigences: un serveur qui traite
r
comme équivalent à rn
dans les champs d'en-tête. - Risque: moyen. Voir Bogue du serveur 13.
- Charge utile:
GET / HTTP/1.1rnInvalid-Header: thisrvaluerisrinvalidrnrn
- Équilibreur de chargement de l'application classique de Google Cloud:
- 7 septembre 2023: signalé via Google IssueTracker.
- 30 janvier 2024: Fixé au plus tard au plus tard cette date.
- Les en-têtes
Content-Length
vides sont mal transmis, même en présence d'autres en-têtes Content-Length
, tant que l'en-tête vide Content-Length
arrive en premier.
- Cas d'utilisation: demande de contrebande
- Exigences: un serveur qui interprète les valeurs
Content-Length
vides comme 0 et accepte plusieurs en-têtes Content-Length
dans les demandes entrantes, en priorisant le premier. - Risque: moyen. Voir Bogue du serveur 42.
- Charge utile:
GET / HTTP/1.1rnhost: whateverrncontent-length: rncontent-length: 59rnrnPOST /evil HTTP/1.1rnhost: whateverrncontent-length: 34rnrnGET / HTTP/1.1rnhost: whateverrnrn
- Programmes affectés:
- Haproxy:
- 2 août 2023: signalé via le numéro de GH.
- 9 août 2023: Correction de Commit.
- 10 août 2023: attribué CVE-2023-40225.
-
x00
est transmis en valeurs d'en-tête.
- Cas d'utilisation: contournement de l'ACL
- Exigences: un serveur qui tronque les valeurs d'en-tête à
x00
. - Risque: moyen. Voir les bogues du serveur 35 et 43 et le bogue du transducteur 20.
- Charge utile:
GET / HTTP/1.1rnHost: google.comx00.kallus.orgrnrn
- Programmes affectés:
- Haproxy:
- 19 septembre 2023: rapporté par e-mail.
- 31 janvier 2024: Fixé dans la commission.
- OpenLitespeed:
- 3 novembre 2023: rapporté par e-mail.
- 10 juillet 2024: Fixé au plus tard au plus tard cette date.
- Bare
n
est accepté comme un terminateur de ligne.
- Cas d'utilisation: ???
- Exigences: N / A
- Risque: aucun
- Charge utile:
GET / HTTP/1.1rnTransfer-Encoding: chunkedrnrnarn0123456789n0rnrn
- Programmes affectés:
- Haproxy:
- 25 janvier 2024: rapporté par e-mail.
- 30 janvier 2024: Fixe dans Commmits 7b737da et 4837E99.
- Les lignes de champ avec non
:
sont transmises telles quelles.
- Cas d'utilisation: demande de contrebande
- Exigences: un serveur backend qui interprète mal les lignes de champ d'en-tête avec non
:
. - Risque: moyen. Voir les bogues du transducteur 28 et 37.
- Charge utile:
GET / HTTP/1.1rnHost: whateverrnTenst: testrnConnection: closernrn
- Programmes affectés:
- OpenLitespeed:
- 3 novembre 2023: rapporté par e-mail.
- 10 juillet 2024: Fixé au plus tard au plus tard cette date.
- Les demandes contenant à la fois
Content-Length
et les en-têtes Transfer-Encoding
sont transmises en tant que si la valeur Transfer-Encoding
n'est pas reconnue.
- Cas d'utilisation: demande de contrebande
- Exigences: un serveur backend qui traite
,chunked
d'équivalent à chunked
et priorise Transfer-Encoding
sur Content-Length
. Ces comportements sont autorisés par les normes. - Risque: élevé. Cela permet de faire du contrebands de serveurs conformes aux normes.
- Charge utile:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: ,chunkedrnContent-Length: 5rnConnection: closernrn0rnrn
- Programmes affectés:
- OpenLitespeed:
- 3 novembre 2023: rapporté par e-mail.
- 10 juillet 2024: Fixé au plus tard au plus tard cette date.
- Livre:
- 4 février 2024: signalé via le numéro de GH.
- 29 mars 2024: Fixé dans la commission.
-
n
n'est pas normalisé à rn
dans les messages transmis.
- Cas d'utilisation: demande de contrebande
- Exigences: un serveur backend qui n'interprète pas
n
comme une ligne se terminant par des lignes d'en-tête. La norme permet aux serveurs de traduire n
vers
. - Risque: élevé. Ce bogue est exploitable contre les serveurs conformes aux normes.
- Charge utile:
GET / HTTP/1.1nHost: whatevernConnection: closenn
- Programmes affectés:
- OpenLitespeed:
- 3 novembre 2023: rapporté par e-mail.
- 31 janvier 2024: Reste non fixé.
- Les corps de message en morceaux contenant un
rn
supplémentaire avant le morceau de terminateur ne sont pas-chonsés sans remplacer l'en-tête Transfer-Encoding
avec Content-Length
.
- Cas d'utilisation: demande de contrebande
- Exigences: aucune.
- Risque: élevé. Ce bogue est exploitable par rapport aux serveurs backend arbitraires.
- Charge utile:
POST / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn17rn0rnrnGET / HTTP/1.1rnrnrnrn0rnrn
- Programmes affectés:
- Ouverte
- 30 novembre 2023: rapporté par e-mail.
- 10 juillet 2024: Fixé au plus tard au plus tard cette date.
-
Transfer-Encoding: ,chunked
sont transmis intacts et ne sont pas interprétés comme équivalents à chunked
.
- Cas d'utilisation: demande de contrebande
- Exigences: un serveur qui interprète
,chunked
, équivalent à chunked
, ce que la norme dit que vous pouvez faire. - Risque: élevé. Il s'agit d'une demande de vulnérabilité de contrebande qui est utilisable contre les backends conformes aux normes.
- Charge utile:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: ,chunkedrnContent-Length: 5rnrn0rnrn
- Programmes affectés:
- OpenBSD Relayd:
- 10 novembre 2023: rapporté par e-mail.
- 28 novembre 2023: Patchée en commit.
- Des tailles de morceaux avec les préfixes
+
, -
et 0x
sont interprétés et transmis.
- Cas d'utilisation: demande de contrebande
- Exigences: un serveur qui interprète les tailles de morceaux comme leur préfixe valide le plus long.
- Risque: élevé. Voir Bogue du serveur 22.
- Charge utile:
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnrn-0x0rnrn
- Programmes affectés:
- OpenBSD Relayd:
- 10 novembre 2023: rapporté par e-mail.
- 28 novembre 2023: Patchée en commit.
- Livre:
- 10 octobre 2023: signalé via le numéro de GH.
- 11 octobre 2023: Correction de Commits 60A4F42 et F70DB92.
- Les en-têtes contenant
x00
ou n
sont concaténés dans la valeur de l'en-tête précédente.
- Cas d'utilisation: demande de contrebande
- Exigences: tout serveur backend conforme aux normes.
- Risque: élevé. Il s'agit d'une vulnérabilité générique de contrebande.
- Charge utile:
GET / HTTP/1.1rna:brncx00rnrn
- Programmes affectés:
- OpenBSD Relayd:
- 10 novembre 2023: rapporté par e-mail.
- 29 novembre 2023: Patchée en commit.
- Les corps de message sont éliminés des demandes
GET
sans retirer leurs en-têtes Content-Length
.
- Cas d'utilisation: demande de contrebande
- Exigences: tout serveur backend qui prend en charge le pipeline.
- Risque: élevé. Il s'agit d'une vulnérabilité générique de contrebande.
- Charge utile:
GET / HTTP/1.1rnContent-Length: 10rnrn1234567890
- Programmes affectés:
- OpenBSD Relayd:
- 28 novembre 2023: rapporté par e-mail.
- 1er décembre 2023: Cordiqué en commit.
- Les demandes contenant plusieurs en-têtes
Content-Length
sont transmises, en hiérarchiser le dernier.
- Cas d'utilisation: demande de contrebande
- Exigences: un serveur qui accepte les demandes contenant plusieurs en-têtes
Content-Length
, hiérarchisant le premier. - Risque: élevé. Voir Bogue du serveur 23.
- Charge utile:
POST / HTTP/1.1rnHost: arnContent-Length: 0rnContent-Length: 31rnrnGET /evil HTTP/1.1rnHost: arnrn
- Programmes affectés:
- OpenBSD Relayd:
- 30 novembre 2023: rapporté par e-mail.
- 10 juillet 2024: Reste non fixé.
- Les demandes contenant à la fois
Content-Length
et Transfer-Encoding
sont transmises.
- Cas d'utilisation: demande de contrebande
- Exigences: un serveur qui hiérarchise
Content-Length
sur Transfer-Encoding
, ou ne prend pas en charge Transfer-Encoding: chunked
. - Risque: élevé. Ceci est le vecteur classique de la demande de contrebande.
- Charge utile:
POST / HTTP/1.1rnHost: arnContent-Length: 5rnTransfer-Encoding: chunkedrnrn0rnrn
- Programmes affectés:
- OpenBSD Relayd:
- 30 novembre 2023: rapporté par e-mail.
- 10 juillet 2024: Reste non fixé.
- Les tailles de morceaux préfixées en espace sont acceptées et transmises.
- Cas d'utilisation: ???
- Exigences: N / A
- Risque: aucun
- Charge utile:
POST / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn 0rnrn
- Programmes affectés:
- OpenBSD Relayd:
- 30 novembre 2023: rapporté par e-mail.
- 31 janvier 2024: Reste non fixé.
- Livre:
- 15 octobre 2023: signalé via le numéro de GH.
- 25 novembre 2023: Correction de Commit.
- Les demandes contenant plusieurs
Transfer-Encoding: chunked
sont transmis et traités comme équivalents à un seul en-tête de ce type.
- Cas d'utilisation: demande de contrebande
- Exigences: un serveur qui traite plusieurs
Transfer-Encoding: chunked
comme n'étant pas équivalent à No Transfer-Encoding: chunked
ou rejoint plusieurs en-têtes Transfer-Encoding
, et traite chunked,chunked
comme distinct de chunked
. - Risque: moyen. Voir Bogue du serveur 21.
- Charge utile:
POST / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnTransfer-Encoding: chunkedrnrn0rnrn
- Programmes affectés:
- Livre:
- 7 octobre 2023: signalé via le numéro de GH.
- 12 octobre 2023: Correction de Commit.
Bugs bonus
Ce sont des bugs que nous avons trouvés incidemment simplement en créant le jardin HTTP et en envoyant un exemple de demande. Ils ne comptent pas vraiment parce qu'ils n'avaient pas besoin d'utiliser le jardin, mais je pense que je devrais les documenter de toute façon.
- L'argument nul transmis à
memcpy
dans les déclencheurs du comportement non défini.
- Cas d'utilisation: ???
- Exigences: N / A
- Risque: aucun
- Charge utile: toute demande avec un corps de message vide qui sera transmis à un backend proxy_fcgi.
- Programmes affectés:
- Apache httpd:
- 2 décembre 2023: rapporté via le problème de Bugzilla.
- 19 décembre 2023: Fixe dans la révision 1914775.
- uwsgi:
- 1er janvier 2024: signalé via le numéro de GH.
- 8 février 2024: patchée en pr.
- Use-après-libre.
- Cas d'utilisation: DOS
- Exigences: le serveur utilise
attach_server_session_to_client
- Risque: faible. Bien que cela ne s'écrase ATS, il est si facile de remarquer qu'une personne raisonnable n'aurait pas déployé une instance vulnérable en production.
- Charge utile: toute demande du tout.
- Programmes affectés:
- APACHE TRACMING Server:
- 31 juillet 2023: signalé via le numéro de GH.
- 13 septembre 2023: Fixé via PR.
- L'envoi d'un octet supplémentaire après une demande avec un corps de message en morceaux écrase le serveur avec un segfault.
- Cas d'utilisation: DOS
- Exigences: FastCGI est activé.
- Risque: élevé. Il s'agit d'un bug trivial à exploiter qui plante le serveur.
- Charge utile:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnrn0rnrnx00
- Programmes affectés:
- OpenBSD HTTPD:
- 1er novembre 2023: rapporté par e-mail.
- 8 novembre 2023: Correction dans la validation.
- Les corps de demande de morceaux entrants sont repris avant l'envoi de la réponse.
- Cas d'utilisation: DOS
- Exigences: FastCGI est activé.
- Risque: moyen. Cela invalidera le flux de demande pour tout message de morceaux, qui ruinera les connexions partagées.
- Charge utile:
POST / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnrn1rnZrn0rnrn
- Programmes affectés:
- OpenBSD HTTPD:
- 4 janvier 2024: rapporté par e-mail.
- 31 janvier 2024: Reste non fixé.
- Dereference nul à réception de toute demande.
- Cas d'utilisation: DOS
- Exigences:
mod_dir
est activé avec certaines options de configuration. - Risque: faible. Ce bogue est si évident qu'aucun sain d'esprit ne déploierait un serveur vulnérable.
- Charge utile: n'importe quoi.
- Programmes affectés:
- Apache httpd:
- 24 janvier 2024: rapporté via le problème de Bugzilla.
- 24 janvier 2024: Reste non fixé.
Bogues bonus bonus
Ce sont des insectes que nous avons trouvées lorsque le jardin avait un support HTTP / 2. Nous avons supprimé le support HTTP / 2 car il était un peu à moitié cuit, mais nous aimerions pouvoir l'ajouter!
- Les caractères de l'espace blanc ne sont pas éliminés des valeurs de champ pendant les rétrogradations HTTP / 2 à HTTP / 1.1.
- Cas d'utilisation: ???
- Exigences: N / A
- Risque: aucun
- Charge utile:
PRI * HTTP/2.0rnrnSMrnrnx00x00x00x04x00x00x00x00x00x00x00Ex01x05x00x00x00x01x00n:authoritytlocalhostx00x05:pathx01/x00x07:methodx03GETx00x07:schemex04httpx00x05test1x03tat
- Programmes affectés:
- Envoyé:
- 7 juillet 2023: rapporté via le numéro de GH.
- 7 octobre 2023: Reste non fixé.
- H2O:
- 7 juillet 2023: rapporté via le numéro de GH.
- 18 juillet 2023: Fixé dans PR # 3256.
- Cache de vernis:
- 7 juillet 2023: rapporté via le numéro de GH.
- 22 août 2023: Correction de Commit.
- Les noms d'en-tête vides sont conservés entre la traduction HTTP / 2 à HTTP / 1.1, conduisant à la production de HTTP / 1.1 non valide.
- Cas d'utilisation: DOS
- Exigences: Un déclassement HTTP / 2 est effectué et le backend rejette les noms d'en-tête vides (comme la plupart le font).
- Risque: faible. Ce bogue peut être utilisé pour fabriquer un serveur raisonnable 400, ce qui cassera le partage de connexion.
- Charge utile:
PRI * HTTP/2.0rnrnSMrnrnx00x00x00x04x00x00x00x00x00x00x00=x01x05x00x00x00x01x00n:authoritytlocalhostx00x05:pathx01/x00x07:methodx03GETx00x07:schemex04httpx00x00x00
- Programmes affectés:
- H2O:
- 7 juillet 2023: rapporté via le numéro de GH.
- 18 juillet 2023: Fixé dans PR # 3256.