highCWE-640A07:2021

Reset de Contraseña Inseguro

Tokens de reset de contraseña sin expiración, sin enforcing de uso único o sin aleatoriedad adecuada — permitiendo a atacantes usar links filtrados o predecibles para tomar control de cuentas.

Cómo Funciona

Los tokens de reset de contraseña son credenciales temporales. Si no expiran, un token en un email viejo puede usarse años después. Si no se invalidan después de usarse, el mismo link puede resetear la contraseña múltiples veces. Si el token se deriva de datos predecibles (ID de usuario, email, timestamp), un atacante puede generar tokens válidos sin recibir el email.

Código Vulnerable
// MAL: token predecible, sin expiración, no invalidado después de usar
async function crearTokenReset(email: string) {
  const token = Buffer.from(email + Date.now()).toString('base64');
  await db.users.update({ where: { email }, data: { resetToken: token } });
  await sendResetEmail(email, token);
}
Código Seguro
// BIEN: token aleatorio, TTL corto, uso único
async function crearTokenReset(email: string) {
  const token = randomBytes(32).toString('hex');
  const expiresAt = new Date(Date.now() + 15 * 60 * 1000); // 15 min
  const tokenHash = createHash('sha256').update(token).digest('hex');
  await db.passwordResets.create({ data: { email, tokenHash, expiresAt, used: false } });
  await sendResetEmail(email, token);
}

Ejemplo Real

La toma de cuentas via reset de contraseña fue el vector principal en múltiples brechas de alto perfil. El patrón es simple: el atacante conoce el email del objetivo, solicita un reset, y si el token es predecible o no expira, la cuenta es tomada sin necesitar el email.

Cómo Prevenirlo

  • Usa tokens criptográficamente aleatorios (crypto.randomBytes(32))
  • Configura una expiración corta — 15 minutos es estándar para reset de contraseña
  • Invalida el token inmediatamente después de usarse
  • Guarda solo el hash del token, no el valor crudo
  • Limita la tasa de requests de reset por dirección de email

Tecnologías Afectadas

nodejsNext.jsPythonPHP

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas