vendredi 13 juin 2008

Introduction à la sécurité des cookies

J'ai vu beaucoup de gens tenter de créer un protocole de sécurisation des cookies. Nombre d'entre eux sont peu fiables car leur sécurité est basée sur le secret de l'algorithme employé. Ca peut marcher un certain temps, ça peut rassurer psychologiquement, mais au final, c'est pas fiable. Dans un premier temps, pour que ce soit clair, on va définir ce qu'est un cookie "sécurisé" :
  1. Pour certains, c'est un moyen de garantir l'authenticité et l'intégrité des données qui sont stockées dans un cookie. Ils ne veulent pas qu'un utilisateur malicieux puisse modifier la valeur du cookie pour les duper.
  2. Pour d'autres, un cookie sécurisé garantit la confidentialité des données stockées sur la machine du client. C'est à dire que les données ne peuvent être lues/comprises ni par l'utilisateur, ni par une personne malicieuse qui aurait volé un coookie. Seule l'application web (donc coté serveur) à le droit de lire les valeurs stockées dans le cookie.
  3. Pour d'autres, un cookie sécurisé garantit qu'il ne peut être ni intercepté, ni "rejoué" (replay attack) par une personne malicieuse (dans un environnement non sécurisé : machine passeoire, cybercafé, wifi ouvert ou mal sécurisé...etc)
Vous allez peut être me demander : "Mais pourquoi stocker des données sensibles/confidentielles dans des cookies ? Un peu après l'age de la préhistoire on a inventé un mécanisme de sessions pour stocker ce genre de données ! Les cookies, c'est aussi fiable que le réseau Wifi de ma grand mère ! Et elle n'a jamais entendu parler de WPA ou de wardriving de toute sa vie ! T'aimes vraiment jouer avec le feu ?"
Ca fait beaucoup de questions, mais je vais tenter d'y répondre. Pour commencer, oui j'aime jouer avec le feu !

Ensuite, pour cette histoire de cookies, oui il est possible de stocker des données sensibles en session sur le serveur. Mais je n'aime pas les sessions (et je ne suis pas le seul) : c'est une vraie galère à gérer dans un environnement multiserveur. Cela dit, on est pas là pour parler de sessions.

Quoi qu'il arrive, même avec une session, vous aurez à stocker l'identifiant de session dans un cookie. Et ce cookie est TRES IMPORTANT... il doit être sécurisé :) La plupart des applications sont concernées par la sécurité des coookies.

Donc poursuivons : suivant la nature des données que vous aurez à stocker dans des cookies, vous allez devoir considérer les différents points évoqués plus haut (authenticité, integrité, confidentialité, "replay attack" et interception de cookie) et choisir ceux que vous voudrez prendre en compte dans votre politique de sécurité.

Pour chacun des problèmes évoqués, il existe une solution (cryptographique) :
  • Le problème d'intégrité et d'authenticité peut être résolu avec des fonctions de hachage. Nous allons utiliser une solution basée sur ces fonctions de hachage : HMAC.
  • Le problème de confidentialité peut être résolu en utilisant des fonctions de chiffrement par bloc (par exemple AES).
  • Le problème de "replay attack" peut être résolu en combinant l'utilisation d'une fonction HMAC et en utilisant le protocole de transport sécurisé SSL/TLS.
  • Le risque d'interception de cookies peut être réduit en utilisant SSL. (réduit seulement : un cookie peut toujours être volé d'une autre façon car il est stocké de sur la machine du client, il peut donc être volé). Cependant, l'interception d'un cookie sécurisé ne devient plus très interressante si la valeur est chiffrée, non rejouable dans une "replay attack" et pas modifiable à cause des contrôles d'intégrité. Cela devient relativement inutile d'intercepter ce genre de cookies.

Bref, si vous avez tout suivi jusqu'ici, vous devriez être interressé par une solution concrête pour sécuriser des cookies, avec plein de détails croustillants ! Je vous invite donc à lire ce papier : "A Secure Cookie Protocol" écrit par Alex X. Liu.

Dans le prochain article, nous verrons comment implémenter ce protocole en PHP. Et peut être plus tard comment l'intégrer au Zend Framework.

Les commentaires sont les bienvenus :)

2 commentaires:

Emacs a dit…

On reste sur sa faim lol ! Heureusement que la suite est déjà écrite. Merci pour ces articles très intéressants ;)

Mat a dit…

Merci !
Oui on reste un peu sur sa faim ;) Cela dit je ne voulais pas entrer dans les détails du protocole vu qu'il est très bien décrit dans le papier.