Implicações de segurança da aleatoriedade do cache

Oct 08 2020

É 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

2 theoneandonly2 Oct 08 2020 at 03:18

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.