04.07.2013 Views

Web : Stockage de mot de passe

Web : Stockage de mot de passe

Web : Stockage de mot de passe

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!