Aller au contenu

Index

Validation de signature JWT non sécurisée

Description

JWT est une norme largement utilisée pour l'authentification et l'autorisation dans les applications web, mais il est important d'être conscient des risques et vulnérabilités potentiels impliqués. Voici quelques vulnérabilités JWT courantes :

  • Algorithmes de signature faibles : Les JWT utilisent généralement une signature pour garantir l'intégrité et l'authenticité du jeton. Cependant, si un algorithme de signature faible est utilisé ou si la clé secrète utilisée pour la signature est compromise, un attaquant peut falsifier ou altérer le jeton. Il est crucial d'utiliser des algorithmes cryptographiques robustes et de sécuriser correctement les clés.
  • Gestion des clés non sécurisée : Les JWT s'appuient sur des clés secrètes pour vérifier l'authenticité des jetons. Si les clés ne sont pas correctement gérées ou protégées, elles peuvent être volées, divulguées ou compromises. Il est important de stocker les clés en toute sécurité, d'utiliser un chiffrement fort et de suivre les meilleures pratiques en matière de gestion des clés, telles que la rotation régulière des clés et la limitation de l'accès à celles-ci.
  • Expiration des jetons : Les JWT ont souvent une durée d'expiration (revendication exp) pour limiter leur validité. Cependant, si la durée d'expiration est fixée trop loin dans le futur ou n'est pas appliquée correctement, un attaquant pourrait utiliser un jeton expiré pour obtenir un accès non autorisé. Il est crucial de définir des durées d'expiration appropriées et de les valider côté serveur.
  • Fuite de jetons : Si un JWT est divulgué ou volé, un attaquant peut l'utiliser pour usurper l'identité de l'utilisateur légitime sans avoir à fournir d'informations d'identification supplémentaires. Cela peut se produire si le jeton est transmis de manière non sécurisée (par exemple, sur une connexion non chiffrée), stocké dans des emplacements vulnérables (par exemple, stockage côté client sensible aux attaques XSS), ou s'il existe des faiblesses dans le code de gestion du jeton.
  • Validation insuffisante : Lors de la validation d'un JWT, il est essentiel de vérifier l'intégrité, la signature et les revendications associées du jeton. L'omission d'une validation appropriée ou de vérifications critiques peut entraîner des vulnérabilités. Par exemple, un attaquant peut altérer les revendications du jeton pour élever ses privilèges ou obtenir un accès non autorisé.
  • Attaques par rejeu de jetons : Les JWT sont sans état et n'ont pas de mécanismes intégrés pour détecter les attaques par rejeu de jetons, où un attaquant intercepte un jeton valide et l'utilise plusieurs fois. La mise en œuvre de mesures supplémentaires telles que des mécanismes de détection de rejeu ou l'utilisation d'un nonce peut aider à atténuer cette vulnérabilité.
  • Politiques de partage de ressources inter-origines (CORS) non sécurisées : Si le serveur hébergeant l'API qui accepte les JWT a une politique CORS non sécurisée, il peut autoriser des domaines non autorisés à effectuer des requêtes avec le JWT, entraînant une divulgation potentielle d'informations ou un accès non autorisé.

Recommandation

Pour atténuer les vulnérabilités liées aux signatures JWT, il est crucial d'utiliser des bibliothèques JWT standardisées, de les configurer correctement et de vérifier la signature et l'expiration des jetons JWT avant toute opération.

Il est également crucial de stocker la secret key en toute sécurité, car sa divulgation peut rendre toutes les mesures de sécurité inutiles.

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
    }
}

Dans cet exemple, la fonction validateJwt prend un jeton JWT et une clé secrète sécurisée en entrée. La méthode Keys.secretKeyFor de la bibliothèque jjwt est utilisée pour générer une clé secrète sécurisée à l'aide de l'algorithme HS256.

La fonction tente de valider le jeton en analysant ses revendications à l'aide de la méthode Jwts.parserBuilder(). La méthode setSigningKey est utilisée pour définir la clé secrète sécurisée pour la vérification de la signature. Cela garantit que la signature du jeton est validée de manière sécurisée.

Si le jeton est analysé avec succès sans aucune exception, il est considéré comme valide. Sinon, si une JwtException se produit pendant le processus d'analyse, la validation du jeton échoue.

En utilisant une clé secrète sécurisée et en suivant les meilleures pratiques de gestion des clés, telles que la génération de clés avec un caractère aléatoire suffisant et leur protection contre tout accès non autorisé, vous pouvez renforcer la sécurité de votre implémentation JWT.

Liens

Normes

  • 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