web-dev-qa-db-fra.com

Comment la définition de l'origine sur null dans une demande CORS redirigée protège-t-elle contre une attaque de député confuse?

Extrait de ici :

Si une ressource d'origine croisée redirige vers une autre ressource d'une nouvelle origine, le navigateur définira la valeur de l'en-tête Origin sur null après la redirection. Cela évite les attaques suppléantes confuses supplémentaires, mais le coût de rendre difficile le déplacement transparent des ressources CORS qui prennent en charge les informations d'identification (basées sur les cookies) et les requêtes simples sur des domaines avec des codes d'état 3xx comme on peut le faire avec des ressources non-CORS. Il est possible de rediriger des ressources de même origine vers un emplacement d'origine croisée (saut unique uniquement) car les navigateurs appliqueront de manière transparente l'algorithme CORS à ces demandes et incluront l'en-tête Origin pour le premier saut.

Comment le fait de conserver l'en-tête Origin pour la demande redirigée permettrait-il une attaque de député confuse?

10
Raniz

Ce paragraphe est écrit de façon lacunaire et l'utilisation de "redirige vers une autre ressource à une nouvelle origine" dans la première phrase n'est pas tout à fait correcte.

Voici un exemple simple et artificiel. Supposons que vous soyez malveillant et qu'il existe une application Web qui utilise les services d'une API privilégiée via CORS, de sorte que l'origine de l'application Web est approuvée par l'API privilégiée. Et disons que vous voulez avoir accès aux données derrière cette API privilégiée, mais votre origine n'est bien sûr pas fiable.

Vous créez un service simple et utile que vous proposez via CORS, et vous obtenez l'application Web pour inclure votre service dans une page - n'importe quelle page - sous son origine de confiance. Cette page n'a pas besoin d'accéder à l'API privilégiée.

(Bien sûr, une fois que vous êtes dans la page de votre victime, vous pouvez faire ce que vous voulez, mais supportez-moi.)

Si vous décidez de changer votre service CORS de l'émission d'un 200 avec des données pour émettre un 3xx vers l'API privilégiée - traversant les domaines de ressources - cela crée un problème de confiance.

L'origine réelle - la page qui a incorporé votre ressource - sera approuvée par l'API privilégiée. Mais il n'a pas émis la demande, et il peut ne pas vouloir parler à l'API privilégiée à ce stade particulier.

Au lieu de cela, vous avez émis la redirection et, même si vous êtes approuvé, en partie, par l'Origin, vous n'êtes pas approuvé par l'API privilégiée. Si le navigateur suit votre 3xx et envoie le long de l'Origine, vous obtenez de façon illégitime se fier à la confiance accordée par l'API privilégiée à l'Origine.

Que doit faire le navigateur? Une réponse raisonnable est de ne pas suivre du tout le 3xx, mais cela interdirait les cas d'utilisation pour lesquels la confiance n'est pas une préoccupation. L'émission de la demande avec une origine "nulle" autorise ces cas d'utilisation, mais empêche l'exploitation de la confiance que l'envoi le long de l'en-tête d'origine d'origine permettrait.

8
Jonah Benton

Regardez l'en-tête Origin en termes de défense CSRF.

Disons les hôtes a.com ...

Si l'Origine était conservée après les redirections cross-Origin, l'attaque CSRF suivante serait possible:

  1. Un utilisateur se connecte au site Web a.com .
  2. L'utilisateur visite une page qui fait une demande CORS à b.com avec Origin: https://a.com.
  3. b.com répond avec une redirection vers un point de terminaison protégé par CSRF sur a.com .
  4. Le navigateur de l'utilisateur suit la redirection et demande l'URL avec Origin: https://a.com.
  5. Le serveur a.com traite la demande car il pense qu'elle provient de a.com , ce qui n'est pas tout à fait exact car ...

    • b.com avait un contrôle total sur l'URL demandée, y compris les paramètres de requête.
    • toutes les données du corps de la demande auraient été initialement destinées à b.com , et non a.com , et la charge utile des données peut avoir été soigneusement conçue pour être nuisible lorsqu'elle est soumise au point de terminaison a.com . (Disons que c'était un POST avec une redirection 307.)

Le fait que a.com envoie des demandes CORS à b.com n'implique pas qu'il approuve b.com complètement.

Ceci est discuté dans un Chrome Chrome: https://bugs.chromium.org/p/chromium/issues/detail?id=465517


Si l'en-tête Origin contient une liste de toutes les origines de la chaîne de redirection, il peut être possible de créer des applications qui tolèrent les redirections entre origines en toute sécurité. Malheureusement, les fournisseurs de navigateurs n'ont jamais implémenté cela. Du même document CORS for Developers cité dans la question:

Bien que la spécification CORS implique que vous pouvez répertorier plusieurs origines dans l'en-tête Access-Control-Allow-Origin, en pratique, une seule valeur est autorisée par tous les navigateurs modernes. La syntaxe à valeurs multiples était destinée à permettre à toutes les origines d'une chaîne de redirection d'être répertoriées, comme le permet la RFC6454, mais cela n'a jamais été implémenté.

3
Andre D