L'authentification par mot de passes

Cet article explique les difficultés d’une authentification par mot de passe et les contres mesures à appliquer.
Par Philippe PRADOS - 2003
www.prados.fr
Quels sont les risques d’une authentification par mot de passe ?
Avant toute utilisation de l’application, l’utilisateur doit se signer. Il bénéficie alors d’un certain nombre de services. Les applications Internet proposent généralement un formulaire HTML pour permettre à l’utilisateur de s’authentifier. Si une application authentifie l’utilisateur, elle désire pouvoir contrôler son activité. L’utilisateur devient responsable des actions effectuées sous son nom.
Souvent l’application ne chiffre pas la communication. Ainsi, n’importe quel employé ou stagiaire de l’entreprise peut écouter la communication réseau et obtenir le mot de passe d’un utilisateur ou de l’administrateur. Les connexions aux messageries utilisent rarement un protocole sécurisé. Les employés utilisent régulièrement le même mot de passe pour plusieurs applications. Obtenir le mot de passe pour une application non critique peut permettre à la personne indélicate d’accéder à des applications plus sensibles. Ce risque n’est pas négligeable. Quatre-vingts pour-cent des attaques viennent de l’intérieur de l’entreprise.
Le mot de passe peut être sauvé par le navigateur sur le poste de l’utilisateur. Il existe de nombreux outils permettant de les retrouver. Si un pirate accède au poste d’un utilisateur privilégier, il peut obtenir instantanément le mot de passe de l’application.
Connaissant des informations personnelles sur une victime (son nom, le nom de ses proches) et son identifiant, il est possible d’attaquer un compte en proposant des mots de passes possibles, à raison d’un à deux essais par jours.
Il est également possible d’obtenir un déni de service en grillant volontairement tous les identifiants en envoyant des mots de passes aléatoires pour tous les identifiants.
Si les noms des utilisateurs sont prédictibles, il est possible de faire une attaque inverse en recherchant un utilisateur pour un mot de passe donnée. Par exemple, en Alsace, il est fort probable qu’un utilisateur utilise « Gewurztraminer ».
Il ne faut utiliser une adresse e-mail pour identifier un utilisateur. Il est alors facile de trouver des noms valides. De plus, un utilisateur ne peut plus modifier facilement son identifiant. Les utilisateurs risquent d’ouvrir un nouveau compte à chaque changement d’e-mail, laissant des comptes dormants.
Si un utilisateur a grillé son mot de passe, il n’est pas forcement déconnecté car il est encore présent dans les caches. Il peut avoir une session encore active. En maintenant artificiellement la connexion en vie, il peut effectuer des traitements qu’on ne pourra pas lui opposer.
Il est également possible de forcer l’utilisateur à utiliser une session créer précédemment par un pirate. Pour éviter l’exploitation par celui-ci de l’authentification de l’utilisateur, il faut systématiquement générer une nouvelle session lors de l’acceptation de l’utilisateur et ne pas utiliser la session courante.
Le protocole HTTPS permet de chiffrer la communication. Ainsi, il n’est plus possible d’écouter le réseau pour obtenir le mot de passe d’un utilisateur. Il est impératif d’utiliser ce protocole avec un cookie de session sécurisée. Un paramètre du serveur d’application permet d’indiquer cela. Sinon, le cookie de session est volable lors de l’affichage d’une page non sécurisée. Les pages de l’application ne doivent pas être accessibles sans ce protocole. Il faut paramétrer le serveur HTTP en conséquence.
Le format du mot de passe ne doit pas être présent dans l’invite de l’utilisateur ou dans un message d’erreur.
Pour éviter l’utilisation rémanente d’un utilisateur grillé ou dont ont a modifier les privilèges, il faut tuer les sessions de l’utilisateur correspondant. Toutes les sessions ouvertes pour l’utilisateur doivent être détruites. Une approche pour faire cela consiste à garder un cache global des derniers utilisateurs dont on a modifié les habilitations ou qui ont été rejeté. Ce cache garde les informations pour une durée légèrement supérieure à la durée de vie de la session HTTP. Avant tout traitement d’un utilisateur, le programme vérifie que l’utilisateur n’est pas présent dans le cache. Si c’est le cas, elle invalide la session et demande à l’utilisateur de se signer à nouveau. Attention, dans une architecture à base de grappe, le cache doit être partagé.
Pour éviter la sauvegarde du mot de passe sur le poste de l’utilisateur, il faut indiquer dans le formulaire l’attribut autocomplete à off.
<form action="login.jsp" autocomplete="off">
...
</form>
Un pirate peut utiliser un programme Brutus pour tester de nombreux mots de passes sur un compte. Plusieurs stratégies permettent de limiter les attaques en forces brutes :
- Une valeur aléatoire est envoyée dans un champ caché avec le formulaire d’authentification. Ce chiffre doit être présent avec l’identifiant et le mot de passe. Cela limite l’utilisation d’une grande partie des outils automatiques. En effet, ils ne savent généralement pas traiter ces situations.
- Pour imposer une intervention humaine, il faut indiquer un mot parasité dans une image GIF, et demander à l’utilisateur de le recopier. Seul un humain peut résoudre rapidement ce challenge. Les programmes de reconnaissance de caractères ne savent pas travailler avec des lettres ou des chiffres difformes (http://www.captcha.net/).

- Attendez de plus en plus pour signaler à l’utilisateur d’un échec de connexion. Vous lui indiquez le problème immédiatement lors du premier échec, puis 15 secondes plus tard au deuxième, puis 30, 1 minute, etc.
- Attendez de plus en plus entre chaque possibilité de connexion. Après trois échecs, l’utilisateur ne peut plus se connecter, même avec un mot de passe correct, avant un quart d’heure, et de plus en plus. Il n’est pas nécessaire de prévenir l’utilisateur de l’impossibilité de se connecter pendant cette période. Ainsi, le pirate ne pourra pas savoir que sa tentative d’attaque a échoué, car un mot de passe valide a peut-être été ignoré par l’application s’il a été saisi lors de la période d’attente. Attention, il faut prévoir un temps maximum d’attentes d’une heure entre connexions et un reset du compteur après 24 heures. Sinon, il est possible d’obtenir un déni de service en grillant tous les comptes.
- La qualité des mots de passes des utilisateurs doit être vérifiée à l’aide d’un outil de production, équivalent à ceux utilisés par les pirates.
L’utilisateur ne doit être informé que de l’échec ou de la réussite de son authentification. Il ne faut surtout pas émettre de messages différents pour les différentes situations, sinon un pirate peut connaître la liste des utilisateurs, même s’il ne connaît pas leurs mots de passes. Il lui suffit de demander automatiquement l’authentification d’une liste de noms (déduite généralement de la liste des employés ou des différentes communications de l’entreprises : liste de diffusions, notes de services, affiches…) Un mot de passe quelconque lui permet de déduire la liste des utilisateurs actifs. Il peut ensuite chercher à trouver les mots de passes.
Une autre attaque consiste à chercher un utilisateur pour un mot de passe donné. Un programme teste une liste de noms d’utilisateurs pour un mot de passe connu. Plus le nombre d’utilisateur est important, plus cette attaque à des chances d’aboutir. Est qu’il existe un utilisateur avec le mot de passe « toto » ?
Une attaque subtile consiste à livrer à l’application un mot de passe partiel avec un seul caractère et à chronométrer le temps nécessaire pour qu’elle réponde qu’il n’est pas bon. Lorsque le premier caractère est bon, l’algorithme mettra généralement un temps légèrement plus long. Il faut alors augmenter le mot de passe d’un nouveau caractère pour prolonger la recherche. De fil en aiguille, tous les caractères seront trouvés.
C’est le couple utilisateur/mot de passe qui doit être vérifié et non chacun des membres du couple. Aucun message ne doit informer l’utilisateur du format attendu pour le nom ou le mot de passe. En cas de connexion réussie, un message indiquant le nombre d’échecs précédant et un rappel de la date de dernière connexion et du nombre d’échec pour s’authentifier peut informer l’utilisateur d’une tentative d’attaque.
Pour éviter les attaques par calcul du temps pour analyser le mot de passe, il faut appliquer un algorithme à temps constant. Par exemple, un calcul de ou exclusif peut être pratiqué pour chaque paire de caractères, et les résultats accumulés dans une variable. Si le résultat final est zéro, les chaînes sont identiques.

Référentiel des utilisateurs
L’application utilise maintenant souvent un référentiel LDAP utilisés pour d’autres services de l’entreprise. Un pirate peut exploiter une application pour :
- Découvrir un mot de passe d’un utilisateur et l’exploiter dans un autre contexte,
- Griller les comptes des administrateurs ou de l’utilisateur d’exécution du serveur d’application. Par exemple, si l’utilisateur IUSR_MACHINENAME est grillé, le serveur Internet Information Services de Microsoft™ ne fonctionne plus après un redémarrage.
Il ne faut pas mutualiser les référentiels sauf en y ajoutant des critères d’habilitation associés à l’application, afin que seuls certains identifiant puissent être utilisés par l’application. Les utilisateurs candidat à utiliser l’application doivent être choisis avec précautions.
Attention, il est alors parfois nécessaire de lire un enregistrement du référentiel pour savoir s’il est candidat, avant de vérifier le mot de passe. Par exemple, une connexion authentifiée LDAP, effectués avant de vérifier les habilitations applicatives de l’utilisateur, permet de griller un compte n’ayant rien à voir avec l’application. Une réorganisation de la base de données des utilisateurs peut être une solution.
Contrainte des mots de passe
Les mots de passes n’ont généralement pas de contraintes. Un mot de passe doit avoir une taille minimum de 8 caractères, posséder des caractères non alphabétiques et ne pas se terminer par des chiffres. Sinon, des dictionnaires de mot de passe permettent de les trouver rapidement. Ils doivent également avoir une durée de vie relativement courte (1 à 2 mois) afin de réduire la fenêtre de tir permettant à un pirate de trouver ou d’exploiter un mot de passe. Un nombre d’échecs important doit griller le mot de passe ou interdire son utilisation avant une période d’attente de plus en plus longue.
Il est également envisageable de garder un historique crypté des 5 derniers mots de passes pour éviter leur réutilisation. Une limite du nombre d’authentifications valides pour une journée ou la limitation à certaines tranches horaires, permet également de limiter quelques utilisations malveillantes.
Un mot de passe, délivré par défaut, peut ne jamais être utilisé par l’utilisateur. Cela arrive généralement lorsque l’on donne un accès à un manageur qui n’a pas le temps de consulter l’application. Le mot de passe doit avoir une durée de vie pour la première utilisation limitée dans le temps. Au-delà, l’utilisateur doit demander un reset du mot de passe en suivant un protocole sécurisé. Il obtient alors un nouveau mot de passe d’initialisation.
Des statistiques sur les mots de passes craqués montrent que trente cinq pourcent font six caractères, vingt cinq pourcent font cinq ou sept caractères, et vingt pourcent, huit caractères. Quarante six pourcent sont constitué d’un mot en minuscule, vingt pourcent d’un mot suivit du chiffre un, dix pourcent d’un autre chiffre. Les autres sont plus complexes. Seulement trois règles suffisent à décrire plus des trois quarts des mots de passe cassés.
De plus, une bonne partie est directement déductible de l’identifiant ou avec en plus les informations associées à l’utilisateur.
Les mots de passes à usage personnels sont généralement les mêmes que les mots de passes à usage professionnel. Lorsqu’un utilisateur quitte une entreprise, il est probable qu’il utilisera le même mot de passe dans la nouvelle. Cela peut ouvrir la porte à des informations concurrentielles.
Le tableau 1 indique pour une taille de mot de passe et le jeu de caractère utilisé, les différentes combinaisons possibles.
| Nombre de caractère du mot de passe | Combinaisons possibles Lettres A à Z uniquement | Combinaisons possibles Lettres A à Z et les chiffres |
| 1 | 26 | 36 |
| 2 | 676 | 1 296 |
| 3 | 17 576 | 46 656 |
| 4 | 456 976 | 1 679 616 |
| 5 | 11 881 376 | 60 466 176 |
| 6 | 308 915 776 | 2 176 782 336 |
| 7 | 8 031 810 176 | 78 364 164 096 |
| 8 | 208 827 064 576 | 2 821 109 907 456 |
| 9 | 5 429 503 678 976 | 101 559 956 668 416 |
| 10 | 141 167 095 653 376 | 3 656 158 440 062 980 |
Nombre de caractère du mot de passe
Combinaisons possibles Lettres A à Z uniquement
Combinaisons possibles Lettres A à Z et les chiffres
1
26
36
2
676
1 296
3
17 576
46 656
4
456 976
1 679 616
5
11 881 376
60 466 176
6
308 915 776
2 176 782 336
7
8 031 810 176
78 364 164 096
8
208 827 064 576
2 821 109 907 456
9
5 429 503 678 976
101 559 956 668 416
10
141 167 095 653 376
3 656 158 440 062 980
Celles-ci peuvent être fortement réduites si l’utilisateur utilise des astuces mnémotechniques pour se transformer un mot de son vocabulaire en mot de passe. Les pirates savent exploiter ces faiblesses pour réduire considérablement le spectre des possibles.
Les outils de recherche de mot de passes savent exploiter des dérivés de mots d’un dictionnaire. Les générateurs utilisent habituellement les règles suivantes :
- Ajouter ou commencer un mot par des caractères particulier ;
- Utilisation de mot réservé ;
- Duplication d’un mot ;
- Miroir d’un mot, ajout d’un mot en miroir ;
- Rotation d’un mot à gauche ou à droite ;
- Mise en majuscule d’un mot ;
- Mise en minuscule d’un mot ;
- Mise en majuscule de la première lettre ;
- Mise en majuscule de toutes les lettres sauf la première ;
- Mise en majuscule d’une lettre à une position ;
- Réduction de la taille d’un mot par troncature initiale ou finale;
- Un suffixe peut être ajouté à un mot (s, ed, ing, s, nt, x) ;
- Terminer ou commencer un mot par un signe de ponctuation ;
- Deux mots accolés, séparé par un chiffre ou un signe de ponctuation ;
- La première, la dernière ou une autre lettre peut être supprimé ;
- Des caractères peuvent être remplacés à certaines positions ;
- Des caractères peuvent être insérés à certaines positions ;
- Des caractères peuvent être remplacés par d’autres en même position sur le clavier (‘è’ par ‘7’) ;
- Des dates peuvent être tapées sans le shift du clavier ;
- Des caractères peuvent être répétés plusieurs fois pour allonger artificiellement le mot de passe.
- Des caractères peuvent être remplacés par d’autres décalé sur le clavier (‘A’ par ‘Z’) ;
- Toutes les occurrences d’un caractère peuvent être remplacées par un autre, graphiquement similaire (‘A’ par ‘4’, ‘E’ par ‘3’, etc.)
- Remplacer tous les caractères d’une classe (voyelle, lettre, numérique) par un caractère spécifique ;
- Suppression de toutes les occurrences d’un caractère dans un mot ;
- Ecriture d’un mot en phonétique
Les dates, par exemple, sont généralement caractéristiques d’un évènement. Avec un peu de manipulation sociale, ou la consultation de base de données, il est possible d’extraire plusieurs dates remarquable associé à un utilisateur. Les dates sont généralement passées, et proportionnel à l’age de la victime. Les dates entre 1900 et 2004 sont les plus crédibles. Pour chercher une date de mariage, il faut généralement limiter la recherche aux samedis passée. Cela limite la recherche à cinquante deux possibilités par an.
Suivant les contraintes imposées par l’application, les artifices utilisés par les utilisateurs sont différents. Par exemple, s’il doit utiliser des lettres, des chiffres mais pas à la fin et des symboles, il est fort probable qu’il applique la méthode suivante :
- choisir un mot commun ou quelconque
- Transformer quelques lettres par un chiffre graphiquement proche (4 ou A, zéro ou O, 1 pour i ou L)
- Ajout d’un symbole à la fin ou au début (point d’exclamation, d’interrogation, …)
Par exemple, avec le mot « password », cela peut donner p4$$w0rd!. Le mot de passe respecte les contraintes imposées par l’application, et de plus, il est facile à retenir. Cette combinaison sera rapidement testée par les pirates.
Il faut augmentez les contraintes sur les mots de passe :
- Il faut une taille minimum de 8 caractères ;
- Trois familles de caractère (majuscule, minuscule, chiffre, symbole) ;
- Ne pas finir ou commencer par un chiffre ;
- Ne pas posséder trois caractères consécutifs identiques ;
- Ne pas posséder le nom, le prénom ou l’identifiant de l’utilisateur ;
- Limiter le nombre d’échecs d’authentification ;
- Limiter le nombre d’authentifications par tranche de temps ;
- Limiter la durée de vie du mot de passe pour la première utilisation ;
- Limiter la durée de vie du mot de passe avant une demande de changement ;
- Garder un historique des derniers mots de passe ;
- Un nouveau mot de passe ne doit pas contenir plus de trois caractères identiques du précédent ;
- Afficher à l’utilisateur, lors d’une authentification réussie, le nombre de tentatives ayant permis l’accès, et la date et l’heure du dernier accès ;
- Offrir un service de déconnexion à l’utilisateur.
- Calculer la distance du mot de passe à rapport à un dictionnaire, et les différentes manipulations standards.
La taille d’un mot de passe n’est pas suffisante pour garantir la sécurité. Un mot de passe long peut être le fruit de la concaténation de deux mots simples, avec éventuellement une petite transformation automatique. Les programmes d’attaques en force brute connaissent ces transformations et peuvent alors trouver rapidement le mot de passe. Ils exploitent pour cela directement l’application ou un fichier récupéré sur le serveur. Cela leurs permet d’effectuer l’attaque hors connexion, et de revenir sur le site lorsque les comptes ont été ouverts.
| Mot de passe | Analyse |
| Anticonstitutionnel | Le mot "Anticonstitutionnel" est présent dans le dictionnaire. |
| Pommepomme | Le mot "pommepomme" contient deux fois le mot "pomme". |
| Xuaetag | Le mot "xuaetag" est l'inverse du mot gateaux. |
| Fghijk | Le mot "fghijk" est trop simpliste ou systématique. |
| Carineenirac | Le mot "carineenirac" est un palindrome. |
| Abbacca | Le mot "abbacca" ne contient pas assez de caractères différents. |
| 100fromages | Le mot "100fromages" contient le mot "fromage" avec un préfix ou un suffixe standard. |
| Fromagette | Le mot "fromagette" contient le mot "fromage" avec un préfix ou un suffixe standard. |
| [(PhIlIpPe)] | Le mot "[(PhIlIpPe)]" contient le mot philippe. |
| Pommmme | Le mot "pommmme" contient trop d'occurrence du caractère 'm'. |
| Rineca | Le mot "rineca" est une rotation du mot "carine". |
| Paraplu | Le mot "paraplu" contient le début du mot "parapluie". |
| Titution | Le mot "titution" contient la fin du mot "constitution". |
| Faleng | Le mot "faleng" contient une version phonétique du mot "phalange". |
| *l*ph*nt | Le mot "*l*ph*nt" contient le mot "elephant" dont toutes les voyelles sont remplacées par le même caractère. |
| *a*a*i*e | Le mot "*a*a*i*e" contient le mot "banalise" dont toutes les consonnes sont remplacées par le même caractère. |
| p4$$w0rd | Le mot "p4$$w0rd" contient une version cow-boy du mot password. |
| |v|a|v|a|\| | Le mot "|v|a|v|a|\|" contient une version cow-boy du mot maman. |
| ^ztzfod | Le mot "^ztzfod" est un déplacement du clavier du mot "paradis". |
| à(à-&ç-- | Le mot "à(à-&ç--" est une date, entrée au clavier sans le shift. |
| Prfuson | Le mot "prfuson" est à 77% du mot "perfusion". |
| monsieuremadamc4r1b0v | Le mot "monsieuremadamc4r1b0v" contient le mot monsieur, l'inverse du mot madame (emadam) et une version cow-boy du mot caribou (c4r1b0v). |
Mot de passe
Analyse
Anticonstitutionnel
Le mot "Anticonstitutionnel" est présent dans le dictionnaire.
Pommepomme
Le mot "pommepomme" contient deux fois le mot "pomme".
Xuaetag
Le mot "xuaetag" est l'inverse du mot gateaux.
Fghijk
Le mot "fghijk" est trop simpliste ou systématique.
Carineenirac
Le mot "carineenirac" est un palindrome.
Abbacca
Le mot "abbacca" ne contient pas assez de caractères différents.
100fromages
Le mot "100fromages" contient le mot "fromage" avec un préfix ou un suffixe standard.
Fromagette
Le mot "fromagette" contient le mot "fromage" avec un préfix ou un suffixe standard.
[(PhIlIpPe)]
Le mot "[(PhIlIpPe)]" contient le mot philippe.
Pommmme
Le mot "pommmme" contient trop d'occurrence du caractère 'm'.
Rineca
Le mot "rineca" est une rotation du mot "carine".
Paraplu
Le mot "paraplu" contient le début du mot "parapluie".
Titution
Le mot "titution" contient la fin du mot "constitution".
Faleng
Le mot "faleng" contient une version phonétique du mot "phalange".
*l*ph*nt
Le mot "*l*ph*nt" contient le mot "elephant" dont toutes les voyelles sont remplacées par le même caractère.
*a*a*i*e
Le mot "*a*a*i*e" contient le mot "banalise" dont toutes les consonnes sont remplacées par le même caractère.
p4$$w0rd
Le mot "p4$$w0rd" contient une version cow-boy du mot password.
|v|a|v|a|\|
Le mot "|v|a|v|a|\|" contient une version cow-boy du mot maman.
^ztzfod
Le mot "^ztzfod" est un déplacement du clavier du mot "paradis".
à(à-&ç--
Le mot "à(à-&ç--" est une date, entrée au clavier sans le shift.
Prfuson
Le mot "prfuson" est à 77% du mot "perfusion".
monsieuremadamc4r1b0v
Le mot "monsieuremadamc4r1b0v" contient le mot monsieur, l'inverse du mot madame (emadam) et une version cow-boy du mot caribou (c4r1b0v).
Reset des mots de passes
30% des appels au support concernent le reset de mot de passe. Si l’utilisateur perd son mot de passe, il est possible d’en obtenir automatiquement un nouveau. En usurpant son identité, un pirate peut appliquer la procédure, à l’insu de l’utilisateur.
Avant de reseter un mot de passe, il peut être judicieux d’effectuer quelques vérifications sur l’utilisateur. En lui posant une des questions qu’il a indiquées lors de son enregistrement, on peut renforcer le processus.
Il ne faut jamais redonner le mot de passe courant. En changeant systématiquement le mot de passe, si le processus est perverti par un pirate, l’utilisateur officiel ne pourra plus s’authentifier. Cela permettra de détecter la supercherie.
Pour éviter qu’un pirate applique la procédure de reset, à l’insu de l’utilisateur, il faut informer les administrateurs qu’ils doivent suivre un processus rigide pour reseter un mot de passe. Par exemple, ils doivent avoir l’utilisateur physiquement devant eux. Une autre approche consiste à utiliser une procédure de rappel. L’annuaire d’entreprise est utilisé pour contacter l’utilisateur sur son téléphone. Le mot de passe créé à cette occasion doit avoir une durée de vie de première utilisation limitée à quelques heures, et doit être immédiatement changé par l’utilisateur. Sinon, tout le processus doit être repris.
Pour éviter un risque d’usurpation d’identité par un administrateur souhaitant prendre la place d’un utilisateur, un mot de passe aléatoire doit être généré, et envoyé à l’utilisateur par un canal sécurisé. L’administrateur n’a pas à le connaître. La messagerie électronique est une approche possible, mais elle est risquée s’il est possible d’écouter le mot de passe de messagerie de l’utilisateur sur le réseau. Si l’utilisateur possède une messagerie et un couple clef publique/clef privée, ce canal peut être utilisé. Une autre approche consiste à envoyer un SMS sur le téléphone portable du destinataire.
L’utilisateur peut également prouver qui il est en répondant à une question choisie par lui, dont il est le seul à connaître la réponse. Attention, les personnes de sa famille ont souvent les réponses aux questions personnelles.
Il est judicieux de confirmer le changement de mot de passe par un e-mail, sans en indiquer la valeur. Ainsi, si un pirate arrive à modifier le mot de passe, l’utilisateur est prévenu.
Afin d’éviter l’administration des comptes bloqués, il ne faut pas les invalider après plusieurs échecs, mais mettre en place une contre mesure contre les attaques en forces brutes. Après trois échecs lors d’une connexion, l’utilisateur ne peut plus se connecter pendant une heure. Aucun message ne l’informe de cela. Il reçoit toujours le même message lui indiquant qu’il n’est pas reconnu. Après une heure de silence, une nouvelle connexion est possible.
La Figure suivante décrit une proposition de vérification d’authentification de l’utilisateur.

