Selon ce article de The Register du 2018-08-28 et d’autres articles, la version 4.19 du noyau Linux aura un drapeau de compilation nommé RANDOM_TRUST_CPU
. Voici également un lien vers une entrée de liste de diffusion par l'auteur du correctif, y compris les changements de code réels. D'après ce que j'ai compris, cela permettra aux systèmes d'accélérer le processus de démarrage dans certaines circonstances, en et non en attendant que suffisamment d'entropie soit collectée à partir de diverses sources pour sécuriser ensemence le générateur de nombres aléatoires, mais ignore cette partie et s'appuie uniquement sur le générateur de nombres aléatoires intégré de la CPU.
Cela affaiblirait la sécurité cryptographique du système, dans la mesure où il (si j'ai bien compris) ne se fondait pas uniquement sur le processeur en tant que source d'entropie unique, mais risquait également de compromettre la sécurité si son implémentation n'était pas fiable (bogues, portes dérobées intentionnelles, ...).
Est-ce que le générateur de nombres aléatoires du noyau ne serait alors initialisé que depuis le générateur de la CPU pendant tout le temps, ou le ferait-il simplement pendant les premières étapes de démarrage et ajouterait plus d'entropie des sources "traditionnelles" dans le pool ultérieurement, augmentant ainsi la sécurité cryptographique le temps est-il revenu au niveau actuel/ancien?
Comme il s'agit apparemment d'un indicateur de compilation, les packages de noyau fournis dans les dépôts d'Ubuntu seront-ils fournis avec cet indicateur activé ou désactivé?
Pourrait-il y avoir un moyen de s’inscrire ou non, autrement que de compiler lui-même les noyaux à partir de maintenant?
Existe-t-il un moyen de vérifier si cela ferait une différence dans le temps de démarrage? Existe-t-il actuellement des métriques sur le temps d'attente de l'entropie au démarrage?
Et quelles versions d'Ubuntu pourront même exécuter les versions du noyau 4.19 ou ultérieures?
Premièrement, raisonnablement, la sécurité cryptographique du système - son imprévisibilité - ne sera pas modifiée de quelque manière que ce soit, que le HWRNG intégré du processeur (par exemple, RDRAND
dans Intel) soit utilisé ou non, sinon, comme vous l'avez fait remarquer, inévitablement affaiblir la sécurité du GNA (et tout ce qui en dépend).
En résumé, pour résumer, pendant le processus d’amorçage, une fois que le noyau a chargé le pilote d’aléatoire, le gestionnaire de ressources aléatoires Linux initialise tous les pools aléatoires () , qui ne sont que des zones de mémoire contenant des données aléatoires), y compris le pool principal ( pool d'entrée ), en les renseignant avec l'entropie qui provient du HWRNG si elle est disponible, sinon via random_get_entropy()
, qui est une macro pour get_cycles()
, dont la mise en oeuvre varie avec l'architecture (par exemple, dans aarch64, une lecture du CNTVCT_EL0
registre est fait , qui est type de compteur de fréquence, et non la fréquence d’horloge utilisée à la place dans x86-64 en lisant le registre TSC). Toutes ces données sont transmises à un état de chiffrement principal (primary_crng
, un objet de type struct crng_state
, qui est l'implémentation de algorithme ChaCha2 ), qui contient une clé de 384 bits véritablement aléatoires, qui sont finalement fournis à l'interface /dev/urandom
.
Maintenant, avec cette contextualisation, pour répondre à votre question, l'initialisation réelle RNG du noyau via Rand_initialize()
, étant un early_initcall
, ne se produit évidemment qu'au moment du démarrage (comme tous les *_initcall()
), en particulier à la fin de start_kernel()
, la routine du noyau rest_init()
est appelée où , l’une des premières choses qu’il fait est de créer un thread du noyau (kernel_init
) dans le but, entre autres choses, de lancer cet initcall (notez également que add_device_randomness()
est appelé même avant , mais ne le fait pas. t réellement ajouter des données entropiques); et par conséquent oui, par source, l'état de chiffrement du ChaCha20, des pools principal et bloquant serait initialisé avec Arch_get_random_long()
, qui utilise l'instruction RDRAND
dans les processeurs x86 (encore une fois, s'il est disponible et s'il est disponible, le noyau vous avertit à ce sujet). Je ne dirais pas que c'est la seule source utilisée cependant (même si RDRAND
est disponible), car, au moins:
L'heure du micrologiciel est utilisée et est mélangée aux pools pendant l'initialisation (peut-être pas aussi entropique, un attaquant devrait néanmoins inférer l'horodatage avec une précision extrêmement élevée);
Il y a un autre petit pool (un par CPU, appelé fast pool ), qui collecte l'entropie de add_interrupt_randomness()
, qui utilise les IRQ (et théoriquement d'autres événements du noyau, et même une graine provenant du RNG de la CPU, s’il existe) en entrée, toutes mélangées, puis injectées dans le pool d’entrées. Cela se passe comme chaque seconde.
Ainsi, le processus de collecte d'entropie à la fois par le HWRNG et les autres sources se déroule en même temps; bien sûr, le premier domine la scène (parce que la qualité d'entropie est nettement supérieure, c'est un vrai RNG), et se produit au démarrage, et, à partir de l'utilisateur, chaque fois que les périphériques pseudo-aléatoires (ou le getrandom()
syscall) sont utilisés. Dans le second cas, les pools sont déjà initialisés et seul le primary_crng
(état de chiffrement) est réensemencé. Et oui, comme vous l'avez noté, le RNG intégré au processeur améliore certainement le caractère aléatoire général.
J'ajouterai enfin que l'utilisation du HWRNG aurait un impact significatif, en particulier dans les systèmes embarqués, qui peuvent ne pas comporter de bruit source (tels que les claviers, les disques durs, etc.). Et notez simplement que, toujours par documentation , vous pouvez désactiver l’utilisation de RDRAND
dans le noyau avant l’introduction de RANDOM_TRUST_CPU
, si vous êtes préoccupé par la sécurité.