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.
// 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);// 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
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Contaminación de Prototipo
highHacer merge de objetos controlados por el usuario sin filtrar permite que atacantes modifiquen Object.prototype y afecten todos los objetos de la app.
ReDoS (Denegación de Servicio por Regex)
mediumLas expresiones regulares con cuantificadores anidados pueden tomar tiempo exponencial con ciertos inputs, congelando el event loop de Node.js.
Service Worker Malicioso
mediumUn service worker registrado sin restricciones de scope puede interceptar todas las requests de red de un dominio, incluyendo las de otras páginas.