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.
// 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
}// 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
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Fijación de Sesión
highEl servidor reutiliza el mismo ID de sesión antes y después del login, permitiendo a un atacante que plantó un ID de sesión conocido secuestrar la sesión autenticada.
Sin Bloqueo de Cuenta / Protección contra Fuerza Bruta
mediumEndpoints de login sin rate limiting ni mecanismo de bloqueo, permitiendo a atacantes probar combinaciones ilimitadas de usuario y contraseña hasta encontrar credenciales válidas.
Política de Contraseña Débil
mediumSin requisitos de longitud mínima, complejidad o verificación contra contraseñas comunes en el registro o cambio de contraseña, haciendo las cuentas fácilmente vulnerables a fuerza bruta.
OAuth Sin Parámetro State
highFlujo de autorización OAuth implementado sin un parámetro `state` aleatorio, permitiendo ataques CSRF que vinculan la cuenta de una víctima con la identidad OAuth del atacante.