web-dev-qa-db-fra.com

Pourquoi doubler les jetons de la CSRF devrait-il être des nombres aléatoires cryptographiquement de forts forts?

Je passais juste à travers la triche de l'Owasp pour la prévention de la CSRF. En ce qui concerne la méthode Double Soumettre la méthode de cookies , il dit:

le site devrait générer une valeur de pseudorandom (cryptographiquement forte)

Cette méthode repose complètement sur le fait que le cookie/en-tête ne peut pas être injecté par l'attaquant.

Un attaquant ne peut lire aucune donnée envoyée à partir du serveur ni modifier les valeurs de cookies, par la même stratégie d'origine.

Ensuite, pourquoi la pseudo-aléatoire devrait-elle être cryptographique?

21
thefourtheye

Réponse courte: pour empêcher la brute de forcer le jeton CSRF.

Prenons un exemple trivial: disons que votre jeton est une seule chiffre, acceptant des valeurs de 0 à 9.
Maintenant sûr, un attaquant ne peut pas lire cette valeur de la cookie ou de l'en-tête, mais elle ne doit pas nécessairement que l'attaque envoie 10 demandes de CSRF, une avec chaque valeur possible. L'un d'entre eux sera correct.

L'utilisation d'une valeur aléatoire cryptographiquement forte empêchera cela et peut empêcher l'attaquant d'essayer d'accabler cette attaque (en ayant l'attaque d'envoi de 1000 demandes au lieu de 10, ou 10 000, ou ...)

19
AviD

Combinant le meilleur des deux réponses:

  1. La longueur du jeton doit être proportionnelle au nombre de victimes et au nombre de demandes par victime. Si un attaquant convainc X victimes de naviguer sur sa page (à titre de spam ou d'attaques de phishing) et chacune tentative de cette page tente Y Différents jetons, vous devez vous protéger contre 2x * y attaques. Par exemple, si votre longueur de jeton est de 16 bits de long, un attaquant doit envoyer 216 emails qui tentent 1 jeton chacun, ou 28 emails qui tentent 28 jetons chacun. Un attaquant peut tester plusieurs jetons en un seul clic à l'aide de JavaScript ou en incorporant plusieurs liaisons d'image malveillantes par page.

  2. Vous souhaitez utiliser un générateur de nombres aléatoires cryptographiquement sécurisé pour empêcher les attaquants de demander des jetons multiples eux-mêmes, puis utilisez la séquence qu'ils doivent prédire quels jetons Autres Les utilisateurs entreront dans un proche avenir.

3
Gili

Ce n'est pas

Cela doit juste être pseudo aléatoire .

Le CSRF n'est pas compatible avec des attaques de force brute. Considérez le vecteur d'attaque:

  1. Utilisateur malveillant artisanal un email spécial ou une page Web avec HTML qui publie sur le site d'intérêt
  2. L'utilisateur est connecté au site d'intérêt et l'ID de session est passé de manière passive (c'est un cookie)
  3. L'utilisateur est trompé en cliquant sur le lien dans la page de messagerie ou de page Web spécialement fabriquée.
  4. Le lien "forge" la demande. Le lien ne doit pas contenir l'identifiant de la session parce que c'est dans le cookie. Et il n'a pas besoin de passer le jeton CSRF trouvé dans l'en-tête (il est passé passivement - c'est un cookie). Mais cela doit contenir le jeton CSRF dans le poste de formulaire.

Il n'y a aucun moyen qu'un pirate informatique va tromper quiconque en cliquant sur un lien des centaines de fois. Même si c'est un script qui envoie une tonne de demandes en un seul clic (en supposant que le pirate informatique a compris comment faire cela-- Navigateurs ne permettez pas à cross-domain AJAX Demandes, donc nous 'Re probablement en train de parler d'une page contenant des centaines de gifs clairs ou quelque chose d'autre totalement gonflé), il ne sera pas en mesure de passer à travers un grand nombre d'espaces de recherche sans chronométrer.

En outre, l'attaquant n'a aucun moyen de déterminer si l'attaque a fonctionné pour une valeur particulière-- C'est un "feu et oublie" attaque.

Donc, l'idée que le jeton CSRF peut être brut forcé est beaucoup extrait au mieux. Le pirate informatique devrait être personnellement connecté, qui est entièrement une attaque différente.

La seule raison pour laquelle vous avez besoin de tout entropie est vraiment, car les attaques CSRF ont tendance à être livrées via le spam. Disons que vous êtes un idiot et votre jeton CSRF ne dispose que de 16 bits d'entropie et le pirate informatique a envoyé 65 536 spams avec le même jeton. 65536/2 ^ 16 = -n de ces attaques réussirait réellement. En supposant que 0% des courriels ont frappé les filtres anti-spam, 100% des utilisateurs les ont ouvert et 100% des utilisateurs se sont connectés à votre application pour le moment où ils ont cliqué sur le lien pervers.

Autre que l'espoir à la ventouse dans une tonne d'utilisateurs, il n'ya aucun moyen de mettre à l'échelle de l'attaque suffisamment grande pour l'appeler une attaque de force brute avec aucune signification.

2
John Wu