SecurityInsider
Le blog des experts sécurité Wavestone

Ashley Madison : des millions de mots de passe stockés avec bcrypt sont cassés à cause d’erreurs dans le développement




Les mots de passe ne doivent jamais être stockés en clair. Cette consigne est relativement bien connue des développeurs web qui dans les développements de nouvelles applications vont faire appel à des fonctions cryptographiques pour stocker de manière sécurisée les mots de passe.

Plusieurs fonctions cryptographiques sont spécialement conçues pour stocker les mots de passe : PBKDF2, bcrypt ou scrypt. En effet, le calcul d’un unique dérivé cryptographique a un coût (en RAM, en temps CPU, et/ou en temps GPU) qui est négligeable pour l’utilisateur, mais qui devient très important pour un attaquant souhaitant réaliser une attaque par force brute sur plusieurs millions de mots de passe. De plus, l’unicité de la valeur dérivée est garantie grâce à des mécanismes de salage (ajout d’un aléa unique pour chaque mot de passe), ce qui permet de se prémunir contre des attaques où les valeurs dérivées sont précalculées (rainbow tables).

Le site Ashley Madison a récemment été piraté et environ 100 Go de données ont été publiés par les pirates. Tandis que ces données pouvaient révéler des informations sur la vie privée des utilisateurs, il semblait que seul leur mot de passe restait une donnée bien protégée : le dérivé de celui-ci était calculé avec bcrypt et une attaque par force brute nécessiterait un temps trop long pour que ces résultats puissent être exploités.

Cependant, les hackers de CynoSure ont découverts plusieurs éléments dans le code qui permettent d’accélérer considérablement cette attaque. En effet, deux fonctions manient les mots de passe de manière non sécurisée :
  • Extrait des modifications de code enregistrées sur le Git en juin 2012 pour le fichier amlib_member_create.function.php :
        $username = !empty($Values['username_suggest']) ? $Values['username_suggest'] : $Values['username'];
+       $password = User::encryptPassword($Values['password']);
-       $password = $Values['password'];
       $loginkey = md5(strtolower($username).'::'.strtolower($password));

Cette modification indique qu’après juin 2012, la variable loginkey était calculée en utilisant la sortie de l’appel à bcrypt ; cette implémentation est donc robuste. En revanche, préalablement à juin 2012, variable loginkey contient un simple condensat MD5 du mot de passe, préfixé du login de l’utilisateur. De plus, la casse est simplifiée : l’appel à la fonction strtolower signifie que les majuscules sont transformées en minuscules avant de calculer le condensat MD5.
  • Extrait du fichier AccountProvider.php :
md5(lc($username).”::”.lc($pass).”:”.lc($email).”:73@^bhhs&#@&^@8@*$”).

Cette fonction calcule le condensat MD5 du mot de passe, auquel des variables prédictibles sont adjointes : login, adresse e-mail, et un sel fixe pour l’ensemble de ces dérivés.

Au final, le coût exorbitant d’une attaque par force brute sur les condensats produits par bcrypt est ramené au coût d’une attaque par force brute sur des condensats MD5 produits par l’une ou l’autre des fonctions citées, pour lesquels de simples extractions de données complémentaires en base sont nécessaires.

Ces erreurs de programmation ont alors permis aux chercheurs de mettre en place l’attaque par force brute afin d’identifier le mot de passe. Seule la casse n’est pas prise en compte sur les condensats stockés dans loginkey.

Une attaque par force brute complémentaire est alors nécessaire afin de rétablir les majuscules et minuscules. Tout d’abord, le condensat du mot de passe en bas-de-casse produit est calculé en faisant appel à bcrypt : si cette valeur est égale à celle stockée en base, alors le mot de passe ne contient aucune lettre majuscule. Dans le cas contraire, une ou plusieurs lettres du mot de passe sont mises en majuscule et les condensats bcrypt sont progressivement calculés jusqu’à obtenir la bonne combinaison de majuscules et minuscules. Ainsi, si un mot de passe de 8 caractères contient une seule lettre majuscule, moins de 10 condensats bcrypt seront calculés, ce qui limite effectivement le coût total de l’attaque.

Au final, les chercheurs ont ainsi pu récupérer 11 millions de mots de passe en quelques jours, alors que cela aurait nécessité de nombreuses années si seuls des dérivés des mots de passe produits par bcrypt étaient utilisés.

Plusieurs statistiques sur les mots de passe ont été publiés par les chercheurs :
  • Les mots de passe cassés utilisent des jeux de caractères limités : principalement des lettres minuscules et/ou des chiffres. De plus, ceux-ci sont relativement courts et font généralement 9 caractères maximum.

Dans la mesure où une attaque par force brute permet de casser plus rapidement les mots de passe simples, un tel résultat est en partie lié à la méthode d’analyse.



  • Outre les mots de passe classiques fréquemment cassés (« passwords », « 123456 »…), certaines phrases de passe ont également été cassées. Les chercheurs livrent ainsi des phrases de passe correspondant au contexte d’utilisation du site :
Those that think adding a few more words to the word password makes it harder to crack:

  • mypasswordispassword
  • superhardpassword
  • thebestpasswordever
  • thisisagoodpassword

Those that are having doubts about using the site:

  • ishouldnotbedoingthis
  • ithinkilovemywife
  • thisiswrong
  • whatthehellamidoing
  • whyareyoudoingthis
  • cheatersneverprosper
  • donteventhinkaboutit
  • isthisreallyhappening

Those that are in denial:

  • likeimreallygoingtocheat
  • justcheckingitout
  • justtryingthisout
  • goodguydoingthewrongthing

Those who think this is a dating site:

  • lookingfornewlife
  • friendswithbenefits

Those who trusted AM:

  • youwillneverfindout
  • youwillnevergetthis
  • secretissafewithme

Passwords from xkcd (https://xkcd.com/936/):

  • batteryhorsestaple
  • correcthorsebatterystaple

Those that might have figured out what AM is doing:

  • nothingfound
  • theywererobots
  • nobodyhere

Other funnies:

  • everynameitriedwastaken
  • allthegoodpasswordshavegone
  • lickemlikeshelikesit
  • lildickinyourpussyn0w
  • satisfactionwithlicking
  • blackfromthewaistdown
  • smalldickbuthardworker

Sources :

http://cynosureprime.blogspot.fr/2015/09/how-we-cracked-millions-of-ashley.html
http://cynosureprime.blogspot.fr/2015/09/csp-our-take-on-cracked-am-passwords.html
http://arstechnica.com/security/2015/09/once-seen-as-bulletproof-11-million-ashley-madison-passwords-already-cracked/

Damien Godard

Aucun commentaire:

Enregistrer un commentaire