web-dev-qa-db-fra.com

Que fait réellement la variable ALLOWED_HOSTS de Django?

Je suis censé définir ALLOWED_HOSTS dans ma Django aux noms d'hôtes qui m'appartiennent)

... empêcher un attaquant d'empoisonner les caches et les e-mails de réinitialisation de mot de passe contenant des liens vers des hôtes malveillants en soumettant des demandes avec un faux en-tête HTTP Host, ce qui est possible même dans de nombreuses configurations de serveurs Web apparemment sûres.

Qu'est-ce que cela signifie réellement? Pourquoi l'attaquant n'utiliserait-il pas simplement l'en-tête d'hôte "correct" et ferait-il la même chose pour réinitialiser les mots de passe? `` Empoisonner les caches '' ressemble également à quelque chose qui serait entre Eve et Bob sur lequel je n'ai aucun contrôle de toute façon ...

18
Nick T

Il m'a fallu un peu de fouille pour le trouver, mais j'ai trouvé cela qui semble répondre à la question:

https://www.djangoproject.com/weblog/2013/feb/19/security/#s-issue-Host-header-poisoning

Problème: empoisonnement de l'en-tête de l'hôte

Plusieurs versions précédentes de la sécurité Django ont tenté de résoudre les problèmes persistants avec l'en-tête de l'hôte HTTP. Django contient du code - et certaines fonctionnalités fournies avec Django lui-même utilise ce code - pour construire une URL complète basée sur la requête HTTP entrante. Selon la configuration, cela utilise l'en-tête Host, et donc un attaquant qui peut provoquer un Django application pour répondre aux en-têtes Host arbitraires peut provoquer Django pour générer et afficher aux utilisateurs finaux des URL sur des domaines arbitraires).

Les versions précédentes de ce problème (voir CVE-2011-4139 et CVE-2012-4520) se sont concentrées sur le resserrement de l'analyse des en-têtes d'hôte par Django, afin d'éliminer les différents moyens par lesquels les attaquants utilisent des techniques telles que les paires nom d'utilisateur/mot de passe dans l'hôte soumis. en-tête - pourrait exploiter cela.

En fin de compte, cependant, Django seul ne peut pas garantir qu'un attaquant ne peut pas soumettre, et provoquer Django à accepter, des en-têtes Host arbitraires. Sécuriser correctement cela dans un déploiement Django requiert en outre la configuration du serveur Web, et la configuration et le niveau de sécurité réalisable varient selon le serveur utilisé.

À la lumière de cela, la méthode get_Host () de Django.http.HttpRequest va maintenant valider l'en-tête Host par rapport à un nouveau paramètre, ALLOWED_HOSTS. Ce paramètre est une liste de chaînes (par défaut, une liste vide) correspondant aux valeurs acceptables pour l'en-tête, avec une certaine prise en charge des caractères génériques.

Le code qui n'utilise pas get_Host () ou les configurations Django qui peuvent déterminer le nom d'hôte actuel sans avoir recours aux en-têtes HTTP (c'est-à-dire lorsque le framework de sites de Django est activé) ne seront pas affectés par cette modification.

Étant donné qu'il s'agit d'un durcissement/resserrement d'un problème précédent, il n'a pas de nouveau numéro CVE.

16
Catskul

James Kettle fournit une bonne écriture sur Attaques d'en-tête d'hôte HTTP pratiques . Ils sont résumés ici avec une description de la stratégie Django ALLOWED_HOSTS.

Vulnérabilités

Vecteur de réinitialisation de mot de passe

La vulnérabilité d'e-mail de réinitialisation de mot de passe à laquelle la documentation fait allusion est le résultat de Django et/ou ses applications utilisant et faisant confiance à la valeur de l'hôte HTTP, qui est fournie par le client (cela ressemble à une mauvaise idée? La valeur Host est copiée directement dans les e-mails de réinitialisation de mot de passe, fournissant un vecteur d'injection pratique.

Empoisonnement du cache

La variation d'empoisonnement du cache repose sur ce comportement, ainsi que sur les différences dans la façon dont l'en-tête Host est géré par les serveurs et les solutions de mise en cache.

HTTP_SERVER vs HTTP ['Hôte']

Comme Kettle le décrit, en raison de la RFC2616, il est possible avec des serveurs conformes d'utiliser une différence entre HTTP_SERVER et HTTP ['Host'] pour fournir des chaînes Host arbitraires.

Analyse de l'hôte

En exploitant différents formats et en utilisant des caractères spéciaux, un attaquant peut provoquer une interprétation malveillante d'un hôte "autorisé" dans différents contextes. Il s'agit à nouveau d'une erreur dans l'application qui a approuvé la chaîne Host.

Solution Django

Comme le résument les notes de version fournies par Catskul, la solution Django consiste à demander à l'utilisateur de placer les hôtes autorisés directement dans le code du projet. En interdisant à tout autre hôte ne correspond pas ALLOWED_HOSTS, le vecteur d'injection est éliminé (approche "liste blanche").

C'est quelque chose d'une solution maladroite, comme le souligne James, mais c'est aussi assez efficace.

Gardez à l'esprit

Il est possible d'utiliser des caractères génériques dans les paramètres d'un projet, auquel cas cette fonctionnalité n'aide en rien à sécuriser.

Un développeur d'applications sécurisées évitera d'utiliser la valeur Hôte HTTP de manière significative.

Références

Carlos Bueno, Cache Poisoning (2008)

10
jtpereyda