Index
Validación de firma JWT insegura
Descripción
JWT es un estándar ampliamente utilizado para la autenticación y autorización en aplicaciones web, pero es importante ser consciente de los riesgos y vulnerabilidades potenciales que conlleva. A continuación, se detallan algunas vulnerabilidades comunes de JWT:
- Algoritmos de firma débiles: Los JWT normalmente utilizan una firma para garantizar la integridad y autenticidad del token. Sin embargo, si se utiliza un algoritmo de firma débil o si la clave secreta utilizada para la firma se ve comprometida, un atacante puede falsificar o manipular el token. Es fundamental utilizar algoritmos criptográficos sólidos y asegurar adecuadamente las claves.
- Gestión de claves insegura: Los JWT dependen de claves secretas para verificar la autenticidad de los tokens. Si las claves no se gestionan o protegen adecuadamente, pueden ser robadas, filtradas o comprometidas. Es importante almacenar las claves de forma segura, utilizar un cifrado fuerte y seguir las mejores prácticas para la gestión de claves, como rotar las claves con regularidad y limitar el acceso a ellas.
- Caducidad del token: Los JWT suelen tener un tiempo de caducidad (reclamación exp) para limitar su validez. Sin embargo, si el tiempo de caducidad se establece demasiado en el futuro o no se aplica correctamente, un atacante podría utilizar un token caducado para obtener acceso no autorizado. Es crucial establecer tiempos de caducidad adecuados y validarlos en el lado del servidor.
- Fuga de tokens: Si se filtra o roba un JWT, un atacante puede usarlo para suplantar al usuario legítimo sin necesidad de proporcionar credenciales adicionales. Esto puede ocurrir si el token se transmite de forma insegura (por ejemplo, a través de una conexión no cifrada), se almacena en ubicaciones vulnerables (por ejemplo, almacenamiento en el lado del cliente susceptible a ataques XSS), o si existen debilidades en el código de manejo del token.
- Validación insuficiente: Al validar un JWT, es esencial verificar la integridad, la firma y las reclamaciones asociadas del token. No realizar una validación adecuada u omitir comprobaciones críticas puede generar vulnerabilidades. Por ejemplo, un atacante puede manipular las reclamaciones del token para elevar los privilegios u obtener acceso no autorizado.
- Ataques de reproducción de tokens: Los JWT no tienen estado y no cuentan con mecanismos integrados para detectar ataques de reproducción de tokens, en los que un atacante intercepta un token válido y lo usa varias veces. La implementación de medidas adicionales, como un nonce o mecanismos de detección de reproducción, puede ayudar a mitigar esta vulnerabilidad.
- Políticas de uso compartido de recursos de origen cruzado (CORS) inseguras: Si el servidor que aloja la API que acepta los JWT tiene una política CORS insegura, puede permitir que dominios no autorizados realicen solicitudes con el JWT, lo que lleva a una posible divulgación de información o acceso no autorizado.
Recomendación
Para mitigar las vulnerabilidades de la firma JWT, es crucial utilizar bibliotecas JWT estandarizadas, configurarlas correctamente y verificar la firma y la caducidad de los tokens JWT antes de cualquier operación.
También es fundamental almacenar de forma segura la secret key, ya que su filtración puede inutilizar cualquier medida de seguridad.
import io.jsonwebtoken.JwtException
import io.jsonwebtoken.Jwts
import io.jsonwebtoken.SignatureAlgorithm
import io.jsonwebtoken.security.Keys
import java.security.Key
// Secure JWT validation
fun validateJwt(token: String, secretKey: Key): Boolean {
try {
Jwts.parserBuilder()
.setSigningKey(secretKey)
.build()
.parseClaimsJws(token)
return true // Token is considered valid
} catch (e: JwtException) {
return false // Token validation failed
}
}
fun main() {
val token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNTE2MjM5MDIyfQ.4x6fOGYwfFYIQgZepgK1AnbDDr2-TvAp6im0kKk52Es"
val secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256) // Generate a secure secret key
val isValid = validateJwt(token, secretKey)
if (isValid) {
println("Token is valid")
// Proceed with further processing
} else {
println("Token validation failed")
// Handle invalid token
}
}
En este ejemplo, la función validateJwt toma un token JWT y una clave secreta segura como entrada. El método Keys.secretKeyFor de la biblioteca jjwt se utiliza para generar una clave secreta segura utilizando el algoritmo HS256.
La función intenta validar el token analizando sus reclamaciones utilizando el método Jwts.parserBuilder(). El método setSigningKey se utiliza para establecer la clave secreta segura para la verificación de la firma. Esto garantiza que la firma del token se valide de forma segura.
Si el token se analiza correctamente sin excepciones, se considera válido. De lo contrario, si se produce una excepción JwtException durante el proceso de análisis, la validación del token falla.
Al utilizar una clave secreta segura y seguir las mejores prácticas para la gestión de claves, como generar claves con suficiente aleatoriedad y protegerlas del acceso no autorizado, puede mejorar la seguridad de su implementación de JWT.
Enlaces
Estándares
- OWASP_MASVS_L1:
- MSTG_CRYPTO_2
- MSTG_CRYPTO_3
- MSTG_CRYPTO_4
- OWASP_MASVS_L2:
- MSTG_CRYPTO_2
- MSTG_CRYPTO_3
- MSTG_CRYPTO_4
- CWE_TOP_25:
- GDPR:
- ART_5
- ART_32
- PCI_STANDARDS:
- REQ_2_2
- REQ_3_6
- REQ_3_7
- REQ_6_2
- REQ_6_3
- REQ_7_3
- REQ_8_3
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_CRYPTO_1
- MASVS_CRYPTO_2
- SOC2_CONTROLS:
- CC_2_1
- CC_3_4
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- CNIL_FOR_DEVELOPERS:
- DEVELOPERS_4_1_4
- HIPAA_CONTROLS:
- SECURITY251
- SECURITY212
- SECURITY213