PRNG Debil para Seguridad
Usar Math.random() o Date.now() para generar tokens, IDs de sesion o codigos de reset produce valores predecibles que los atacantes pueden adivinar o reproducir.
Cómo Funciona
Math.random() usa un generador de numeros pseudo-aleatorios (PRNG) disenado para velocidad, no seguridad. Su salida es determinista dado el estado de la semilla, y el estado puede ser reconstruido a partir de salidas observadas. Un atacante que vea algunos valores generados puede predecir todos los valores futuros. Date.now() es aun peor — retorna el timestamp actual en milisegundos, que es trivialmente adivinable. Cuando estos se usan para generar tokens de reset de password, API keys, IDs de sesion o codigos de verificacion, un atacante puede predecir o hacer fuerza bruta a los valores generados. Un timestamp de 13 digitos tiene solo alrededor de 100,000 valores posibles si el atacante conoce el tiempo aproximado. Un valor de Math.random() tiene como maximo 2^52 bits de entropia pero es reducible al estado interno con solo unas pocas observaciones.
// Weak token generation
function generateResetToken() {
return Math.random().toString(36).substring(2);
}
function generateApiKey() {
return 'key_' + Date.now().toString(36);
}
function generateSessionId() {
return Math.random().toString(16).slice(2) +
Math.random().toString(16).slice(2);
}const crypto = require('crypto');
function generateResetToken() {
return crypto.randomBytes(32).toString('hex');
}
function generateApiKey() {
return 'key_' + crypto.randomBytes(24).toString('base64url');
}
function generateSessionId() {
return crypto.randomUUID();
}Ejemplo Real
En 2020, investigadores encontraron que un CMS popular generaba tokens de reset de password usando Math.random(). Al observar algunos tokens, reconstruyeron el estado del PRNG y predijeron tokens futuros. Esto les permitio generar links validos de reset de password para cualquier cuenta, incluyendo admin, sin acceso al correo del usuario.
Cómo Prevenirlo
- Siempre usa crypto.randomBytes() o crypto.randomUUID() para valores sensibles de seguridad
- Nunca uses Math.random() o Date.now() para tokens, llaves o identificadores
- Genera al menos 32 bytes (256 bits) de entropia para tokens de seguridad
- Usa librerias establecidas como uuid v4 que internamente usan aleatoriedad cripto-segura
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Modo ECB
mediumUsar modo ECB (Electronic Codebook) para encriptacion produce bloques de texto cifrado identicos para bloques de texto plano identicos, revelando patrones en los datos encriptados.
IV/Nonce Estatico
highUsar un Vector de Inicializacion (IV) o nonce hardcodeado o constante para encriptacion anula el proposito del IV y permite a los atacantes detectar patrones y desencriptar datos.
Tamano de Llave Debil
mediumUsar llaves criptograficas mas cortas que los minimos recomendados (RSA menor a 2048 bits, AES menor a 128 bits) hace la encriptacion vulnerable a ataques de fuerza bruta con hardware moderno.
Validacion de Certificado Deshabilitada
criticalDeshabilitar la validacion de certificados TLS con NODE_TLS_REJECT_UNAUTHORIZED=0 o rejectUnauthorized: false permite ataques man-in-the-middle en todas las conexiones HTTPS.