CSRF : attaques légitimes !
Cross-Site Request Forgeries : une faille intrinsèque du Web
Les acteurs
Servane, un serveur web possédant des données confidentielles.
Clélie, un utilisateur légitime authentifié ayant des droits sur les données.
Athanase, un attaquant malicieux qui contrôle un site tiers sans rapport avec le serveur victime (par ex., son propre serveur, ou un site avec une injection XSS).
Les effets
Athanase gagne accès aux données confidentielles avec les droits de Clélie.
CSRF : Comment ?
Pré-requis…
- Clélie est logguée sur le serveur (par ex., el garde un onglet ouvert sur une page de Servane) ;
- Servane utilse un mécanisme d’authentification sans intervention de l’utilisateur (par. ex., des identifiants de session dans des cookies) ;
- Clélie tombe (par hasard) sur la page malicieuse d’Athanase.
…et ensuite
- La page de l’attaquant déclenche une requête au serveur.
<html>
...
<h1>Recipe: Panini Reblochon Nutella</h1>
<h2>Ingredients:</h2>
<ul>
<li>Two slices of bread</li>
...
<img width="0" height="0" src="http://servane.org/transfer?to=attacker&amount=10k"/>
- Le navigateur de Clélie, en voulant télécharger l’image, déclanche un transfert d’argent authentifié.
Démo CSRF
- Connectez-vous à https://aws-security.herokuapp.com/,
- Maintenant, supposons que vous visitiez un site au hasard (par ex.,
ce site !!!), contenant cet
<iframe>
(caché par ):
- Si vous cliquez ici, le formulaire est soumis, et le CSRF est exécuté.
Note : Si le <iframe>
avait été
, vous n’auriez rien remarqué.
Note: Il aurait été possible de tout faire sans attendre de clic de l’utilisateur !
CSRF et AJAX
Les sites construits en AJAX sont classiquement mieux protégés contre CSRF :
- Les requêtes de type
XMLHttpRequest
cross-domain- n’envoient pas les cookies par défaut,
- ignorent les entêtes
Set-Cookie
;
- Les API de type AJAX sont souvent conçues pour envoyer explicitement les données d’authentification avec chaque requête.
Mais AJAX n’est pas invulnérable à CSRF :
- Les cookies cross-domain peuvent être explicitement réactivés avec
l’option
withCredentials
; - L’application doit tout de même vérifier que les actions ont pour origine l’utilisateur ;
- Certains paradigmes, comme AJAX+JSONP, peuvent exposer à des vulnérabilités de type CSRF.
CSRF dans la vraie vie
GMail 2007 redirection de mail : des filtres de mails arbitraires ont pu être configurés via CSRF
- http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/
- http://www.davidairey.com/google-gmail-security-hijack/
GMail 2007 vol de contacts : (basé sur AJAX+JSONP) les attaquants ont pu voler les carnets d’adresses
- http://jeremiahgrossman.blogspot.fr/2007/01/gmail-xsrf-json-call-back-hackery.html
- http://jeremiahgrossman.blogspot.fr/2006/01/advanced-web-attack-techniques-using.html
Autres (d’apres Wikipedia)
- ING Direct : transfert d’argent,
- YouTube (2008) : contrôler un compte,
- …
Contre-mesures CSRF
Utilisateur
- Se délogguer ;
- Utiliser plusieurs navigateurs.
Développeur
De la moins à la plus efficace :
- Préférer POST à GET pour les requêtes qui déclenchent des actions ;
- Contrôler l’entête
Referer
; - Contrôler l’entête
Origin
; - Faire expirer rapidement les sessions ;
- Demander confirmation ;
- Utiliser des captchas ;
- Ajouter des informations reliées à la session dans les URLs ;
- Cacher des jetons aléatoires jetables (nonces) dans les formulaires.
Note : il n’existe, et n’existera probablement jamais de protection définitive !
Clickjacking et sécurité des Mash-up
Demander confirmation peut ne pas être suffisant !
Clickjacking : amener l’utilisateur à cliquer un bouton de confirmation sans son consentement
- Inclure le formulaire de confirmation dans un
<iframe>
; - Utiliser CSS pour superposer le
<iframe>
à du contenu apparemment inoffensif ; - Convaincre l’utilisateur à cliquer sur le contenu inoffensif ;
- Le clic va au
<iframe>
de confirmation.
Peu d’utilisations vérifiées :
-
Twitter 2009 “Don’t click this” http://dsandler.org/outgoing/dontclick_orig.html
-
Facebook:
- link sharing (2009),
- likejacking relativement courant (article de 2016).
Clickjacking: Exemple
On ajoute une confirmation avant le transfert : https://aws-security.herokuapp.com/?confirm
Bienvenue sur LonelyHearts.org
Il y des milliers de LonelyHearts dans notre site !
Ils n’attendent que toi !
Vite ! Crée ton compte, c’est gratuit !
Contre-mesures
-
Entête
X-Frame-Options
, partie du standard CSPX-Frame-Options: SAMEORIGIN
-
Directive
frame-ancestors
de la Content Security Policy.Content-Security-Policy: frame-ancestors 'self'
- Empêchent aux navigateurs d’inclure la page dans des frames cross-domain ;
- Twitter s’en sert depuis 2009…
Lectures
Google browser security guide (M. Zalewski)
- https://code.google.com/p/browsersec/wiki/Part1,
- https://code.google.com/p/browsersec/wiki/Part2,
- https://code.google.com/p/browsersec/wiki/Part3.
CSRF
- OWASP sur CSRF: définition, contre-mesures,
- The tangled web: http://lcamtuf.coredump.cx/tangled/.
Clickjacking
X-Frame-Options
,- Content Security Policy
frame-ancestors
- Ajax and Mashup Security,
- OWASP sur le Clickjacking.