Implicações de segurança da aleatoriedade do cache
É uma má ideia armazenar em cache a aleatoriedade no caso geral? Meu sentimento é sim, mas estou tendo dificuldade em articular o porquê.
Cenário:
Uma linguagem de programação de sua escolha (por exemplo, nó) usa uma chamada nativa para gerar bytes aleatórios (por exemplo, para criar um uuid). É muito difícil prever os bytes aleatórios mesmo com acesso ao sistema operacional.
A chamada tem overhead e, para acelerar o tempo de execução, é introduzido um cache de memória. Portanto, em vez de recuperar bytes aleatórios do sistema operacional conforme são necessários (ou seja, sempre que um uuid é necessário), eles só são recuperados quando o cache está vazio.
Os bytes aleatórios agora estão na memória do programa em execução. Em teoria, eles podem ser acessados inspecionando a memória. No caso geral (onde isso é feito por uma biblioteca e não se tem ideia de como a aleatoriedade está sendo usada), isso é uma má ideia? Se sim, por quê?
Isenção de responsabilidade: estou realmente procurando um bom argumento para este problema do github https://github.com/uuidjs/uuid/issues/527 [~ 36 milhões de downloads semanais]
Respostas
Supondo que você tenha muitos bits bons e aleatórios, todas as armadilhas associadas à aleatoriedade do armazenamento em cache derivam do potencial de acesso malicioso. Ou seja, não há nada inerentemente errado com a aleatoriedade do cache, no entanto, isso cria uma superfície de ataque maior. Se os desenvolvedores tiverem motivos suficientes para acreditar que a memória é um local de armazenamento seguro, essa abordagem é segura.
Uma maneira de pensar sobre isso é olhar para trás, para o uso histórico do one time pad (OTP). OTP foi usado por militares para criptografar e descriptografar mensagens e ainda é considerado inquebrável até hoje. Os códigos, neste caso, foram armazenados em papel (semelhante ao seu cache). No entanto, as regras necessárias para que este processo seja inquebrável incluem:
- A chave deve ser verdadeiramente aleatória.
- A chave deve ser pelo menos tão longa quanto o texto simples.
- A chave nunca deve ser reutilizada total ou parcialmente
- A chave deve ser mantida em segredo absoluto.
Contanto que você possa garantir o mesmo para seus bytes aleatórios em cache, a aleatoriedade está bem.