Skip to content

MASTG-TEST-0016: Teste de Geração de Números Aleatórios

Deprecated Test

This test is deprecated and should not be used anymore. Reason:

Please check the following MASTG v2 tests that cover this v1 test:

Visão Geral

Análise Estática

Identifique todas as instâncias de geradores de números aleatórios e procure por classes personalizadas ou conhecidamente inseguras. Por exemplo, java.util.Random produz uma sequência idêntica de números para cada valor de seed fornecido; consequentemente, a sequência de números é previsível. Em vez disso, deve-se escolher um algoritmo amplamente testado que seja atualmente considerado robusto por especialistas da área, e utilizar implementações bem validadas com seeds de comprimento adequado.

Identifique todas as instâncias de SecureRandom que não são criadas usando o construtor padrão. Especificar o valor da seed pode reduzir a aleatoriedade. Utilize apenas o construtor sem argumentos do SecureRandom que emprega o valor de seed especificado pelo sistema para gerar um número aleatório de 128 bytes.

Em geral, se um PRNG não é divulgado como criptograficamente seguro (por exemplo, java.util.Random), trata-se provavelmente de um PRNG estatístico e não deve ser utilizado em contextos sensíveis à segurança. Geradores de números pseudoaleatórios podem produzir números previsíveis se o gerador for conhecido e a seed puder ser adivinhada. Uma seed de 128 bits é um bom ponto de partida para produzir um número "suficientemente aleatório".

Uma vez que um invasor descobre qual tipo de gerador de números pseudoaleatórios (PRNG) fraco está sendo usado, pode ser trivial escrever uma prova de conceito para gerar o próximo valor aleatório com base em valores previamente observados, conforme foi feito para o Java Random. No caso de geradores aleatórios personalizados muito fracos, pode ser possível observar o padrão estatisticamente. Embora a abordagem recomendada seja, de qualquer forma, descompilar o APK e inspecionar o algoritmo (ver Análise Estática).

Se desejar testar a aleatoriedade, você pode tentar capturar um grande conjunto de números e verificar com o sequenciador do Burp para avaliar a qualidade da aleatoriedade.

Análise Dinâmica

Você pode utilizar Rastreamento de Métodos nas classes e métodos mencionados para determinar os valores de entrada/saída sendo utilizados.