Question:
Qu'est-ce qui rend les générateurs de nombres aléatoires si fragiles?
john doe
2018-07-29 06:10:18 UTC
view on stackexchange narkive permalink

Il me semble qu'un composant matériel qui génère des nombres aléatoires est extrêmement simple - il suffit de mesurer de minuscules vibrations dans le matériel avec un capteur, non? Peut-être que je me trompe, mais il semble que si vous mesuriez les vibrations avec une très grande précision, vous pourriez facilement générer des nombres aléatoires imprévisibles.

Cependant, je suis un noob en cryptographie, et je connais peu de choses. Alors je lis et un article dit:

et vous n’avez pas besoin d’être aussi sophistiqué pour affaiblir un générateur de nombres aléatoires. Ces générateurs sont déjà étonnamment fragiles et il est terriblement difficile de détecter quand l’un d’entre eux est en panne. Les responsables de Debian ont magnifiquement fait valoir ce point en 2008, lorsqu'un nettoyage de code errant a réduit l'entropie effective d'OpenSSL à seulement 16 bits. En fait, les RNG sont si vulnérables que le défi ici n'est pas d'affaiblir le RNG - tout idiot avec un clavier peut le faire - il le fait sans rendre l'implémentation trivialement vulnérable à tout le monde.

Il me manque sûrement des détails critiques sur la façon dont la génération de nombres aléatoires est «fragile». Quelqu'un peut-il expliquer?

La vibration serait probablement plus cohérente mathématiquement que vous ne le pensez.L’une des méthodes que j’ai vues pour un simple générateur matériel était de polariser en inverse un transistor, ce qui produit un caractère aléatoire au niveau quantique.Ce n’était qu’un simple circuit Arduino ... Je suis sûr que les vrais packages matériels aléatoires sont plus sophistiqués.Mais tous les systèmes n'ont pas de matériel à leur disposition ... en particulier dans les systèmes virtualisés.
Il faut également noter que la section de l'article que vous citez parle d'une faiblesse découverte dans un * logiciel * générateur de nombres aléatoires.
@HarryJohnston Je vois ... Pour une raison quelconque, j'ai supposé que les nombres aléatoires importants seraient toujours générés côté serveur avec du matériel approprié.J'essaie d'entrer dans la cryptographie et c'est un sujet énorme à apprendre.Devrait probablement lire un livre
@johndoe Lorsque mon téléphone ouvre un site Web HTTPS, mon téléphone et le serveur doivent générer des nombres aléatoires secrets.Bienvenue dans la cryptographie!C'est un vaste domaine, mais commencez par un coin que vous comprenez et développez vos connaissances à partir de là.J'ai trouvé la lecture et les réponses aux questions sur ce site extrêmement utiles pour mon apprentissage.
J'ai lu cette citation en tant que quelqu'un qui n'est pas un expert en cryptographie donnant l'avertissement général "À MOINS DE SAVOIR CE QUE VOUS FAITES, NE MODIFIEZ PAS LE CODE CRYPTO, et même dans ce cas, faites-le très soigneusement."Je ne pense pas que les RNG soient spéciaux à cet égard;tout code cryptographique serait fragile si les gens commençaient à apporter des modifications au code qu'ils ne comprennent pas.
@MikeOunsworth C'est particulièrement vrai étant donné que de nombreux CSPRNG sont basés sur d'autres primitives cryptographiques comme AES, ChaCha20 ou SHA-1.Changez une seule ligne dans SHA-1 et vous perdez la non-linéarité, cassant complètement un PRNG basé sur elle.Le code cryptographique doit être considéré comme sacré!
Il convient de noter que le fiasco Debian RNG n'avait que très peu à voir avec la fragilité de la cryptographie en soi - c'était principalement une conséquence de la facilité avec laquelle il est facile d'introduire des erreurs silencieuses (comme l'invocation d'un comportement non défini) dans certains langages.
Fragile signifie ici "des mathématiques si complexes qu'il est facile de casser sans être évident et nous étions trop paresseux pour créer même des suites de tests basiques pour vérifier les performances de nos codes"
@MikeOunsworth Pour être honnête, c'était un code crypto complètement horrible et stupide qui n'aurait pas dû être écrit en premier lieu.
`Peut-être que je me trompe, mais il semble que si vous mesuriez les vibrations avec une très grande précision` En supposant que la partie vibrante a une plage de mouvement maximale, je peux effectivement" dé-randomiser "ma fonction aléatoire en plaçant l'ordinateur dans un environnement avecperturbations (assurant ainsi une vibration cohérente d'une limite à l'autre).En ignorant cette faille, vous ne garantissez toujours que des données _ non prévisibles_, mais pas nécessairement des données ** impartiales **.Il n'y a aucune attente de distribution égale dans votre oscillateur.
Cinq réponses:
forest
2018-07-29 08:11:50 UTC
view on stackexchange narkive permalink

RNG matériel vs logiciel

La première chose que vous mentionnez est une source de bruit matériel. La mesure de haute précision de certains phénomènes métastables suffit à générer des données imprévisibles. Cela peut être fait avec une diode Zener polarisée en inverse, avec des oscillateurs en anneau, avec un ADC, ou même avec un compteur Geiger. Cela peut même être fait en mesurant les retards au niveau de la nanoseconde dans le temps entre les frappes. Ces sources de bruit peuvent échouer si le matériel lui-même commence à tomber en panne. Par exemple, un transistor peut tomber en panne s'il n'est pas spécifiquement conçu pour fonctionner en sens inverse à des tensions élevées. Bien que ces techniques aient différents niveaux de fragilité, ce n'est pas ce qui est discuté dans le texte que vous avez cité.

Le deuxième type de RNG que vous mentionnez est un logiciel RNG appelé générateur de nombres pseudo-aléatoires (PRNG * ). Il s'agit d'un algorithme qui prend une graine , qui est comme une clé de chiffrement, et l'étend en un flux de données sans fin. Il essaie de s'assurer que les données ne peuvent pas être prédites, ou divisées en dehors du pur hasard, sans connaissance de la graine aléatoire secrète avec laquelle l'algorithme a commencé. Dans ce cas, le PRNG est implémenté dans un logiciel pur, il suffit donc d'introduire un bogue dans le code, ce dont parle le texte que vous avez cité. Il s'agit simplement d'un code fragile , risquant un échec complet si des modifications apportées au code s'écartent du comportement prévu de l'algorithme.

Un PRNG peut être considéré comme une nouvelle algorithme de cryptage ciblé. En fait, vous pouvez créer un PRNG sécurisé par cryptographie en utilisant un chiffrement comme AES pour crypter un compteur. Tant que la clé de chiffrement (graine) est secrète, la sortie ne peut pas être prédite et la graine ne peut pas être découverte. Quand on y pense de cette façon, il devient plus facile de comprendre comment un petit changement sans conséquence dans le code peut complètement briser la sécurité de l'algorithme.

Collecter le caractère aléatoire

Alors, comment les appareils modernes collectent-ils le caractère aléatoire? Prenons un serveur fonctionnant tranquillement dans un centre de données quelque part. Afin de prendre en charge des éléments tels que TLS, il a besoin d'une grande quantité de données totalement imprévisibles qui ne peuvent pas être distinguées d'un flux vraiment aléatoire. Sans une source de bruit matérielle dédiée, le caractère aléatoire doit provenir de l'intérieur. Les ordinateurs s'efforcent d'être pleinement déterministes, mais ils ont beaucoup d'entrées provenant d'appareils non déterministes. Entrez ... interruptions!

Dans le matériel moderne, une interruption est un signal émis par le matériel pour alerter le CPU d'un changement d'état. Cela permet au processeur d'éviter d'interroger rapidement chaque périphérique matériel pour les mises à jour et de croire à la place que le périphérique l'alerte de manière asynchrone le moment venu. Lorsqu'une interruption se produit, un gestionnaire d'interruption est appelé pour traiter le signal. Il s'avère que ce gestionnaire est l'endroit idéal pour obtenir le hasard! Lorsque vous mesurez la synchronisation des interruptions au niveau de la nanoseconde, vous pouvez rapidement obtenir un peu de hasard. En effet, des interruptions sont déclenchées pour toutes sortes de choses, des paquets arrivant sur le NIC aux données lues à partir d'un disque dur. Certaines de ces sources d'interruption sont hautement non déterministes, comme un disque dur qui repose sur le mouvement physique d'un actionneur.

Une fois que suffisamment de bits aléatoires ont été collectés par le système d'exploitation, une petite graine d'au moins 128 bits peuvent être introduits dans un PRNG cryptographiquement sécurisé pour générer un flux illimité de données pseudo-aléatoires. À moins que quelqu'un puisse prédire exactement quand chaque interruption passée s'est produite, avec une précision de l'ordre de la nanoseconde, il ne sera pas en mesure de dériver la graine et ne pourra pas prédire la sortie future du PRNG. Cela rend la sortie parfaitement adaptée aux clés TLS.

* Un PRNG axé sur la sécurité est appelé un PRNG cryptographiquement sécurisé, ou CSPRNG. L'utilisation d'un PRNG normal lorsqu'une application appelle un CSPRNG peut entraîner des failles de sécurité.

Les diodes zenner ne sont pas spécifiquement conçues pour fonctionner en sens inverse?
C'est une diode Zener, pas zenner - elle a été nommée d'après [Clarence Zener] (https://en.wikipedia.org/wiki/Clarence_Zener).
@hytromo Pas à la tension de claquage pendant de longues périodes.Vous avez besoin d'une diode à avalanche pour gérer cela pendant très longtemps.J'ai reformulé cette phrase pour être plus précise (je ne me rendais pas compte à quel point cela semblait ridicule!)
Je pense que vous devriez supprimer la phrase "non spécifiquement conçue pour fonctionner en sens inverse à haute tension".Les diodes dites "Zener" peuvent utiliser des effets Zener ou des effets d'avalanche ou les deux et bien sûr elles sont conçues pour fonctionner indéfiniment en cas de panne inversée.Peut-être avez-vous eu l'idée parce que les jonctions transistor E-B sont parfois utilisées en cas de panne inversée, et elles ne sont pas conçues pour être utilisées de cette manière.
J'aime cette réponse, sauf qu'elle ne mentionne même pas les PRNG par rapport aux CSPRNG.Un seul fait réellement une tentative d'être _imprévisible_;l'autre essaie simplement de vous fournir un grand nombre de chiffres qui semblent, à un coup d'œil sans instruction, sans rapport.(Pas dans cet ordre.) C'est une distinction importante à faire, en particulier sur ce site.L'utilisation d'un PRNG là où vous vouliez utiliser un CSPRNG peut causer de graves problèmes, et l'inverse peut perdre beaucoup de performances (ce qui peut également causer des problèmes)
@NicHartley J'ai ajouté une note de bas de page pour expliquer la différence.Merci!
Harry Johnston
2018-07-29 07:15:35 UTC
view on stackexchange narkive permalink

Historiquement, les RNG matériels adaptés à la cryptographie n'étaient pas couramment disponibles sur le PC: par exemple, selon cette question, AMD n'a ajouté le support qu'il y a quelques années, de sorte que même aujourd'hui, un éditeur de logiciel peut " t supposons simplement qu'il sera disponible. C'est probablement pourquoi OpenSSL (comme indiqué dans votre devis) utilisait un logiciel RNG, ce qui le rendait vulnérable au bogue trouvé dans le code.

(Comme discuté en détail dans les commentaires, un PC standard contient un certain nombre de «sources d'entropie» qu'un logiciel RNG peut utiliser - et je crois qu'OpenSSL le fait, même si je ne suis pas très familier avec lui - mais de toute évidence dans ce scénario, un bogue dans le logiciel peut entraîner de mauvais nombres aléatoires, comme cela s'est produit.)

Il y a aussi des inquiétudes concernant le fait que les RNG matériels aient pu être détournés , amenant les gens à combiner les RNG matériels avec d'autres sources d'entropie plutôt que de les utiliser tels quels. (Le matériel de porte dérobée est également mentionné dans votre article lié, à quelques paragraphes du bit que vous avez cité.)

Il convient également de mentionner que les RNG matériels ne sont pas aussi simples à implémenter que votre question suggère ... d'une part, les implémentations naïves pourraient être vulnérables à diverses attaques physiques, par exemple, si vous générez des bits aléatoires basés sur des vibrations, que se passe-t-il si quelqu'un vise une échographie? Même dans des conditions idéales, il y aura probablement une sorte de biais dans les résultats qui pourrait rendre les bits générés dangereux pour une utilisation cryptographique.

C'est pourquoi les implémentations du monde réel utilisent le bruit matériel mais aussi le traitent cryptographiquement. Mais à ce stade, vous revenez à la question de savoir si l'algorithme (ou son implémentation) a été délibérément saboté, ou peut-être n'est-il pas aussi robuste qu'on le croit.

Un avertissement: je ne suis pas un expert ici.Si vous souhaitez plus de détails, vous voudrez peut-être faire un suivi sur le site Stack Exchange Cryptography.
En fait, les RNG matériels étaient disponibles depuis très longtemps.Vous confondez les instructions d'aléa du processeur pour un RNG matériel de tout type.Même les consoles vidéo de première génération utilisaient ce que l'on pourrait appeler un RNG matériel.
@forest, mais ils n'étaient pas standard sur les PC.
@HarryJohnston: la plupart des PC ont d'excellentes sources d'aléa.Réglez le gain analogique d'une carte son au maximum et vous obtenez un bruit thermique.Tournez le gain analogique d'une webcam au maximum et vous obtenez un bruit thermique.Mesurez les variations des entrées utilisateur et vous obtenez du bruit.Mesurez les fluctuations de la vitesse de rotation d'un disque dur en raison de la turbulence et vous obtenez du bruit.Mesurez les fluctuations de tension sur la carte mère et vous obtenez du bruit.Vous pouvez google / bing pour LavaRand, par exemple.Ce que vous n'aviez pas jusqu'à récemment, c'était un RNG matériel intégré au CPU, avec des instructions standardisées correspondantes.
@JörgWMittag, la plupart des systèmes n’ont pas ce matériel.Aucun serveur dans un rack n'a de carte son, de webcam ou de périphérique d'entrée utilisateur, et la plupart des plus récents ont des disques SSD au lieu de disques durs.Et ils ne disposent pas d'appareils de mesure de haute précision.Une solution doit s'appliquer à tous les types de machines, pas seulement à un ordinateur de bureau ou portable traditionnel.
@JörgWMittag, l'OP n'a pas posé de questions sur les «sources d'aléatoire».
@JohnDeters Eh bien, une autre option évidente pour obtenir un certain caractère aléatoire est de mesurer le rythme d'arrivée des paquets sur les interfaces réseau.(Cela fonctionne probablement mieux sur un serveur occupé que sur un ordinateur personnel.) Les serveurs ont généralement un certain nombre de capteurs de température;de petites variations peuvent fournir un peu de hasard.Idem avec les capteurs de tension.Les SSD peuvent ne pas souffrir de variations induites par la turbulence, mais la synchronisation des E / S n'est de toute façon pas complètement déterministe au niveau de la nanoseconde.Même être capable de collecter seulement un bit par seconde de bon caractère aléatoire vous donne une graine aléatoire solide en deux minutes.
@JohnDeters: Tout ordinateur avec au moins deux cristaux d'horloge a une source d'entropie vraie extrêmement bonne: le taux de l'un par rapport à l'autre.Les cristaux d'horloge sont sujets à une réponse en fréquence non linéaire à de minuscules changements de température et à d'autres conditions environnementales, et ces réponses sont sujettes à une hystérésis.(Corollaire: il n'y a pas d'émulation parfaite du cycle d'un ordinateur avec plus d'une source d'horloge)
Je tiens à souligner que ma réponse ne traite délibérément pas de la question de l'obtention d'entropie pour les générateurs de nombres aléatoires logiciels, car je ne la considère pas comme directement pertinente par rapport à la question initiale.Le débat sur ce point peut-il être repris ailleurs?
Les SSD @JohnDeters: sont d'excellentes sources d'entropie.Le cycle d'écriture fonctionne comme `while (valeur_cellule! = Valeur_désirée) écriture (cellule, valeur_désirée)`.Cette boucle est nécessaire car la fonction `write` n'est pas aussi fiable.C'est particulièrement un problème avec la mémoire TLC moderne qui utilise 8 niveaux de tension.
@R .. Corollaire au corollaire: vous n'avez pas besoin d'une émulation de cycle parfait parce que l'ordinateur lui-même n'était pas parfait de cycle.
Une attaque par ultrasons est-elle vraiment faisable par rapport à d'autres attaques connues?Des dizaines de vulnérabilités ont été découvertes dans les RNG au fil des ans, et aucune des plus importantes dont je me souviens n'exige une proximité physique.
@CodyP, contre les RNG du monde réel?J'espère que non, mais cela pourrait fonctionner contre un RNG matériel naïf du type de celui que l'OP demandait.(J'ai choisi les ultrasons en particulier parce que l'OP suggérait de mesurer les vibrations.) Si un RNG naïf compte le nombre de fois qu'un détecteur de vibrations se déclenche dans une période de N microseconde, et génère un un s'il est supérieur à X ou à zéro sinon - etalors le logiciel enchaîne littéralement ces bits ensemble pour générer une clé de cryptage - alors vraisemblablement une échographie pourrait facilement le faire générer tous.
... mais ce genre d'approche n'a jamais été susceptible d'être une attaque de haut niveau, car personne ne construit des RNG qui fonctionnent de cette façon.Pas pour un usage cryptographique, de toute façon.
paj28
2018-07-30 21:49:45 UTC
view on stackexchange narkive permalink

Parce qu'ils sont difficiles à tester

Bien qu'il soit facile de tester qu'un générateur de nombres aléatoires produit une sortie avec le bon format, déterminer s'il est statistiquement aléatoire est beaucoup plus complexe et peu susceptible d'être inclus dans une suite de tests automatisés. Beaucoup d'autres codes seront beaucoup plus évidents si vous le cassez.

La cryptographie doit être correcte

En général, s'assurer que le code est correct est difficile. Une grâce salvatrice pour beaucoup de code est que seule une petite proportion d'erreurs d'exactitude entraîne des vulnérabilités de sécurité. Mais avec le code cryptographique - y compris les générateurs de nombres aléatoires - de nombreuses erreurs d'exactitude entraîneront des vulnérabilités. Le code cryptographique doit être correct, pour être sécurisé, et s'assurer qu'il est correct est difficile.

Le responsable Debian a fait une erreur majeure

Le code n'est pas en fait si fragile. Pour qu'il soit rendu non sécurisé, il a fallu des défaillances majeures de la part du mainteneur. Simplement découper les lignes qui produisent des avertissements avec seulement des vérifications superficielles que rien n'est cassé, c'est plutôt de mauvaise qualité.

Modifier: ce n'était pas seulement le faute du mainteneur, voir le commentaire d'Angel

Eh bien, le responsable Debian [a demandé sur la liste de diffusion openssl] (https://marc.info/?t=114651088900003&r=1&w=2), notant que "le pool pourrait recevoir moins d'entropie", et a été essentiellement dit "supprimez-les"
@ Ángel - Merci de m'en avoir informé, cela déplace considérablement la responsabilité.
supercat
2018-08-01 02:16:43 UTC
view on stackexchange narkive permalink

L'un des aspects les plus importants de tout générateur aléatoire est que la valeur de chaque bit aléatoire doit non seulement être complètement indépendante des valeurs de tous les autres bits qu'il génère, mais elle doit également être complètement indépendante de tout le reste dans l'univers, un adversaire pourrait observer ou influencer . Malheureusement, cette propriété est souvent l'une des plus difficiles à garantir. Le mieux que l'on puisse faire est généralement de générer des bits d'une manière qui est peu susceptible d'avoir une relation exploitable avec quoi que ce soit d'autre dans l'univers.

À titre d'exemple simple, si un adversaire avec un émetteur RF hautement focalisé avait une capacité à influencer votre générateur de nombres aléatoires de sorte que certains échantillons de son choix aient une probabilité de 95% d'en donner, tandis que le reste n'aurait qu'une probabilité de 5% de le faire. Si l'on devait simplement lire 128 bits à partir d'un tel générateur et les intégrer dans une clé de 128 bits, un attaquant qui focalisait une attaque par force brute sur des modèles de bits proches de celui utilisé pour influencer le générateur aurait une bien plus grande probabilité de succès rapide que si le générateur avait été impartial. Supposons, cependant, qu'au lieu de choisir les bits un à la fois, on choisisse des groupes de 7 bits et les corrige ensemble. Faire cela augmenterait sept fois le temps de génération d'une clé de 128 bits, mais l'influence d'un attaquant passerait de 95/5 à 74/26, réduisant considérablement la probabilité que la clé finisse par être proche du motif de bits de l'attaquant. essayer de forcer.

Comme alternative, supposons que l'on génère 128 bits aléatoires, les hache d'une manière ou d'une autre, puis les xor avec 128 autres bits aléatoires. Cela ne nécessiterait que la génération de 256 bits au lieu de 896, mais rendrait très difficile pour un attaquant d'exploiter tout biais dans le générateur. Même si l'énumération des modèles les plus probables de 95 000 000 000 bits de 128 bits aurait environ 50% de chances de correspondre à un groupe de 128 bits utilisé avant le hachage, ou celui avec lequel la valeur hachée a été xor'ed, la distribution finale après le xor il est peu probable qu'il y ait un biais exploitable ou des fuites d'informations.

Cody P
2018-08-02 04:51:26 UTC
view on stackexchange narkive permalink

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.

Pourquoi la mise en place du RTC n'affecterait-elle en rien le caractère aléatoire?
@forest RTC est utilisé pour le pool d'entropie Linux, donc si le RNG est utilisé à un moment prévisible (par exemple, générer des clés au démarrage), cela peut conduire à des clés plus prévisibles.Je vais modifier ma réponse pour clarifier.Voir cet article pour en savoir plus: https://factorable.net/weakkeys12.extended.pdf
Ce n'est pas le RTC, c'est le TSC (compteur de cycle de référence via l'instruction RDTSC, bien que certains systèmes MIPS32 utilisent un compteur différent, je crois).Le RTC n'a qu'une seconde de granularité et une latence significative et _de nombreux systèmes_ n'en ont pas, mais cela n'a aucun effet sur le pilote de randomisation.Et vous ne pouvez pas désactiver le TSC dans le noyau sans le patcher intentionnellement pour forcer CR4.TSD, même si je pense que cela pourrait même ne pas avoir d'effet sur le code de l'anneau 0 de toute façon.Il y a vraiment très peu de choses que vous pouvez faire au niveau de Kconfig pour altérer considérablement la collecte d'entropie.Même tuer HPET est inoffensif.
Ce que je veux dire, c'est que vous parlez probablement du compteur d'horodatage (TSC), pas de l'horloge en temps réel (RTC).
En relisant l'article, il semble faire référence à l'initialisation du pool d'entropie, qui affecte les clés générées avec / dev / urandom au premier démarrage, avant que le pool d'entropie ne soit "rempli".Cette initialisation du pool se fait avec l'heure de démarrage.Peut-être que le changer en "comme générer des clés dans la minute suivant le premier démarrage" serait plus clair et moins ambigu.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...