O que aconteceu e o que é Xorshift

O tema deste artigo é um alerta de engenharia, não o anúncio de uma vulnerabilidade específica. Em 15 de agosto de 2026, Alan Zucconi publicou uma análise detalhada da família de geradores Xorshift, explicando sua matemática, seus períodos e a relação entre operações XOR e deslocamentos de bits. O texto mostra por que esses geradores são interessantes para produzir números pseudoaleatórios com poucas instruções.

Em segurança da informação, porém, parecer aleatório não é o mesmo que ser imprevisível. Um gerador pseudoaleatório comum recebe um estado inicial e aplica uma função determinística para obter o próximo estado. Se alguém descobre o algoritmo e consegue inferir o estado atual ou a semente, a sequência deixa de ser um mistério. Essa diferença precisa ser entendida antes de usar Xorshift em qualquer fluxo que proteja identidade, acesso ou dados pessoais.

Como funciona

Um Xorshift mantém um valor interno chamado estado. A cada chamada, o algoritmo copia esse valor, desloca bits para a esquerda ou para a direita e combina os resultados com a operação XOR. Uma implementação clássica de 32 bits pode aplicar deslocamentos de 13, 17 e 5 posições. O custo é baixo porque não depende de tabelas grandes, divisão ou multiplicação complexa.

A semente define onde a sequência começa. Com a mesma semente, a mesma sequência é reproduzida, característica útil em jogos, testes determinísticos, simulações e conteúdo procedural. A implementação também precisa evitar o estado zero, pois ele não produz uma sequência útil. Alguns parâmetros formam um período máximo, no qual os estados não nulos percorrem um ciclo extenso, mas um ciclo longo ainda pode ser totalmente previsível para quem conhece o estado.

Para que serve e quem pode ser afetado

Xorshift pode ser apropriado quando o objetivo é velocidade e reprodutibilidade. Um motor de jogo pode usá-lo para distribuir eventos, uma simulação pode usá-lo para gerar amostras e um teste automatizado pode usá-lo para repetir exatamente um cenário. Nesses casos, a previsibilidade é uma propriedade desejável, porque facilita depuração e comparação de resultados.

O problema aparece quando o mesmo código é reaproveitado para criar senha temporária, código de recuperação, token de sessão, identificador secreto, nonce, valor de desafio ou sorteio com consequência financeira. Um atacante que consiga observar saídas, obter parte do estado ou adivinhar uma semente previsível pode reduzir o espaço de busca. O impacto potencial inclui tomada de conta, reutilização de sessão, fraude e exposição de dados. Isso descreve um risco de projeto, não um incidente confirmado em uma aplicação específica.

Como identificar e detectar

A primeira etapa é procurar a implementação, não apenas o nome da biblioteca. Em uma revisão de código, busque funções com nomes como xorshift, xoroshiro ou xoshiro, operações XOR combinadas com deslocamentos e um estado numérico atualizado a cada chamada. Também examine seeds obtidas de horário, contador, identificador do processo, endereço de memória ou valores constantes. Esses sinais não provam uma falha isoladamente, mas merecem revisão.

Depois, mapeie cada chamada ao seu uso real. Um gerador pode ser seguro para uma simulação e inadequado para um token. Registre se a saída chega ao navegador, aparece em uma URL, é gravada em log ou pode ser observada por outro usuário. Testes estatísticos ajudam a encontrar distribuições ruins, mas não comprovam segurança criptográfica. Um fluxo pode passar em testes de frequência e continuar previsível. A detecção correta combina análise do algoritmo, origem da semente, ciclo de vida do estado e finalidade do valor gerado.

Como se proteger e fazer a mitigação

Separe os geradores por finalidade. Para jogos, simulações e dados de teste, um PRNG rápido pode continuar sendo uma escolha válida. Para segredos, use a fonte de aleatoriedade criptográfica fornecida pelo sistema operacional ou pela plataforma. Em Python, o módulo secrets foi criado para gerar valores destinados a senhas, tokens e outros usos de segurança. No navegador, a API Web Crypto fornece crypto.getRandomValues. Em aplicações .NET, use as APIs baseadas em RandomNumberGenerator.

Trocar apenas o nome da função não basta. Remova seeds manuais de fluxos sensíveis, interrompa a geração de novos valores com o PRNG antigo e revise tokens que ainda estejam válidos. Tokens emitidos antes da correção podem precisar ser invalidados, dependendo do risco e do prazo de validade. Registre a mudança no modelo de ameaça e adicione um teste de arquitetura que impeça o uso de um gerador não criptográfico em módulos de autenticação, recuperação de conta e autorização.

Comparação com alternativas anteriores

Math.random e geradores semelhantes são convenientes para interfaces e simulações leves, mas não devem ser tratados como fontes de segredo. Xorshift costuma ser mais explícito e eficiente para certas cargas, com a vantagem de permitir reprodução por semente. Essa mesma reprodução é um problema quando o resultado precisa ser impossível de antecipar.

OpçãoUso adequadoUso inadequado
XorshiftSimulação, jogo e teste repetívelToken, senha e nonce
Math.randomInterface e variação visualAutenticação e sorteio sensível
CSPRNG da plataformaSegredos e desafios criptográficosQuase nunca há motivo para substituí-lo por um PRNG comum em fluxos sensíveis

A comparação não é uma disputa de velocidade. É uma escolha baseada na consequência de prever a próxima saída. Se a previsão só altera a posição de um objeto, o requisito é diferente de um cenário em que ela libera uma conta.

Análise técnica

Xorshift é uma transformação linear sobre bits. A sequência é determinística e o estado evolui por operações que podem ser estudadas matematicamente. Parâmetros corretos podem produzir um período grande, inclusive próximo do maior período possível para o tamanho do estado, mas período mede repetição, não resistência a previsão. Um atacante não precisa esperar o ciclo completo para explorar uma sequência.

Quando várias saídas expõem informação suficiente sobre o estado, a estrutura linear pode ajudar a reconstruí-lo ou a reduzir o número de estados possíveis. A dificuldade exata depende da variante, do tamanho do estado, da quantidade de bits revelados e da forma como a aplicação transforma a saída. Por isso, não é correto atribuir um CVSS ou uma pontuação universal ao uso de Xorshift. O achado deve ser descrito como uma decisão criptográfica inadequada no contexto em que o valor é usado.

Impacto e consequências

O impacto mais grave aparece quando o valor previsível controla uma decisão de segurança. Um token de redefinição que pode ser antecipado pode permitir alteração de senha. Um nonce repetido pode enfraquecer uma operação criptográfica. Um código de convite previsível pode permitir cadastro indevido. Um identificador secreto exposto em URL pode facilitar acesso a um recurso que deveria exigir autenticação.

Mesmo quando o atacante não consegue concluir o abuso, a previsibilidade pode aumentar a capacidade de enumerar contas, correlacionar sessões ou inferir o momento em que uma operação ocorreu. Em ambientes sujeitos à LGPD, a consequência pode incluir exposição de dados pessoais e necessidade de investigação. Não presuma que um token curto ou com expiração rápida elimina o risco. A janela pode ser suficiente se a geração for observável e a tentativa não tiver proteção.

Dicas práticas e boas práticas

  • Classifique cada saída como pública, reproduzível ou secreta antes de escolher o gerador.
  • Use CSPRNG para senha temporária, token, nonce, chave, código de recuperação e sorteio sensível.
  • Nunca derive a semente de relógio, contador ou identificador previsível em um fluxo de autenticação.
  • Não confie em teste estatístico como prova de segurança criptográfica.
  • Limite tentativas, aplique expiração, invalide tokens após uso e registre eventos sem gravar o segredo.
  • Faça revisão de dependências e procure geradores comuns ocultos em bibliotecas auxiliares.
  • Escreva um teste que falhe quando um módulo sensível importar o gerador destinado a simulações.

Também vale documentar a intenção. Um comentário curto explicando que a sequência é reproduzível para testes evita que outro desenvolvedor a reutilize em autenticação. A documentação deve apontar para a API criptográfica aprovada no projeto e indicar quem revisa mudanças nesse componente.

Conclusão: o que fazer agora

Xorshift é uma ferramenta matemática útil para gerar números pseudoaleatórios com rapidez, especialmente quando a reprodução da sequência é desejável. O erro não está em usar a família em um jogo ou uma simulação. O erro está em confundir uma saída visualmente aleatória com um segredo criptograficamente imprevisível.

Faça um inventário de tokens, senhas temporárias, nonces e códigos de desafio. Para cada item, confirme a fonte de aleatoriedade, a semente, a exposição das saídas, o limite de tentativas e a invalidação. Se encontrar Xorshift ou outro PRNG comum em um fluxo sensível, migre para o CSPRNG oficial da plataforma, invalide valores antigos conforme o risco e registre a decisão. A troca é pequena diante do custo de explicar uma tomada de conta que poderia ter sido evitada.