HIGH Authentication

Configuración Incorrecta de JWT en APIs

¿Qué es la Configuración Incorrecta de JWT?

Los JSON Web Tokens (JWTs) son medios compactos y seguros para URL para representar reclamaciones entre partes. Consisten en tres partes: una cabecera que especifica el tipo de token y el algoritmo de firma, una carga útil que contiene las reclamaciones, y una firma para verificación. Los JWTs se utilizan ampliamente para autenticación y autorización en APIs, pero las configuraciones incorrectas pueden crear vulnerabilidades de seguridad severas.

Las configuraciones incorrectas comunes de JWT incluyen:

  • Vulnerabilidad del Algoritmo None: Algunas bibliotecas JWT aceptan el algoritmo 'none', permitiendo a los atacantes crear tokens sin firmar que omiten la verificación de firma
  • Claves Secretas Débiles: Usar secretos predecibles o débiles para firmar tokens los hace vulnerables a ataques de fuerza bruta
  • Validación de Algoritmo Faltante: Aceptar tokens con cualquier algoritmo sin validación adecuada puede llevar a ataques de confusión de algoritmos
  • Gestión Inadecuada de Claves: Codificar secretos, usar valores predeterminados, o prácticas deficientes de rotación de claves
  • Tiempo de Vida Excesivo del Token: Tokens que nunca expiran o tienen tiempos de vida muy largos aumentan la ventana de ataque
  • Validación de Reclamos Faltante: No validar reclamos esenciales como emisor (iss), audiencia (aud), o expiración (exp)

Cuando los atacantes explotan estas configuraciones incorrectas, pueden falsificar tokens, escalar privilegios, u omitir completamente la autenticación.

Cómo la Configuración Incorrecta de JWT Afecta las APIs

Los atacantes que explotan configuraciones incorrectas de JWT pueden lograr resultados devastadores. El escenario más común involucra la vulnerabilidad del algoritmo 'none', donde un atacante modifica la cabecera de un token para especificar 'alg: none' y elimina la firma. Si el servidor acepta esto sin validación adecuada, el atacante obtiene acceso sin credenciales.

Considera este flujo de ataque:

// Token original válido (alg: HS256, firmado con clave secreta)
{
"header": {"alg": "HS256", "typ": "JWT"},
"payload": {"sub": "user123", "role": "user"},
"signature": "valid_signature_here"
}

// Token modificado (alg: none, sin firma)
{
"header": {"alg": "none", "typ": "JWT"},
"payload": {"sub": "attacker", "role": "admin"}
}

Si el servidor acepta el token modificado, el atacante se convierte en administrador sin conocer ningún secreto.

Otro ataque crítico involucra claves secretas débiles. Si una API usa un secreto corto o predecible como 'secret' o 'password', los atacantes pueden usar tablas arcoíris o herramientas de fuerza bruta para generar tokens válidos. Esto es particularmente peligroso cuando se combina con configuraciones predeterminadas que usan claves débiles.

Los ataques de confusión de algoritmos ocurren cuando los servidores aceptan tokens firmados con algoritmos asimétricos (RS256, ES256) pero los tratan como algoritmos simétricos. Un atacante puede generar un token válido usando la clave pública como si fuera una clave secreta, omitiendo completamente la autenticación.

Cómo Detectar la Configuración Incorrecta de JWT

Detectar configuraciones incorrectas de JWT requiere análisis estático de tu código y pruebas dinámicas de tus endpoints API. Estas son las áreas clave a examinar:

  1. Revisión de Código para Validación de Algoritmo: Verifica si tu biblioteca JWT valida adecuadamente la cabecera 'alg' y rechaza algoritmos 'none' a menos que se intente explícitamente
  2. Análisis de Claves Secretas: Busca secretos codificados, valores predeterminados, o patrones débiles de generación de claves en tu código fuente
  3. Lógica de Validación de Tokens: Verifica que tu servidor valide todos los reclamos requeridos (iss, aud, exp) y no acepte tokens con algoritmos arbitrarios
  4. Prácticas de Gestión de Claves: Asegúrate de que los secretos se almacenen de forma segura, se roten regularmente, y no se expongan en el control de versiones

El escáner de seguridad API de middleBrick prueba automáticamente configuraciones incorrectas de JWT en múltiples dimensiones:

  • Pruebas de Validación de Algoritmo: middleBrick intenta enviar tokens con algoritmos 'none' y varios tipos de algoritmos para verificar si tu servidor los valida adecuadamente
  • Verificación de Firma: El escáner prueba si tokens modificados o falsificados son aceptados por tu API
  • Validación de Reclamos: middleBrick verifica que tu API valide adecuadamente los reclamos JWT esenciales y no acepte tokens con reclamos faltantes o inválidos
  • Análisis de Especificación OpenAPI: Cuando proporcionas una especificación OpenAPI, middleBrick coteja tus requisitos de autenticación documentados con el comportamiento real en tiempo de ejecución

El módulo de seguridad LLM/AI de middleBrick también prueba configuraciones incorrectas de JWT en endpoints de IA/ML, verificando si los tokens de acceso a modelos se validan adecuadamente y si existen vulnerabilidades de inyección de prompts que podrían omitir la autenticación.

Prevención y Remediación

Asegurar tu implementación de JWT requiere seguir las mejores prácticas de seguridad y usar bibliotecas bien evaluadas. Estos son pasos concretos de remediación:

1. Usa Secretos Fuertes y Únicos

// Bien: Usa secretos fuertes generados aleatoriamente
const jwtSecret = crypto.randomBytes(32).toString('hex');

// Mal: Nunca uses secretos débiles o predeterminados
const weakSecret = 'secret'; // Fácilmente adivinable
const defaultSecret = 'your-256-bit-secret'; // Predeterminado común

2. Valida el Algoritmo Estrictamente

// Bien: Especifica explícitamente algoritmos permitidos
const token = jwt.verify(jwtToken, secret, {
algorithms: ['HS256', 'RS256'] // Solo permite estos algoritmos
});

// Mal: No aceptes algoritmos arbitrarios
const token = jwt.verify(jwtToken, secret, {
algorithms: ['*'] // Acepta cualquier algoritmo - vulnerable!
});

3. Implementa Validación de Reclamos Adecuada

// Bien: Valida todos los reclamos requeridos
const token = jwt.verify(jwtToken, secret, {
algorithms: ['HS256'],
issuer: 'https://your-domain.com',
audience: 'your-api-client-id',
maxAge: '24h'
});

// Mal: Validación de reclamos faltante
const token = jwt.verify(jwtToken, secret); // Sin validación de reclamos

4. Usa Claves Asimétricas para APIs Públicas

// Bien: Usa RS256 con par de claves pública/privada
const publicKey = fs.readFileSync('public.pem');
const privateKey = fs.readFileSync('private.pem');

// Firma con clave privada
const token = jwt.sign(payload, privateKey, { algorithm: 'RS256' });

// Verifica con clave pública
const decoded = jwt.verify(token, publicKey, { algorithms: ['RS256'] });

5. Implementa Rotación de Claves

// Bien: Soporta múltiples claves para rotación sin problemas
const currentKey = fs.readFileSync('key-v2.pem');
const previousKey = fs.readFileSync('key-v1.pem');

// Verifica con cualquiera de las claves
try {
const token = jwt.verify(jwtToken, currentKey, { algorithms: ['HS256'] });
} catch (error) {
const token = jwt.verify(jwtToken, previousKey, { algorithms: ['HS256'] });
}

6. Establece Tiempos de Vida de Token Apropiados

// Bien: Tokens de acceso de corta duración con tokens de actualización
const accessToken = jwt.sign({
userId: 'user123',
role: 'user'
}, secret, { expiresIn: '15m' }); // Token de acceso de corta duración

const refreshToken = jwt.sign({
userId: 'user123'
}, refreshSecret, { expiresIn: '7d' }); // Token de actualización de mayor duración

Impacto en el Mundo Real

Las configuraciones incorrectas de JWT han llevado a numerosas brechas de seguridad de alto perfil. En 2017, una vulnerabilidad en la biblioteca JWT de Auth0 permitió a los atacantes omitir la verificación de firma manipulando la cabecera 'alg'. Esto afectó a miles de aplicaciones usando la biblioteca y demostró cómo una sola configuración incorrecta podría tener un impacto generalizado.

El ataque de JSON Web Token (CVE-2015-9235) explotó la vulnerabilidad del algoritmo 'none' en múltiples implementaciones de JWT. Los atacantes podían crear tokens sin firmar que eran aceptados como válidos, permitiendo eludir completamente la autenticación. Esta vulnerabilidad afectó a bibliotecas JWT principales en Node.js, Java y Python.

En 2020, los investigadores descubrieron que muchas aplicaciones empresariales eran vulnerables a ataques de confusión de algoritmos. Las aplicaciones esperando tokens RS256 aceptarían tokens HS256 firmados con la clave pública, permitiendo a los atacantes falsificar tokens válidos usando información públicamente disponible.

middleBrick ayuda a prevenir estos problemas escaneando automáticamente tus APIs en busca de configuraciones incorrectas de JWT antes de que los atacantes puedan explotarlas. Con el escaneo de autoservicio de 10 segundos de middleBrick, puedes identificar vulnerabilidades como secretos débiles, problemas de validación de algoritmos y validación de reclamos faltante sin esperar semanas para una prueba de penetración manual. El escáner proporciona orientación específica de remediación para cada hallazgo, ayudándote a corregir problemas rápidamente y mantener una seguridad API sólida.

Frequently Asked Questions

¿Cuál es la diferencia entre los algoritmos JWT HS256 y RS256?

HS256 (HMAC con SHA-256) usa una clave simétrica donde el mismo secreto se usa para firmar y verificar. RS256 (RSA con SHA-256) usa claves asimétricas con una clave privada para firmar y una clave pública para verificar. RS256 es generalmente más seguro para APIs públicas porque puedes compartir la clave pública sin exponer tu secreto. HS256 es más simple para servicios internos pero requiere distribución segura de claves entre todas las partes que necesitan verificar tokens.

¿Cómo puedo probar si mi implementación de JWT es vulnerable al ataque del algoritmo 'none'?

Crea un token JWT con la cabecera '{"alg": "none"}' y sin firma, luego modifica la carga útil para incluir privilegios de administrador. Envía este token a tu API y observa si es aceptado. middleBrick realiza automáticamente esta prueba y muchas otras durante su escaneo de 5-15 segundos. El escáner también verifica secretos débiles, validación de reclamos faltante, y vulnerabilidades de confusión de algoritmos que las pruebas manuales podrían pasar por alto.

¿Debo usar tokens de actualización con JWTs?

Sí, los tokens de actualización proporcionan un equilibrio entre seguridad y experiencia de usuario. Usa tokens de acceso de corta duración (15 minutos) para llamadas API y tokens de actualización de mayor duración (7-30 días) para obtener nuevos tokens de acceso. Almacena los tokens de actualización de forma segura en una cookie HTTP-only o base de datos segura. Este enfoque limita el daño si un token de acceso se ve comprometido mientras mantiene una buena experiencia de usuario. El escáner de middleBrick verifica si tu gestión del ciclo de vida de tokens sigue las mejores prácticas de seguridad.