Atualmente, estou fazendo uma aula de SO usando XINU, onde posso controlar todos os processos em execução no SO e, por causa disso, posso prever completamente a saída de seu gerador de números aleatórios. Aqui está o código.
Está claro para mim que mesmo essa abordagem simples, quando usada em um sistema operacional de desktop, seria capaz de criar números verdadeiramente aleatórios porque há muitos processos se comportando de maneira diferente com base no usuário, local ou hora. No entanto, e na inicialização, antes que haja qualquer entrada do usuário?
O gerador de números aleatórios criptográficos do Linux é muito mais complexo, mas ainda parece depender da entrada do usuário. O OpenSSH é executado na inicialização em muitos sistemas Linux. Tenho certeza de que existem muitas empresas que executam configurações muito próximas do estoque, e se você pode simular o mesmo hardware, software e definir o mesmo horário e local do servidor que está atacando, você não poderia explorar isso?
Há também implantações pré-fabricadas em muitos serviços de hospedagem onde os desenvolvedores podem fazer upload de seu código (dockerfile, projeto ruby on rails, etc), e o servidor apenas o configura. Esses servidores têm software pré-fabricado, hardware conhecido, localização e hora. Estou assumindo que eles têm aleatoriedade de hardware no mundo real, mas e se eles não tivessem?
A falta de entropia tem sido um problema, especialmente para sistemas operacionais mais antigos, onde não havia dispositivo aleatório ou outra API disponível, ou para sistemas operacionais em nuvem ou clonados que podem ter mais ou menos exatamente a mesma semente. Além disso, as pessoas continuam fazendo coisas bobas (por exemplo, CVE-2020-27020), apesar da disponibilidade de fontes de entropia.
Uma solução é ler a partir de várias fontes de números aleatórios na inicialização, por exemplo, o recurso RDRAND de alguns chips e, esperançosamente, de várias dessas fontes no caso de qualquer fonte estar quebrada ou comprometida. Isso pode atrasar a inicialização até que entropia "suficiente" seja obtida. Você provavelmente pode descobrir como vários sistemas operacionais de código aberto fazem isso na inicialização, vasculhando sua fonte.
Outra solução é semear o sistema ou host virtual com uma certa quantidade de dados aleatórios pré-gerados, talvez gerados por um instalador ou pelo sistema operacional do host. Esses dados são então usados pelo sistema subsequente quando ele é inicializado. Isso permite que qualquer número de sistemas virtuais idênticos tenham um conjunto diferente de entropia, desde que o sistema operacional do host gere entropia adequada para cada host.