Reset de Contraseña Sin Expiración
Los links de reset de contraseña que nunca expiran permanecen válidos indefinidamente — un email antiguo en una brecha le da a los atacantes una ruta permanente para tomar control de la cuenta.
Cómo Funciona
Si un token de reset de contraseña no tiene expiración, permanece válido para siempre en tu base de datos. Emails viejos en una bandeja de entrada comprometida, emails de reset reenviados o tokens exfiltrados de logs se vuelven vectores permanentes de takeover de cuentas. El token debe ser de un solo uso y expirar en 1-2 horas.
// MAL: token de reset guardado sin expiración
async function createResetToken(userId: string) {
const token = crypto.randomBytes(32).toString('hex');
await db.passwordResets.create({ userId, token }); // ¡sin expiresAt!
return token;
}// BIEN: el token expira en 1 hora y se borra después de usarse
async function createResetToken(userId: string) {
const token = crypto.randomBytes(32).toString('hex');
const expiresAt = new Date(Date.now() + 60 * 60 * 1000); // 1 hora
await db.passwordResets.create({ userId, token, expiresAt });
return token;
}
// En el handler de reset: verifica expiresAt > ahora Y borra el token después de usarloEjemplo Real
Los tokens de reset de contraseña sin expiración fueron marcados en numerosos reportes de bug bounty de HackerOne como vulnerabilidades de takeover de cuenta. Si la bandeja de entrada de un usuario es comprometida meses después de solicitar un reset, el link antiguo sigue funcionando.
Cómo Prevenirlo
- Establece una expiración de 1 hora en todos los tokens de reset de contraseña
- Borra el token inmediatamente después de ser usado (de un solo uso)
- Invalida todos los tokens de reset existentes cuando se solicita uno nuevo
- También invalida todas las sesiones activas cuando se resetea exitosamente una contraseña
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Sin Política de Contraseñas
mediumAceptar cualquier contraseña — incluyendo '123' o 'a' — hace las cuentas de usuarios trivialmente vulnerables a credential stuffing y ataques de fuerza bruta.
Sin Rate Limit en Login
mediumUn endpoint de login sin rate limiting puede ser forzado por fuerza bruta miles de veces por segundo hasta encontrar una contraseña válida.
Sin MFA/2FA
lowSin autenticación multifactor, una contraseña robada o adivinada es todo lo que se necesita para comprometer completamente una cuenta.
Sin Verificación de Email
mediumPermitir cuentas con email no verificado deja que atacantes se registren con la dirección de email de otra persona, potencialmente bloqueándolos o suplantándolos.