
نسخة إثبات مفهوم قابلة للتشغيل بـ Spring Boot تعيد إنتاج CVE-2026-88901، وهو ثغرة XXE (CWE-611) في Apache Camel camel-smooks، مع تشغيلات تحكم متأثرة ومُرقّعة.
أداة إثبات مفهوم قابلة للتشغيل تعيد إنتاج ثغرة Apache Camel حيث كان تنسيق بيانات Smooks
(.unmarshal().smooks(...)) ومكوّن Smooks (smooks:) يحلّلان جسم XML الوارد باستخدام القارئ
الذي يحلّه Smooks افتراضيًا (محلّل Woodstox SAX)، والذي يحلّ الكيانات العامة والمعاملات الخارجية
ويحمّل ملفات DTD الخارجية — ولم يطبّق camel-smooks أيًا من تقوية المحلّل التي تطبّقها مكوّنات Camel
الأخرى لـ XML. لذلك فإن DOCTYPE مع مجموعة فرعية خارجية، أو كيان عام خارجي، يُعلَن في مستند XML
يُحلّ ويُوسّع أثناء إلغاء تسلسل الجسم، ويُربَط المحتوى المحلول في النتيجة. يمكن لمرسل خارجي يصل
مستند XML الخاص به إلى تنسيق بيانات أو نقطة نهاية camel-smooks أن يقرأ ملفات يمكن لعملية Camel
قراءتها، أو أن يجعل العملية تُصدر طلبات إلى مضيفين داخليين (CWE-611). لا يُشترط أي خيار غير افتراضي —
فقد كان حلّ الكيانات الخارجية هو السلوك الافتراضي.
Spring Boot فقط. تشحن هذه الأداة وحدة Camel Spring Boot واحدة. لا يملك
camel-smooksامتدادcamel-quarkus-smooks، لذا لا يوجد نظير في Quarkus لإعادة إنتاجه. تُظهر وحدة Spring Boot السلوك المتأثر و السلوك المُصلَح.
| بيئة التشغيل | الدليل | المكدّس |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-smooks 4.22.0 (متأثر؛ مُصلَح في 4.22.1) |
يحاكي برنامج التشغيل اختبار الانحدار الخاص بالإصلاح نفسه (SmooksDataFormatXmlSecurityTest). يُكتَب
ملف علامة حميد في دليل مؤقت، ويُلغى تسلسل مستند XML <customer> عبر SmooksDataFormat الحقيقي
مع smooks-config.xml القياسي (بربط المستند في حبة Customer). حقل firstName في المستند هو كيان
خارجي يشير إلى ملف العلامة:
<!DOCTYPE customer [<!ENTITY xxe SYSTEM "file:///…/secret.txt">]>
<customer><firstName>&xxe;</firstName>…</customer>
Customer.firstName — وقد تسرّب الملف إلى الفول غير المُحلَّل.DocumentBuilder مُحصَّن (مع تعطيل الكيانات الخارجية وتحميل DTD الخارجي)، لذا لا يتم تحليل الكيان ولا تظهر العلامة أبدًا.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: firstName = the marker file content; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-88901-smooks-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: firstName null, marker not leaked; >>> Not exploited
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-smooks (تنسيق بيانات ومكوّن Smooks) |
| CWE | CWE-611 (التقييد غير السليم لمرجع الكيان الخارجي في XML) |
| الخطورة | عالية |
| ناقل الهجوم | يوفّر مُرسِل خارجي جسم رسالة XML يُفكّ تجميعه (unmarshalled) بواسطة تنسيق بيانات camel-smooks أو نقطة نهاية تستخدم قارئ XML الافتراضي |
| التأثير | قراءة الملفات المحلية التي يمكن لعملية Camel قراءتها؛ هجمات SSRF على المضيفين الداخليين الذين تسمّيهم الوثيقة |
| الإصدارات المتأثرة | من 4.7.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24677 |
| أبلغ عنه | h1ei1 |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-88901.html
يقوم camel-smooks الآن بتحليل XML غير الموثوق مسبقًا باستخدام
javax.xml.parsers.DocumentBuilder مُهيّأ بخيار FEATURE_SECURE_PROCESSING ومع تعطيل الكيانات العامة الخارجية
وكيانات المعاملات الخارجية وتحميل DTD الخارجي، ثم يسلّم Smooks شجرة DOM الناتجة — بما يطابق التهيئة الآمنة
المستخدمة في XmlConverter ومكوّنات Camel الأخرى الخاصة بـ XML. ينطبق هذا التشديد فقط عندما تُحلّل تهيئة Smooks
ملفات XML باستخدام قارئها الافتراضي (لذا فإن تهيئات EDI وCSV وJSON والقارئات المخصصة، واتجاه التجميع (marshalling)،
تبقى دون تغيير). ويستعيد خيار جديد باسم allowExternalEntities، المُعطّل افتراضيًا، السلوك السابق للتهيئات القديمة
الموثوقة.
لا تُطبّق camel-smooks على ملفات XML الواردة من مُرسِلين غير موثوقين.
يُنشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. يُنشئ ملف "secret" بواسطة أداة إعادة الإنتاج نفسها في دليل مؤقت ويحتوي فقط على سلسلة علامة غير ضارة؛ ويُحذف بعد الفحص. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.