
CVE-2026-29000 - pac4j-jwt (< 4.5.9 / < 5.7.9 / < 6.3.3) JwtAuthenticator Authentifizierungsumgehung PoC
JwtAuthenticator PoC zur AuthentifizierungsumgehungEin Proof-of-Concept für CVE-2026-29000, eine Authentifizierungsumgehung in der pac4j-jwt JwtAuthenticator-Komponente (CVSS 10.0, Kritisch).
Das Skript fälscht einen Token, der jeden Benutzer mit jeder Rolle impersoniert – ohne ein einziges Geheimnis zu kennen – solange das Ziel seinen RSA-öffentlichen Schlüssel bereitstellt.
[!WARNING] Dieses Tool wird nur für Bildungszwecke und autorisierte Sicherheitstests bereitgestellt. Es wurde geschrieben, um die Hack The Box-Maschine "Principal" zu lösen, und die Standardwerte (
iss,role,kid) sind auf diese Box zugeschnitten. Verwenden Sie es nur gegen Systeme, die Ihnen gehören oder für deren Test Sie ausdrücklich autorisiert wurden.
pac4j-jwt-Versionen < 4.5.9, < 5.7.9 und < 6.3.3 enthalten einen Logikfehler in JwtAuthenticator bei der Verarbeitung verschlüsselter JWTs (JWE).
Wenn JwtAuthenticator ein JWE entschlüsselt, versucht es, das innere Token als SignedJWT zu parsen. Wenn das innere Token ein unsigniertes PlainJWT (alg: none) ist, wird das SignedJWT-Objekt null und aufgrund des Logikfehlers wird der Signaturverifikationspfad vollständig übersprungen. Der Authentifikator erstellt dann ein Benutzerprofil direkt aus den unverifizierten Claims.
Mit anderen Worten: Die äußere JWE-Verschlüsselung – die nur den öffentlichen Schlüssel des Servers erfordert – wird fälschlicherweise als Authentizitätsnachweis angesehen, sodass jeder Angreifer, der den öffentlichen Schlüssel lesen kann, vollständig vertrauenswürdige Token erstellen kann.
/api/auth/jwks).PlainJWT (alg: none) mit vom Angreifer gewählten Claims (sub, role, iss, …) fälschen.PlainJWT in eine JWE-Hülle einwickeln, die mit dem öffentlichen Schlüssel des Ziels verschlüsselt ist.Bearer-Token senden. Der anfällige JwtAuthenticator entschlüsselt es, überspringt die Signaturverifikation und vertraut den gefälschten Claims.requirements.txt:pip install -r requirements.txt
(requests, jwcrypto, cryptography)
python3 exploit.py -u <username> [options]
Sie müssen entweder --target (um die JWKS über das Netzwerk abzurufen) oder --jwks-file (um sie lokal bereitzustellen) angeben.
Fälschen eines Admin-Tokens durch Abrufen des öffentlichen Schlüssels vom Ziel und Ausgabe auf stdout:
python3 exploit.py -t http://target:8080 -u admin
Token fälschen und automatisch gegen einen geschützten Endpunkt testen:
python3 exploit.py -t http://target:8080 -u admin \
--verify-endpoint /api/settings -v
Eine lokal gespeicherte JWKS verwenden und den Token in einer Datei speichern:
python3 exploit.py --jwks-file jwks.json -u admin -o token.jwe
Aktualisieren Sie org.pac4j:pac4j-jwt auf eine gepatchte Version:
Veröffentlicht unter der MIT-Lizenz.
| Flag | Beschreibung | Standard |
|---|
-t, --target | Basis-URL des Ziels (z. B. http://host:8080) | — |
--jwks-url | JWKS-Endpunkt-Pfad | /api/auth/jwks |
--jwks-file | Lädt JWKS aus einer lokalen Datei anstatt von --target abzurufen | — |
-u, --username | Wert für den sub-Claim (erforderlich) | — |
--role | Wert für den role-Claim | ROLE_ADMIN |
--iss | Wert für den iss-Claim | principal-platform |
--exp | Token-Gültigkeit in Sekunden | 3600 |
--verify-endpoint | Geschützter Endpunkt zum Testen des gefälschten Tokens (z. B. /api/settings) | — |
-k, --insecure | TLS-Zertifikatsprüfung deaktivieren | aus |
-o, --output | Schreibt das gefälschte JWE in eine Datei anstatt auf stdout | stdout |
-v, --verbose | Gibt die gefälschte JWT-Nutzlast auf stderr aus | aus |