Les RNG sécurisés couramment utilisés comme Linux / dev / random, ChaCha20 ou RdRand fonctionnent bien dans de nombreux cas conventionnels. Cependant, ils sont loin d'être à l'épreuve des idiots. Supposons que vous fassiez quelque chose de drôle, comme ne pas configurer votre horloge en temps réel lors de la génération de nombres aléatoires au démarrage. Si vous ne comprenez pas comment cela affectera votre RNG, quelqu'un qui le fait pourrait repartir avec votre clé privée. Il y a peu de place pour l'erreur ici, car une petite quantité de non-aléatoire peut compromettre un protocole cryptographique entier comme la génération de clés.
Tandis que les problèmes avec les implémentations naïves de générateurs de nombres aléatoires ou les interférences physiques dans votre matériel permettent de bonnes discussions, la plupart des vulnérabilités dans l'actualité avec les générateurs de nombres aléatoires, comme le problème Debian que vous avez mentionné n'est pas dû à ces problèmes. Les plus gros problèmes que j'ai vus à plusieurs reprises sont les développeurs qui pensent qu'ils ont une bonne source d'entropie pour amorcer le générateur de nombres aléatoires alors qu'ils ne le font pas, ce qui permet par erreur de découvrir et d'exploiter l'état du générateur aléatoire, ou le manque de tests rigoureux. du générateur de nombres aléatoires lui-même. La NSA n'a pas besoin de backdoor votre génération de clé si vous êtes l'un des 0,75% des clients TLS utilisant des clés à faible entropie. En résumé, les développeurs ignorent les quelques avertissements, voire aucun, et supposent que leur RNG fonctionnera dans n'importe quelle application.
Qu'est-ce que l'entropie et où en obtenir?
Puisque tous les programmes informatiques produisent les mêmes sorties étant donné les mêmes entrées, elles doivent lire à partir d'une source d'entropie (ou de données imprévisibles) dans le système d'exploitation ou le matériel. De nos jours, nous avons des choses comme la commande RdRand qui peuvent générer des dizaines ou des centaines de Mo d'entropie par seconde. Cependant, les appareils avec des générateurs de nombres aléatoires matériels comme le Ferranti Mark 1 en 1951 ou le Intel 82802 Firmware Hub en 1999 étaient l'exception plutôt que la règle jusqu'aux années 2010.
Donc, historiquement, les générateurs de nombres aléatoires reposent sur des sources d'entropie relativement lentes comme les entrées humaines ou les synchronisations de l'ordinateur, et les systèmes hérités peuvent avoir presque aucune fonction intégrée avec de bonnes sources d'entropie disponibles. / Dev / random de Linux, par exemple, peut utiliser l'heure de démarrage, la synchronisation des périphériques d'entrée humains, les synchronisations du disque, les synchronisations IRQ et même la modification du pool d'entropie par d'autres threads
À bien des égards, les générateurs de nombres aléatoires sont fragiles parce que ces méthodes standard pour obtenir l'entropie ne sont pas infaillibles. Tout ce qui rend ces sources d'entropie prévisibles ou limitées compromettra votre RNG, par exemple:
- Le bogue Debian que vous avez noté n'utilisait que l'identifiant de processus pour l'entropie.
- Si vous utilisez un système d'exploitation pré-configuré sans tête qui génère des clés au démarrage, de nombreuses sources d'entropie de Linux pourraient être prévisibles. source
- L'architecture de cryptographie Java d'Android s'est avérée nécessiter une initialisation explicite à partir d'une bonne source d'entropie sur certains appareils.
- Générer des nombres aléatoires trop rapidement sous Linux épuisera le pool d'entropie plus rapidement qu'il ne peut être reconstitué, conduisant à des nombres moins aléatoires.
Comprendre l'état et l'absence de réensemencement
Souvent, les RNG n'obtiennent pas de nouvelle entropie à chaque appel de fonction comme le fait / dev / random. Parfois, vous ne pouvez pas obtenir assez d'entropie assez rapidement, ou vous ne faites pas entièrement confiance à la source d'entropie. Au lieu de cela, le RNG est amorcé avec une source d'entropie connue, puis produit des valeurs indépendantes à partir de cette graine. Cependant, lorsque quelqu'un découvre l'état interne du générateur, les choses se passent mal, ce qui conduit à tout, du clonage de cartes à puce à la triche d'une machine à sous à Vegas.
Une attaque par débordement de tampon ou une attaque similaire peut révéler l'état du générateur de nombres aléatoires. L'apprentissage de l'état peut également être possible avec une attaque par force brute, en particulier si l'algorithme est connu et réversible, peut être calculé rapidement ou si un texte en clair est connu. C'était le cas pour les problèmes avec Windows XP, la bibliothèque Dropbear SSH, XorShift128 + dans Chrome et l ' algorithme Messerne twister, parmi tant d'autres.
Exiger une atténuation avancée pour ces attaques d'état connu rend le RNG fragile. La meilleure façon d'atténuer les attaques à l'état connu est de ne pas utiliser d'algorithme vulnérable (comme la plupart des CSRNG). Cette question explique également plus en détail ce qui rend un bon RNG sécurisé. Cependant, même les CSRNG ont parfois aussi des faiblesses (par exemple, la vulnérabilité RNG dans le noyau Linux 2.6.10). Par conséquent, la défense en profondeur nécessite des atténuations telles que l'utilisation d'états séparés pour les générateurs de nombres aléatoires (peut-être un par utilisateur), l'actualisation fréquente de la graine et des protections contre les attaques de canaux secondaires et les débordements de tampon.
Rejeter le blâme entre les développeurs et les utilisateurs
Souvent, ces RNG sont fragiles en raison d'une mauvaise communication des limitations entre les développeurs de bibliothèques ou les créateurs de systèmes d'exploitation qui ne peuvent pas concevoir un système infaillible et les utilisateurs qui attendent un. Linux, par exemple, oblige les utilisateurs à choisir entre une latence élevée / dev / random et potentiellement une faible entropie / dev / urandom. Autre exemple, PHP avant la version 5.3 n'avait pas de support pour les PRNG forts dans Windows via des interfaces telles que mcrypt_create_iv (), et avant la version 7.0 n'avait pas un bon CSPRNG intégré.
Difficulté de détection
Il y a un point de discussion populaire lors de la discussion des nombres aléatoires qui, pour un nombre vraiment aléatoire, chaque possibilité est également probable et il y a un nombre infini de modèles potentiels. Alors, comment pouvez-vous vraiment regarder une séquence et dire qu'elle n'est pas aléatoire? (Dilbert pertinent)
En réalité, la détection de motifs dans des nombres aléatoires est un domaine mature, bien qu'imparfait, et la question de savoir si le non-aléatoire peut être détecté a été abordée depuis M.G. Article de Kendall et B. Babington-Smith de 1938. Vous pouvez démontrer que certains types de modèles ne sont pas beaucoup plus susceptibles d’apparaître que le hasard. Par exemple, je peux vérifier si le chiffre 1 est plus courant que les autres chiffres, avec des seuils déterminés par un test du chi carré. Tant que ces modèles testés sont au moins probables à distance et que vous vérifiez un ensemble suffisamment long de nombres générés, la probabilité d'un faux positif est faible. Bien que certains problèmes cachés avec certains générateurs de nombres aléatoires puissent ne pas être détectés pendant des années, si vous avez effectué une analyse cryptographique de base et appliqué des tests de qualité industrielle comme indiqué dans cette question, vous Je ne peux pas vous tromper.
Cependant, les concepteurs peuvent aussi sous-estimer leurs attaquants (comment étiez-vous censé prédire que les gens procéderaient à une rétro-ingénierie et chronométreraient votre machine à sous?). Pire encore, parfois le générateur de nombres aléatoires ou la génération d'entropie n'est jamais inspecté par un expert, et seul le résultat de l'utilisation du RNG est examiné, comme lorsque les signatures du micrologiciel PS3 étaient signées avec une sortie «aléatoire» constante.
En fin de compte, le problème ici est similaire à celui d'une grande partie de la cybersécurité: vous avez un ensemble très complexe de protocoles, d'exigences et d'appareils pour les nombres aléatoires. Comme toujours, si vous ne comprenez pas la complexité, vous êtes vulnérable à un attaquant qui le comprend.