CVE-2021-41117
Geração insegura de números aleatórios
- Publicado
- 11 de out. de 2021
- Atualizado
- 4 de ago. de 2024
- Atribuindo CNA
- GitHub_M
- Evidência observada
- 8 de ago. de 2026
Geração insegura de números aleatórios
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:NBaixo · próximos 30 dias
EPSS é uma estimativa estatística, não uma certeza ou uma medida de impacto. Combine-o com CVSS, status KEV, exposição e seu ambiente.
keypair é um gerador de chaves RSA PEM escrito em javascript. keypair implementa muitas primitivas criptográficas por conta própria ou recorrendo a outras bibliotecas quando possível, incluindo node-forge. Foi descoberto um problema em que esta biblioteca gerava chaves RSA idênticas usadas em SSH. Isso significaria que a biblioteca está gerando valores idênticos de P, Q (e, portanto, N), o que, na prática, é impossível com chaves RSA-2048. Gerar valores idênticos repetidamente geralmente indica um problema com geração de números aleatórios fraca ou com o mau tratamento da saída do CSPRNG. Problema 1: Geração fraca de números aleatórios (`GHSL-2021-1012`). A biblioteca não depende inteiramente de um CSPRNG fornecido pela plataforma; em vez disso, usa sua própria abordagem CMAC baseada em contador. O problema está na semeadura da implementação CMAC com dados "verdadeiramente" aleatórios na função `defaultSeedFile`. Para semear o gerador AES-CMAC, a biblioteca adota duas abordagens diferentes dependendo do ambiente de execução do JavaScript. Em um navegador, a biblioteca usa [`window.crypto.getRandomValues()`](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L971). No entanto, em um ambiente de execução nodeJS, o objeto `window` não está definido, então ela segue para uma solução muito menos segura, que também contém um bug. Parece que a biblioteca tenta usar o CSPRNG do Node quando possível, mas, infelizmente, o objeto `crypto` é nulo porque uma variável com o mesmo nome foi declarada e definida como `null`. Portanto, o caminho do CSPRNG do Node nunca é percorrido. No entanto, quando `window.crypto.getRandomValues()` não está disponível, um gerador de números aleatórios Lehmer LCG é usado para semear o contador CMAC, e o LCG é semeado com `Math.random`. Embora isso seja ruim e provavelmente se qualifique como um bug de segurança por si só, não explica a frequência extrema com que chaves duplicadas ocorrem. A falha principal: a saída do Lehmer LCG é codificada incorretamente. A [linha][https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L1008] específica com a falha é: `b.putByte(String.fromCharCode(next & 0xFF))` A [definição](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L350-L352) de `putByte` é `util.ByteBuffer.prototype.putByte = function(b) {this.data += String.fromCharCode(b);};`. De forma simplificada, isso é `String.fromCharCode(String.fromCharCode(next & 0xFF))`. O `String.fromCharCode` duplo é quase certamente não intencional e é a fonte da semeadura fraca. Infelizmente, isso não resulta em um erro. Em vez disso, faz com que a maior parte do buffer contenha zeros. Como estamos mascarando com 0xFF, podemos determinar que 97% da saída do LCG é convertida em zeros. As únicas saídas que resultam em valores significativos são as saídas de 48 a 57, inclusive. O impacto é que cada byte na semente do RNG tem 97% de chance de ser 0 devido à conversão incorreta. Quando não é, os bytes são de 0 a 9. Em resumo, há três preocupações imediatas: 1. A biblioteca tem um caminho de fallback de números aleatórios inseguro. Idealmente, a biblioteca exigiria um CSPRNG forte em vez de tentar usar um LCG e `Math.random`. 2. A biblioteca não usa corretamente um gerador de números aleatórios forte quando executada no NodeJS, mesmo havendo um CSPRNG forte disponível. 3. O caminho de fallback tem um problema na implementação em que a maior parte dos dados da semente será efetivamente zero. Devido à geração fraca de números aleatórios, keypair gera chaves RSA relativamente fáceis de adivinhar. Isso pode permitir que um invasor descriptografe mensagens confidenciais ou obtenha acesso autorizado a uma conta da vítima.
Chaves privadas geradas com versões vulneráveis de par de chaves (CVE-2021-41117)
Use informações de vulnerabilidade apenas em sistemas que você possui ou está autorizado a testar. O Kitploit vincula-se a metadados de pesquisa pública e não armazena código de exploração ou cargas maliciosas.