mediumCWE-613A07:2021

Sin Invalidación de Sesión al Cambiar Contraseña

Las sesiones activas siguen siendo válidas después de que un usuario cambia su contraseña, dejando a los atacantes que ya comprometieron una sesión con acceso continuo incluso después de que el usuario toma acción.

Cómo Funciona

Cuando un usuario nota actividad inusual y cambia su contraseña, espera echar a cualquier atacante activo. Si las sesiones existentes no se invalidan al cambiar la contraseña, el token de sesión robado del atacante sigue funcionando. El usuario hizo lo correcto — tu código dejó al atacante adentro.

Código Vulnerable
// MAL: el cambio de contraseña no invalida sesiones
async function cambiarContrasena(userId: string, newPassword: string) {
  const hash = await bcrypt.hash(newPassword, 12);
  await db.users.update({ where: { id: userId }, data: { passwordHash: hash } });
  // Todas las sesiones existentes siguen válidas — el atacante se queda
}
Código Seguro
// BIEN: invalida todas las sesiones al cambiar contraseña
async function cambiarContrasena(userId: string, newPassword: string) {
  const hash = await bcrypt.hash(newPassword, 12);
  // Rota un token de versión de sesión guardado con el usuario
  const sessionVersion = crypto.randomUUID();
  await db.users.update({
    where: { id: userId },
    data: { passwordHash: hash, sessionVersion }
  });
  // Los tokens emitidos antes de esta versión ahora son inválidos
}

Ejemplo Real

Cuando los usuarios reportan 'cambié mi contraseña pero mi cuenta seguía siendo accedida', esta suele ser la causa. Los atacantes que establecen acceso persistente dependen de este gap. También es un problema de cumplimiento bajo muchos frameworks de seguridad.

Cómo Prevenirlo

  • Guarda un campo sessionVersion en el usuario e inclúyelo en los claims del JWT
  • Al cambiar contraseña, rota el sessionVersion — los tokens antiguos con la versión anterior son rechazados
  • Alternativamente, invalida todas las sesiones guardadas en tu session store para ese usuario
  • Envía al usuario una notificación por email cuando su contraseña se cambia desde un nuevo dispositivo/ubicación

Tecnologías Afectadas

nodejsNext.jsPythonPHP

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas