Web : Stockage de mot de passe
Web : Stockage de mot de passe
Web : Stockage de mot de passe
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Web</strong> : <strong>Stockage</strong> <strong>de</strong> <strong>mot</strong> <strong>de</strong><br />
<strong>passe</strong><br />
LOG619 Automne 2011<br />
Olivier Bilo<strong>de</strong>au<br />
1
Plan<br />
• Historique du <strong>Web</strong><br />
• Problème du stockage <strong>de</strong> <strong>mot</strong>s <strong>de</strong> <strong>passe</strong><br />
• La menace<br />
• Le craquage <strong>de</strong> <strong>mot</strong>s <strong>de</strong> <strong>passe</strong>s<br />
• Évolution d'une solution et ses problèmes<br />
• Conclusion<br />
2
Historique du <strong>Web</strong> - <strong>mot</strong> <strong>de</strong> <strong>passe</strong>s<br />
Rappel: 3 façon <strong>de</strong> faire <strong>de</strong> l'authentification<br />
• Quelque chose que l'on { sait, a, est }<br />
{ a, est } requièrent:<br />
• Accès sur un canal autre pour échapper au mitm (téléphone)<br />
• Accès à la personne physique (biométrie)<br />
• Infrastructures à clés publiques (PKI)<br />
• Accès a <strong>de</strong>s jetons matériels (hardware tokens)<br />
Qui sont:<br />
• Trop coûteux pour la compagnie<br />
• Peu commo<strong>de</strong><br />
• Trop coûteux pour le client<br />
Conséquence:<br />
L'authentification sur le <strong>Web</strong> est basée sur quelque chose que l'on sait.<br />
=> <strong>mot</strong> <strong>de</strong> <strong>passe</strong>s<br />
3
Le problème<br />
"The storage of passwords in a recoverable format makes them<br />
subject to password reuse attacks by malicious users. If a<br />
system administrator can recover a password directly, or use a<br />
brute force search on the available information, the<br />
administrator can use the password on other accounts."<br />
-- CWE-257: Storing Passwords in a Recoverable Format<br />
• Un attaquant peut attaquer une organisation à partir d'un<br />
<strong>mot</strong> <strong>de</strong> <strong>passe</strong> laissé par un utilisateur sur un autre site qui a<br />
été compromis et qui était vulnérable à CWE-257<br />
• Il est facile pour un employé administrateur mal intentionné<br />
d'utiliser l'accès <strong>de</strong> quelqu'un d'autre<br />
4
Précision <strong>de</strong> la menace<br />
Passif vs actif<br />
• Nous nous intéressons à un attaquant qui a obtenu accès<br />
au contenu <strong>de</strong> la base <strong>de</strong> données. Donc qui peut faire <strong>de</strong>s<br />
attaques passives sans avoir a interagir avec la victime.<br />
• Les attaques actives sur la session ou les <strong>mot</strong>s <strong>de</strong> <strong>passe</strong><br />
sont beaucoup plus complexe à réaliser car le site en<br />
question doit être rejoint ce qui fait qu'il peut déci<strong>de</strong>r <strong>de</strong><br />
bloquer un compte ou un IP après plusieurs tentatives <strong>de</strong><br />
connexion infructueuses.<br />
5
Solution 0 - stocker en clair<br />
• Compromettre la base <strong>de</strong> données équivaut à obtenir tous<br />
les <strong>mot</strong>s <strong>de</strong> <strong>passe</strong> <strong>de</strong> tous les utilisateurs<br />
• Usurper un utilisateur est trivial<br />
• Inacceptable<br />
CWE-522: Insufficiently Protected Cre<strong>de</strong>ntials<br />
6
Solution 1 - hachage naïf<br />
• Utiliser une fonction <strong>de</strong> hachage pour stocker le <strong>mot</strong> <strong>de</strong><br />
<strong>passe</strong><br />
• Pourquoi pas chiffrer? Car ne résout pas la vulnérabilité <strong>de</strong><br />
l'employé malicieux qui aura accès à la clé.<br />
if (md5($user_password) == $db_password) {<br />
return true;<br />
} else {<br />
return false;<br />
}<br />
7
Solution 1 - Problèmes<br />
• Mots <strong>de</strong> <strong>passe</strong>s i<strong>de</strong>ntiques faciles à i<strong>de</strong>ntifier<br />
o md5('bozo') == md5('bozo') =<br />
e1c8d6347c0c24e5cbc60e508f3fc1b5<br />
• Vulnérable aux attaques par dictionnaire<br />
• Vulnérable aux attaques par rainbow tables<br />
Le problème ici c'est que les <strong>mot</strong>s <strong>de</strong> <strong>passe</strong> stockés dans votre<br />
base <strong>de</strong> données partagent le même domaine <strong>de</strong> possibilités<br />
que tous les <strong>mot</strong>s <strong>de</strong> <strong>passe</strong> stockés avec le même algorithme<br />
<strong>de</strong> hachage à travers le mon<strong>de</strong>. Donc vous êtes vulnérable au<br />
'hash pre-computation'.<br />
CWE-759: Use of a One-Way Hash without a Salt 8
Craquage <strong>de</strong> <strong>mot</strong>s <strong>de</strong> <strong>passe</strong><br />
• Attaque par dictionnaire (dictionary attacks)<br />
o Passer tous les <strong>mot</strong>s d'une liste à travers le même algorithme <strong>de</strong> hachage<br />
afin d'obtenir la même valeur que dans la base <strong>de</strong> données<br />
o Listes génériques style dictionnaire<br />
o Listes spécialisés tirés <strong>de</strong> statistiques<br />
o On peut adapter les listes selon le contexte connu du <strong>mot</strong> <strong>de</strong> <strong>passe</strong> (taille<br />
min/max, chiffre obligatoire, etc.)<br />
o Limité par la vitesse d’ exécution <strong>de</strong> la fonction <strong>de</strong> hachage<br />
o Outils: john the ripper<br />
o Exemples <strong>de</strong> listes http://www.skullsecurity.org/wiki/in<strong>de</strong>x.php/Passwords<br />
• Attaque exhaustive (brute-force attack)<br />
o On tente itérativement toutes les valeurs <strong>de</strong> <strong>mot</strong>s <strong>de</strong> <strong>passe</strong> crédibles<br />
o Plus complet mais beaucoup plus long<br />
o Outils: john, crunch<br />
9
Craquage <strong>de</strong> <strong>mot</strong>s <strong>de</strong> <strong>passe</strong> (suite)<br />
• Rainbow tables<br />
o Calcul d'avance <strong>de</strong> plusieurs millions d'empreintes stockés <strong>de</strong> façon à<br />
éviter les redondances et rendre les recherches rapi<strong>de</strong>s<br />
o Compromis temps vs mémoire<br />
o Plusieurs sont disponibles sur<br />
Internet: http://www.freerainbowtables.com/en/tables2/<br />
o Des front end <strong>Web</strong> existent: http://rainbowtables.g3nius.org/<br />
o Temps à craquer dépend <strong>de</strong> la grosseur <strong>de</strong> la table et <strong>de</strong> la vitesse <strong>de</strong><br />
cherche dans la table<br />
• Performance (<strong>de</strong>s attaques exhaustives ou par dictionnaire)<br />
o L'utilisation <strong>de</strong> cartes graphiques (GPU) pour craquer les <strong>mot</strong>s <strong>de</strong> <strong>passe</strong><br />
ont amélioré gran<strong>de</strong>ment les performances <strong>de</strong>s attaques<br />
o "Recovery speed on ATI HD 5970 peaks at 5600M/s MD5 hashes and<br />
2300M/s SHA1 hashes"<br />
"J'ai <strong>de</strong>ux cartes ATI en crossfire, je fais environ 5 milliard d'empreintes par<br />
secon<strong>de</strong> pour du MD5." -- Anonyme en 2011 10
Solution 2 - hachage + sel naïf<br />
• L'ajout d'un sel (salt) consiste à concaténer une chaîne<br />
aléatoire au <strong>mot</strong> <strong>de</strong> <strong>passe</strong> avant <strong>de</strong> l'envoyer dans la<br />
fonction <strong>de</strong> hachage<br />
• Le sel est stocké avec le <strong>mot</strong> <strong>de</strong> <strong>passe</strong> dans la base <strong>de</strong><br />
données<br />
<strong>de</strong>fine('SALT', '377fba9d324d42e92dd21a003ec414a9');<br />
function computeHash($plainText) {<br />
return sha1(SALT . $plainText);<br />
}<br />
• Résoud le problème <strong>de</strong>s rainbow tables populaires<br />
• Complexifie l'attaque dictionnaire et exhaustives<br />
11
Solution 2 - Problèmes<br />
• Permet toujours le pré-calcul <strong>de</strong> rainbow tables car le sel<br />
(salt) est global<br />
• Permet d'attaquer la base <strong>de</strong> données en entier avec une<br />
attaque <strong>de</strong> dictionnaire ou exhaustive car le sel est global<br />
• Mot <strong>de</strong> <strong>passe</strong>s i<strong>de</strong>ntiques vont toujours être évi<strong>de</strong>nts à l'oeil<br />
CWE-760: Use of a One-Way Hash with a Predictable Salt<br />
12
Solution 3 - hachage + sel<br />
• Ajouter le sel (salt) sur chaque <strong>mot</strong> <strong>de</strong> <strong>passe</strong> au lieu <strong>de</strong><br />
globalement. On stocke le sel directement dans le champ<br />
password.<br />
• Les attaquant doivent maintenant tenter <strong>de</strong> craquer chaque<br />
entrée <strong>de</strong> la table <strong>de</strong> <strong>mot</strong> <strong>de</strong> <strong>passe</strong> séparément<br />
<strong>de</strong>fine('SALT_LENGTH', 9);<br />
function generateHash($plainText, $salt = null) {<br />
if ($salt == null) {<br />
$salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);<br />
} else {<br />
$salt = substr($salt, 0, SALT_LENGTH);<br />
}<br />
return $salt . sha1($salt . $plainText);<br />
}<br />
C'est une très bonne solution! Améliorations possibles?<br />
13
Solution 4 - key stretching<br />
• Problème: Les fonctions <strong>de</strong> hachage ont été conçues pour<br />
être performantes pourtant la vitesse est votre ennemi ici<br />
car rapi<strong>de</strong> veut dire qu'un attaquant peut rapi<strong>de</strong>ment faire<br />
son attaque exhaustive<br />
• Solution<br />
o En plus du sel par <strong>mot</strong> <strong>de</strong> <strong>passe</strong>,<br />
o On fait 1000 itérations <strong>de</strong> l'empreinte dans une boucle<br />
o ou encore, on concatène 1000 fois le <strong>mot</strong> <strong>de</strong> <strong>passe</strong> et le<br />
sel avant <strong>de</strong> faire l'empreinte<br />
• Ici on ralentit l'attaquant <strong>de</strong> 1000 fois mais on ne peut se<br />
permettre se genre <strong>de</strong> ressources pour authentifier un<br />
usager<br />
Presque parfait, que manque-t-il?<br />
14
Solution 5 - planifier pour l'avenir<br />
• Problème: Toutes les solutions stockent l'empreinte dans un<br />
format inflexible qui ne permet pas <strong>de</strong> changer la technique<br />
d'empreinte dans l'avenir<br />
• Solution<br />
o Se faire un petit standard interne pour contenir un id <strong>de</strong><br />
version <strong>de</strong> votre technique qui décrit le format utilisé<br />
o Laisser assez <strong>de</strong> place dans la colonne pour pouvoir<br />
grossir l'empreinte<br />
o ex: $1$salt$hash$<br />
1 = md5 avec 100 itérations et un salt <strong>de</strong> 64 bit<br />
o Planifier la migration du format <strong>de</strong> <strong>mot</strong> <strong>de</strong> <strong>passe</strong> lorsqu'un<br />
utilisateur s'authentifie<br />
si id = 1 et <strong>de</strong>fault id = 2 on le <strong>passe</strong> a version 2 15
Les extras<br />
• PBKDF2 (RFC2898)<br />
o meilleure pratique couvrant exactement la solution établie dans<br />
ses diapositives<br />
o la technique <strong>de</strong> WPA2<br />
• vali<strong>de</strong>r un <strong>mot</strong> <strong>de</strong> <strong>passe</strong> d'un nouvel utilisateur contre <strong>de</strong>s<br />
dictionnaires populaires<br />
• comptes 'canary' avec <strong>de</strong>s login / pass / emails obscurs<br />
o Vous informe si vous êtes compromis.<br />
• Séparer sur <strong>de</strong>s serveurs différents l'authentification <strong>de</strong>s comptes et<br />
le reste <strong>de</strong> l'application<br />
o pour que l'interface soit très limitée et prévienne toute injection<br />
ou XSS possible<br />
16
Le futur<br />
• Hachage adaptatif (Adaptive hashing)<br />
o L'avantage principal c'est qu'on peut le rendre<br />
paramétrable. À mesure que les ordinateurs sont plus<br />
rapi<strong>de</strong>s, la technique <strong>de</strong> hachage reste difficile à<br />
compromettre.<br />
o ex: bcrypt<br />
• scrypt<br />
o Nouveau type <strong>de</strong> problèmes "memory-hard" donc non<br />
seulement difficile sur le CPU mais aussi sur la mémoire<br />
vive <strong>de</strong> façon à ce que ce soit difficile d'implémenter une<br />
machine matérielle concentrée sur le crackage <strong>de</strong> <strong>mot</strong> <strong>de</strong><br />
<strong>passe</strong> (FPGA).<br />
17
Conclusion<br />
• La réutilisation <strong>de</strong> <strong>mot</strong>s <strong>de</strong> <strong>passe</strong> est un fait confirmé. Afin<br />
<strong>de</strong> défendre ses utilisateurs, il faut appliquer une métho<strong>de</strong><br />
<strong>de</strong> hachage appropriée<br />
• L'idéal c'est <strong>de</strong> ne pas inventer son propre stockage <strong>de</strong> <strong>mot</strong><br />
<strong>de</strong> <strong>passe</strong><br />
o Par ex: les gens réputés <strong>de</strong> Openwall on fait phpass qui<br />
est une implémentation <strong>de</strong>s meilleurs pratiques (basé sur<br />
bcrypt) en PHP sous licence domaine publique:<br />
http://www.openwall.com/phpass/<br />
• Si vous faites "j'ai oublié mon <strong>mot</strong> <strong>de</strong> <strong>passe</strong>" et que vous<br />
recevez votre <strong>mot</strong> <strong>de</strong> <strong>passe</strong> en clair, pensez-y bien!<br />
18
Références<br />
• Password Reuse Is All Too Common, Research<br />
Shows, http://www.pcworld.com/businesscenter/article/2193<br />
03/password_reuse_is_all_too_common_research_shows.ht<br />
ml<br />
• CWE-257: Storing Passwords in a Recoverable<br />
Format, http://cwe.mitre.org/data/<strong>de</strong>finitions/257.html<br />
Password lists,<br />
http://www.skullsecurity.org/wiki/in<strong>de</strong>x.php/Passwords<br />
• Rainbow Tables, http://en.wikipedia.org/wiki/Rainbow_table<br />
• Free Rainbow<br />
Tables, http://www.freerainbowtables.com/en/tables2/<br />
• IGHASHGPU, attaques exhaustives par GPU,<br />
http://www.golubev.com/hashgpu.htm<br />
19
Références<br />
CWE-522: Insufficiently Protected Cre<strong>de</strong>ntials,<br />
http://cwe.mitre.org/data/<strong>de</strong>finitions/522.html<br />
CWE-759: Use of a One-Way Hash without a Salt,<br />
http://cwe.mitre.org/data/<strong>de</strong>finitions/759.html<br />
CWE-760: Use of a One-Way Hash with a Predictable Salt,<br />
http://cwe.mitre.org/data/<strong>de</strong>finitions/760.html<br />
CAPEC-49: Password Brute Forcing, http://capec.mitre.org/data/<strong>de</strong>finitions/49.html<br />
The Importance of Being Canonical, Robert David Graham,<br />
http://erratasec.blogspot.com/2009/02/importance-of-being-canonical.html<br />
Enough With The Rainbow Tables: What You Need To Know About Secure Password<br />
Schemes, Thomas Ptacek, http://chargen.matasano.com/chargen/2007/9/7/enough-withthe-rainbow-tables-what-you-need-to-know-about-s.html<br />
PHP Security Consortium: Password Hashing, http://phpsec.org/articles/2005/passwordhashing.html<br />
Portable PHP password hashing framework, Openwall, http://www.openwall.com/phpass/<br />
Passwords lists and dictionaries, http://www.skullsecurity.org/wiki/in<strong>de</strong>x.php/Passwords<br />
Stronger Key Derivation via Sequential Memory-Hard Functions, Colin Percival,<br />
http://www.tarsnap.com/scrypt/scrypt.pdf<br />
20