
مُعيد إنتاج قابل للتشغيل بـ Spring Boot وQuarkus لـ CVE-2026-91858، وهو ثغرة XXE في Apache Camel camel-fop عبر TransformerFactory من طرف ثالث، مع التحقق من الإصدارات المتأثرة والمُصحّحة.
مُعيد إنتاج إثبات مفهوم قابل للتشغيل لثغرة Apache Camel حيث أنشأ FopProducer في camel-fop الخاصية
javax.xml.transform.TransformerFactory الخاصة به مع FEATURE_SECURE_PROCESSING فقط قبل تشغيل تحويل هوية
على جسم رسالة XSL-FO. في المحوّل المدمج في JDK، فإن هذه الميزة وحدها تُفرغ بالفعل حدود
accessExternalDTD/accessExternalStylesheet، لذا تُرفض الموارد الخارجية. ولكن عندما يكون هناك
TransformerFactory من JAXP من طرف ثالث مثل Saxon-HE على مسار الفئات (classpath) — على سبيل المثال لأن التطبيق يستخدم أيضًا
camel-xslt-saxon أو camel-saxon — فإن TransformerFactory.newInstance() يُعيد ذلك التطبيق، و
FEATURE_SECURE_PROCESSING وحدها لا تقيّد الوصول إلى الموارد الخارجية عليه. عندئذٍ يُحلّ DOCTYPE مع مجموعة فرعية خارجية
مُعلنة في جسم XSL-FO أثناء تحويل الجسم، لذا يمكن لمستند مُرسِل خارجي
قراءة الملفات التي يمكن لعملية Camel قراءتها أو جعلها تُصدر طلبات إلى مضيفين يُسمّيهم (CWE-611).
| بيئة التشغيل | الدليل | المكدّس |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-fop 4.22.0 (متأثر؛ مُصلح في 4.22.1) + Saxon-HE 13.0 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-fop (Camel 4.22.0، متأثر؛ عنصر تحكم مُصلح CQ 3.40.0 / Camel 4.22.1) + Saxon-HE 13.0 |
كلا الوحدتين تُظهران السلوك المتأثر و السلوك المُصلح مقابل FopProducer الحقيقي. Saxon-HE موجود على
مسار الفئات في كلتيهما — وهو الشرط المسبق للثغرة؛ أما النشر الافتراضي الذي يستخدم محوّل JDK فهو غير
متأثر قبل الإصلاح أو بعده.
نقطة نهاية التحقق /exploit/attack تبدأ استدعاء HTTP داخل العملية وتُرسل مستند XSL-FO إلى fop:pdf
حيث يُعلن DOCTYPE الخاص به عن DTD خارجي يشير إلى ذلك الاستدعاء:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "http://localhost:<port>/external.dtd">
<fo:root …>…Hello…</fo:root>
المُعرِف الحاسم هو ببساطة ما إذا كان قد طُلب استدعاء الرجوع — دليل قاطع على أن المورد الخارجي قد جُلب:
TransformerFactory.newInstance() مكتبة Saxon، والتي حتى في ظل المعالجة الآمنة وحدها لا تزال تجلب
DTD الخارجي — يُستدعى استدعاء الرجوع (الآلية نفسها تقرأ عناوين URL من نوع file://).ACCESS_EXTERNAL_DTD على ""، لذا ترفض Saxon الـ DTD الخارجي؛ ولا يُستدعى استدعاء الرجوع أبدًا.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: callback hit = true; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -Djava.awt.headless=true -jar target/cve-2026-91858-fop-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: callback hit = false; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): callback hit = true
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -Djava.awt.headless=true -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: callback hit = false
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-fop (FopProducer) |
| CWE | CWE-611 (التقييد غير السليم لمرجع الكيان الخارجي في XML) |
| الخطورة | متوسطة |
| ناقل الهجوم | يصل XSL-FO من مُرسِل خارجي إلى منتج fop:، في عملية نشر تحتوي أيضًا على TransformerFactory من JAXP لطرف ثالث (مثل Saxon-HE) على مسار الفئات (classpath) |
| التأثير | قراءة الملفات المحلية التي يمكن لعملية Camel قراءتها؛ وهجمات SSRF على المضيفات الداخلية التي تسمّيها الوثيقة |
| الإصدارات المتأثرة | من 4.0.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 (فقط عند وجود TransformerFactory غير تابع لـ JDK) |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24605 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-91858.html
وحدة Quarkus المتأثرة مبنية على CQ 3.39.0 (Camel 4.22.0). أما الضابط المُرقَّع فهو CQ 3.40.0 (Camel 4.22.1). أُضيف Saxon-HE 13.0 إلى كلتا الوحدتين ليكون بديلًا عن تطبيق يستخدم أيضًا camel-xslt-saxon/camel-saxon؛ فبدون
TransformerFactoryغير تابع لـ JDK لا يكون الخلل قابلًا للاستغلال.
أصبح FopProducer يضبط أيضًا XMLConstants.ACCESS_EXTERNAL_DTD و
XMLConstants.ACCESS_EXTERNAL_STYLESHEET على السلسلة الفارغة في TransformerFactory الذي ينشئه (بالإضافة إلى
FEATURE_SECURE_PROCESSING)، بما يطابق إعدادات معالجة XML الآمنة المستخدمة في XmlConverter. وبالتالي يُرفض الوصول
إلى DTD وأوراق الأنماط الخارجية على أي تطبيق JAXP يحترم تلك السمات، بما في ذلك Saxon-HE.
لا تُرسِل XSL-FO غير موثوق إلى منتج fop:، أو أزِل TransformerFactory البديل من JAXP (مثل
Saxon-HE) من مسار الفئات (classpath) حتى يُستخدم محوّل JDK — الذي يرفض بالفعل DTDs الخارجية في ظل المعالجة الآمنة.
نُشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. يشير DTD الخارجي إلى استدعاء راجع (callback) داخل العملية على localhost؛ ولا يتم الاتصال بأي شيء خارج أداة إعادة الإنتاج ولا تُقرأ أي ملفات حساسة. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.