mediumCWE-287A07:2021

Token 'Recuérdame' Inseguro

Tokens persistentes de 'recuérdame' que son predecibles, no expiran o se guardan de forma insegura — permitiendo a atacantes falsificar tokens o mantener acceso indefinido.

Cómo Funciona

Los tokens remember-me son credenciales de larga vida guardadas en cookies. Si el token se deriva de datos predecibles (ID de usuario + timestamp), un atacante puede falsificar tokens válidos. Si los tokens nunca expiran o no se rotan en cada uso, un solo token robado concede acceso permanente. La implementación correcta requiere aleatoriedad criptográfica y rotación de tokens de un solo uso.

Código Vulnerable
// MAL: token predecible basado en datos del usuario
function generarTokenRecuerdame(userId: string): string {
  return Buffer.from(`${userId}:${Date.now()}`).toString('base64');
  // ¡Predecible! El atacante puede computar tokens válidos
}
Código Seguro
// BIEN: criptográficamente aleatorio, guardado hasheado, rotado en cada uso
import { randomBytes, createHash } from 'crypto';
async function generarTokenRecuerdame(userId: string) {
  const token = randomBytes(32).toString('hex');
  const hash = createHash('sha256').update(token).digest('hex');
  await db.rememberTokens.create({
    data: { userId, tokenHash: hash, expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000) }
  });
  return token; // envía esto al cliente
}

Ejemplo Real

Las primeras apps PHP con tokens remember-me predecibles (md5(user_id + static_secret)) fueron ampliamente explotadas. Si un atacante conoce tus IDs de usuario (frecuentemente enteros secuenciales), puede falsificar cookies remember-me para cualquier cuenta.

Cómo Prevenirlo

  • Usa tokens criptográficamente aleatorios (mínimo crypto.randomBytes(32))
  • Guarda solo el hash del token en la base de datos, no el token crudo
  • Configura una expiración razonable (máximo 30 días) y rota el token en cada uso
  • Invalida todos los tokens remember-me al cambiar contraseña o cuando se detecta actividad sospechosa

Tecnologías Afectadas

nodejsNext.jsPythonPHP

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas