Faible caractère aléatoire
L’aspect aléatoire n’est pas la même chose qu’imprévisible.
Qu'est-ce que Faible caractère aléatoire?
Un faible caractère aléatoire consiste à créer une valeur indevinable avec un générateur rapide et non cryptographique. L’uniformité statistique n’est pas imprévisible : l’État est petit et la fonction de transition est déterministe. Math.random() dans V8 est xorshift128+, 128 bits d'état reconstructibles à partir de quatre sorties observées. Vous collecterez des jetons de réinitialisation à partir d'un compte que vous contrôlez, déterminerez l'état, prédirez le prochain jeton et reprendrez le compte d'épargne d'un étranger sans toucher à sa boîte de réception. Le correctif est une ligne, crypto.randomBytes(32).toString('hex') , et le hachage d'une sortie faible ne change rien.
Ce que vous apprendrez dans Faible caractère aléatoire
- Distinguer un PRNG (rapide, statistiquement uniforme) d'un CSPRNG (résistant à la récupération d'état à partir des sorties observées)
- Reconnaître que le hachage de la sortie d'un PRNG faible ne le rend pas sûr, le hachage est déterministe et l'entrée est toujours prévisible
- Appliquez <code>crypto.randomBytes</code> / <code>crypto.randomUUID</code> (Node), <code>crypto.getRandomValues</code> (Web Crypto) ou <code>os.urandom</code> (Python) pour chaque valeur sensible à la sécurité
- Auditez la base de code pour les sites d'appel adjacents, réinitialisez les jetons, les jetons d'invitation, les codes de sauvegarde MFA, l'état OAuth, les noms occasionnels d'URL signés, les générateurs de mots de passe administrateur partagent tous la même vulnérabilité lorsqu'ils sont dérivés de <code>Math.random</code>.
- Internalisez la règle : une valeur qu'un attaquant aurait intérêt à prédire doit provenir d'une source cryptographique par défaut, chaque langage en fait un choix en une seule importation, donc une mauvaise valeur par défaut n'a aucune excuse
Faible caractère aléatoire — Étapes de la formation
-
Évaluez la cible
Bob gagne sa vie en accédant aux comptes des autres et en y récupérant l'argent. Aujourd'hui, sa cible est Nestward, une application d'épargne où un seul compte peut contenir des soldes réels. Il commence par la page de réinitialisation du mot de passe, la porte d'entrée qu'il prévoit de franchir, pour voir comment fonctionne la récupération avant de la toucher.
-
Comment fonctionne la récupération
Un détail sur cette page est la seule raison pour laquelle Bob est intéressé.
-
Demander une réinitialisation pour lui-même
Bob commence avec les codes qu'il est autorisé à voir. Il possède le compte jetable bob.reeve@proton.me. Il demande donc une réinitialisation et ouvre l'e-mail renvoyé par Nestward. Le lien de réinitialisation contenu dans cet e-mail contient le code dans son intégralité.
-
Récupérez un deuxième code
Un code ne suffit pas pour voir un modèle, alors Bob demande une autre réinitialisation pour le même compte et lit le deuxième e-mail.
-
Encore un code
Une troisième réinitialisation donne à Bob les trois codes dont son solveur a besoin. Il lit le dernier email et aligne les codes.
-
Prédire le prochain code
Nestward crée ces codes avec un générateur rapide et non cryptographique doté d'un petit état interne. Bob transmet les trois codes qu'il a lus dans sa boîte de réception dans un solveur qui reconstruit cet état et le fait avancer. L'outil imprime le code exact que l'application mettra dans le tout prochain lien de réinitialisation qu'elle enverra, quel que soit le compte auquel la réinitialisation est destinée.
-
Déclencher la réinitialisation de la victime
Le code prédit est le prochain que le générateur émettra, donc Bob doit lui faire émettre ce code maintenant. Il demande une réinitialisation pour un vrai client, renata.voss@gmail.com. Nestward crée le code suivant, le dépose dans un lien et l'envoie par e-mail à Renata, une boîte de réception que Bob ne peut pas lire.
-
Utiliser le code prédit
Maintenant, Bob utilise le code qu'il avait prédit. Il l'envoie directement au point final de réinitialisation avec un nouveau mot de passe, et comme il correspond au code que Nestward vient d'envoyer à Renata, le serveur l'accepte et définit son mot de passe sur son compte.
-
Le compte est à lui
Le point de terminaison a accepté le code et a modifié le mot de passe. Bob est désormais connecté à un compte d'épargne qui n'est pas le sien.
-
Contrôle des connaissances
Vous venez de voir un attaquant prédire un code de réinitialisation qui ne lui a jamais été montré. Expliquez pourquoi cela a été possible.
Couverture des référentiels de sécurité
OWASP Top 10
- A04:2025 Cryptographic Failures
- A02:2021 Cryptographic Failures
CWE
- CWE-330 Use of Insufficiently Random Values
- CWE-338 Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG)
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security