FixVibe
Covered by FixVibehigh

Protection CSRF : Se défendre contre les changements d'état non autorisés

Cross-Site Request Forgery (CSRF) reste une menace importante pour les applications Web. Cette recherche explore comment les frameworks modernes comme Django mettent en œuvre la protection et comment les attributs au niveau du navigateur comme SameSite assurent une défense en profondeur contre les requêtes non autorisées.

CWE-352

##Impact Cross-Site Request Forgery (CSRF) permet à un attaquant de tromper le navigateur d'une victime pour qu'il effectue des actions indésirables sur un autre site Web sur lequel la victime est actuellement authentifiée. Étant donné que les navigateurs incluent automatiquement les informations d'identification ambiantes telles que les cookies dans les requêtes, un attaquant peut forger des opérations de changement d'état (telles que la modification des mots de passe, la suppression de données ou le lancement de transactions) à l'insu de l'utilisateur.

Cause première

La cause fondamentale du CSRF est le comportement par défaut du navigateur Web consistant à envoyer des cookies associés à un domaine chaque fois qu'une demande est faite à ce domaine, quelle que soit l'origine de la demande [S1]. Sans validation spécifique indiquant qu'une requête a été intentionnellement déclenchée à partir de la propre interface utilisateur de l'application, le serveur ne peut pas faire la distinction entre une action utilisateur légitime et une action falsifiée.

Mécanismes de protection CSRF de Django

Django fournit un système de défense intégré pour atténuer ces risques grâce à l'intégration de middleware et de modèles [S2].

Activation du middleware

Le django.middleware.csrf.CsrfViewMiddleware est responsable de la protection CSRF et est généralement activé par défaut [S2]. Il doit être positionné avant tout middleware de vue qui suppose que les attaques CSRF ont déjà été traitées [S2].

Implémentation du modèle

Pour tout formulaire POST interne, les développeurs doivent inclure la balise {% csrf_token %} dans l'élément <form> [S2]. Cela garantit qu'un jeton secret unique est inclus dans la demande, que le serveur valide ensuite par rapport à la session de l'utilisateur.

Risques de fuite de jetons

Un détail d'implémentation essentiel est que le {% csrf_token %} ne doit jamais être inclus dans les formulaires ciblant les URL externes [S2]. Cela entraînerait la fuite du jeton CSRF secret à un tiers, compromettant potentiellement la sécurité de la session de l'utilisateur [S2].

Défense au niveau du navigateur : cookies SameSite

Les navigateurs modernes ont introduit l'attribut SameSite pour l'en-tête Set-Cookie afin de fournir une couche de défense en profondeur [S1].

  • Strict : Le cookie n'est envoyé que dans un contexte propriétaire, ce qui signifie que le site dans la barre d'URL correspond au domaine du cookie [S1].
  • Lax : Le cookie n'est pas envoyé sur les sous-requêtes intersites (telles que des images ou des cadres) mais est envoyé lorsqu'un utilisateur navigue vers le site d'origine, par exemple en suivant un lien standard [S1].

Comment FixVibe le teste

FixVibe inclut désormais la protection CSRF en tant que contrôle actif sécurisé. Après la vérification du domaine, active.csrf-protection inspecte les formulaires de changement d'état découverts, vérifie les entrées en forme de jeton CSRF et les signaux de cookie SameSite, puis tente une soumission d'origine falsifiée à faible impact et ne signale que lorsque le serveur l'accepte. Les vérifications des cookies signalent également les attributs SameSite faibles qui réduisent la défense en profondeur du CSRF.