mediumCWE-613A07:2021

Sin Timeout de Sesión

Las sesiones que nunca expiran permanecen válidas indefinidamente, dándole a los atacantes tiempo ilimitado para usar tokens robados.

Cómo Funciona

Si un JWT o token de sesión no tiene expiración, un token robado de una brecha, un log filtrado o un dispositivo comprometido permanece válido para siempre. El atacante puede volver meses después y el token sigue funcionando. Los timeouts de sesión limitan la ventana de oportunidad incluso cuando un token es comprometido.

Código Vulnerable
// MAL: JWT sin expiración — válido para siempre
const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET!);
// Sin expiresIn — este token nunca expira
Código Seguro
// BIEN: patrón de access token de corta duración + refresh token
const accessToken = jwt.sign(
  { userId: user.id },
  process.env.JWT_SECRET!,
  { expiresIn: '15m' }  // access token de corta duración
);
const refreshToken = generateSecureToken(); // guardado en DB con expiración de 30 días
// El cliente usa el refresh token para obtener nuevos access tokens silenciosamente

Ejemplo Real

La auditoría de seguridad de Zoom en 2020 encontró que algunos tokens no tenían expiración configurada. Los investigadores de seguridad demostraron que un token de una entrada de log de un año atrás seguía siendo válido, permitiéndoles autenticarse como usuarios que habían cambiado sus contraseñas hace mucho.

Cómo Prevenirlo

  • Establece una expiración corta en los JWTs (15-60 minutos) e implementa un flujo de refresh token
  • Implementa timeout de sesión absoluto (por ejemplo, 30 días máximo) independientemente de la actividad
  • Implementa timeout de sesión por inactividad (por ejemplo, 2 horas de inactividad) para aplicaciones sensibles
  • Guarda los refresh tokens en la base de datos para que puedan ser revocados del lado del servidor

Tecnologías Afectadas

Node.js

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas