
Bibliothèque de laboratoire de preuve de concept démontrant la CVE-2026-29000 dans pac4j-jwt, comparant les versions vulnérable et corrigée avec Docker pour montrer l'acceptation et le rejet de JWT falsifiés.
Ce dépôt contient un PoC au niveau bibliothèque pour CVE-2026-29000 dans pac4j-jwt.
Il compare le comportement vulnérable et corrigé avec deux cas :
| Version | Référence | Attaque | Résultat |
|---|
6.0.3 | ✅ | ✅ | Vulnérable |
6.0.4.1 | ✅ | ✅ | Vulnérable |
6.3.3 | ✅ | ❌ | Corrigée |
Ce PoC démontre la création d'un profil authentifié avec un sujet et des rôles contrôlés par l'attaquant sur les versions vulnérables, tandis que la version corrigée rejette le jeton forgé.
Ceci n'est pas une démonstration d'application web.
C'est un petit programme Java qui appelle JwtAuthenticator directement et compare plusieurs versions de pac4j-jwt dans Docker.
L'objectif est de prouver trois choses :
Les versions testées ont été choisies délibérément :
Cela donne au laboratoire trois points de référence utiles :
.
├── docker-compose.yml
├── Dockerfile
├── pom.xml
└── src/main/java/lab/Repro.java
docker-compose.yml
Définit la matrice de test pour chaque version.
Dockerfile
Compile et exécute le PoC dans un conteneur.
pom.xml
Définit les dépendances et compile un JAR exécutable.
src/main/java/lab/Repro.java
Le harnais de test PoC proprement dit.
Le fichier docker-compose.yml définit trois services :
v603 = tester pac4j-jwt 6.0.3v6041 = tester pac4j-jwt 6.0.4.1patched = tester pac4j-jwt 6.3.3Ainsi, ces commandes signifient « exécuter le PoC une fois contre cette version spécifique » :
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
--rm signifie que le conteneur temporaire est supprimé après la fin de l'exécution.
docker compose build --no-cache
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
Pour chaque version, le programme exécute deux cas.
Il génère un jeton légitime et le valide via JwtAuthenticator.
Résultat attendu :
Il génère un jeton forgé avec des revendications contrôlées par l'attaquant et le valide via JwtAuthenticator.
Résultat attendu :
Vous devriez voir quelque chose comme ceci :
[case] baseline
result: ACCEPTED
observed_subject: alice
observed_roles: [ROLE_USER]
[case] attack
result: ACCEPTED
observed_subject: admin#override
observed_roles: [ROLE_SUPERUSER, ROLE_ADMIN]
[summary]
conclusion: VULNERABLE: forged token accepted
Signification :
Vous devriez voir quelque chose comme ceci :
[case] baseline
result: ACCEPTED
observed_subject: alice
observed_roles: [ROLE_USER]
[case] attack
result: REJECTED
reason: CredentialsException: A non-signed JWT cannot be accepted as signature configurations have been defined
[summary]
conclusion: PATCHED: forged token rejected
Signification :
Cette CVE affecte un chemin d'authentification au niveau bibliothèque, pas une application unique avec un modèle de rôles universel.
La partie réutilisable est la forme de l'attaque :
JwtAuthenticatorCe qui n'est pas universel dans les applications réelles :
Pour cette raison, ce dépôt se concentre sur la preuve que la bibliothèque accepte les revendications forgées contrôlées par l'attaquant sur les versions vulnérables, plutôt que de prétendre qu'il existe un jeton universel qui fonctionnerait automatiquement contre des applications arbitraires.
docker compose run --rm v603docker compose run --rm v6041docker compose run --rm patched


Ce projet démontre trois faits essentiels :
6.0.3 et 6.0.4.16.3.3C'est la preuve centrale vulnérable-ou-corrigé pour cette CVE dans ce dépôt.
Sur les versions vulnérables, le jeton forgé n'est pas simplement analysé — il produit un profil authentifié avec un sujet et des rôles contrôlés par l'attaquant.