highCWE-338A02:2021

Aleatoriedad Insegura

Usar Math.random() para valores sensibles como tokens o IDs es predecible y puede romperse por fuerza bruta.

Cómo Funciona

Math.random() usa un algoritmo determinístico con semilla basada en el tiempo del sistema. No es criptográficamente aleatorio — dado unos pocos valores observados, un atacante puede predecir valores pasados y futuros. Usarlo para tokens de reset de contraseña, IDs de sesión o tokens CSRF hace esos valores adivinables.

Código Vulnerable
// MAL: Math.random no es criptográficamente seguro
const resetToken = Math.random().toString(36).slice(2);
const userId = 'user_' + Math.random().toString(36).slice(2);
Código Seguro
// BIEN: usa crypto.randomBytes para todos los valores sensibles
import { randomBytes } from 'crypto';
const resetToken = randomBytes(32).toString('hex'); // 256 bits de entropía real
const userId = 'user_' + randomBytes(16).toString('hex');

Ejemplo Real

Se han reportado múltiples vulnerabilidades de reset de contraseña donde tokens generados con Math.random() fueron rompidos por fuerza bruta en segundos usando técnicas de predicción de semilla del motor V8 documentadas en investigaciones académicas.

Cómo Prevenirlo

  • Siempre usa crypto.randomBytes() (Node.js) o crypto.getRandomValues() (browser) para tokens e IDs
  • Usa uuid v4 del paquete 'uuid' para IDs — usa crypto.randomUUID() internamente
  • Mínimo 128 bits de entropía para tokens, 256 bits preferibles para operaciones de alto valor
  • Busca Math.random() en tu codebase y audita cada uso

Tecnologías Afectadas

Node.jsjavascript

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas