web-dev-qa-db-fra.com

Protection CSRF avec en-tête CORS Origin et jeton CSRF

Cette question concerne uniquement la protection contre les attaques de type Cross Site Request Forgery.

Il s’agit en particulier de: La protection via l’en-tête Origin (CORS) est-elle aussi efficace que la protection via un jeton CSRF?

Exemple:

  • Alice est connectée (à l'aide d'un cookie) avec son navigateur à " https://example.com ". Je suppose qu'elle utilise un navigateur moderne.
  • Alice rend visite à " https://evil.com " et le code client de evil.com envoie une sorte de requête à " https://example.com " (classique Scénario CSRF).

Alors:

  • Si nous ne vérifions pas l'en-tête Origin (côté serveur) et aucun jeton CSRF, nous avons un trou de sécurité CSRF.
  • Si nous vérifions un jeton CSRF, nous sommes en sécurité (mais c'est un peu fastidieux).
  • Si nous vérifions l'en-tête Origin, la requête du code côté client de evil.com devrait être bloquée aussi bien que lors de l'utilisation d'un jeton CSRF - sauf s'il est possible que le code de evil.com définisse l'en-tête Origin.

Je sais que cela ne devrait pas être possible avec XHR (voir par exemple Sécurité pour le partage de ressources entre origines ), du moins pas, si nous croyons que la spécification W3C sera correctement mise en œuvre dans tous les navigateurs modernes (peut nous?)

Mais qu’en est-il des autres types de demandes - par exemple, formulaire soumettre? Chargement d'un script/img/... tag? Ou toute autre manière qu'une page peut utiliser (légalement) pour créer une demande? Ou peut-être un piratage JS connu?

Note: je ne parle pas de

  • applications natives,
  • navigateurs manipulés,
  • bogues de script intersite dans la page exemple.com,
  • ...
91
Chris Lercher

sachez que cela ne devrait pas être possible avec XHR (voir par exemple Sécurité pour le partage de ressources entre origines croisées), du moins pas, si nous pensons que la spécification W3C sera correctement mise en œuvre dans tous les navigateurs modernes (pouvons-nous?)

À la fin de la journée, vous devez "faire confiance" au navigateur client pour stocker en toute sécurité les données de l'utilisateur et protéger le côté client de la session. Si vous ne faites pas confiance au navigateur client, vous devriez cesser d'utiliser le Web pour autre chose que du contenu statique. Même si vous utilisez des jetons CSRF, vous faites confiance au navigateur du client pour qu’il obéisse correctement à la règle Politique de même origine .

Bien qu'il y ait eu des vulnérabilités de navigateur antérieures telles que celles de IE 5.5/6. où il a été possible à des attaquants de contourner la politique de même origine et d'exécuter des attaques, vous pouvez généralement vous attendre à ce qu'elles soient corrigées dès que découverts et avec la plupart des navigateurs mis à jour automatiquement, ce risque sera en grande partie atténué.

Mais qu’en est-il des autres types de demandes - par exemple, formulaire soumettre? Chargement d'un script/img/... tag? Ou toute autre manière qu'une page peut utiliser (légalement) pour créer une demande? Ou peut-être un piratage JS connu?

L'en-tête Origin n'est normalement envoyé que pour les requêtes inter-domaines XHR. Les demandes d'images ne contiennent pas l'en-tête.

Note: je ne parle pas de

  • applications natives,

  • navigateurs manipulés,

  • bogues de script intersite dans la page exemple.com,

Je ne sais pas si cela relève des navigateurs manipulés ou non, mais anciennes versions de Flash permettait la définition d'en-têtes arbitraires permettant à un attaquant d'envoyer une requête avec un usurpateur referer en-tête de la machine de la victime pour exécuter une attaque.

39
SilverlightFox

Le contenu Web ne peut pas altérer l'en-tête Origin. De plus, en vertu de la même politique d'origine, une origine ne peut même pas envoyer d'en-têtes personnalisés à d'autres origines. [1]

Ainsi, la vérification de l'en-tête Origin est aussi efficace pour le blocage d'attaques que l'utilisation d'un jeton CSRF.

La principale préoccupation à cet égard est de savoir si cela permet à toutes les demandes légitimes de fonctionner. Le demandeur est au courant de ce problème et a défini la question de manière à exclure les incidents majeurs (aucun ancien navigateur, HTTPS uniquement).

Les vendeurs de navigateurs suivent ces règles, mais qu'en est-il des plugins? Ils pourraient ne pas, mais la question ignore les "navigateurs manipulés". Qu'en est-il des bogues dans le navigateur qui permettent à un attaquant de forger l'en-tête Origin? Il peut y avoir des bogues qui permettent au jeton CSRF de fuir à travers les origines également, il faudrait donc plus de travail pour affirmer que l'un est meilleur que l'autre.

27
guest