
مُعيدات إنتاج لإثبات المفهوم لثغرة حقن ترويسات CloudEvent المنظّم في Apache Camel camel-knative (CVE-2026-63621)، تُظهر حقن الترويسات عبر حقول الامتداد الخبيثة في بيئتي تشغيل Spring Boot وQuarkus.
أدوات إعادة إنتاج قابلة للتشغيل (إثبات مفهوم) لنفس ثغرة Apache Camel، واحدة لكل بيئة تشغيل:
كلا الإصدارين متأثران (تم إصلاح المشكلة في 4.14.9 / 4.18.4 / 4.22.0)، ويُظهر كلاهما العيب ذاته: يستقبل مستهلك camel-knative أحداث CloudEvents في وضعَين للمحتوى. في وضع الثنائي تصل السمات كترويسات HTTP وتُمرَّر عبر HeaderFilterStrategy، لذلك تُسقَط الترويسات Camel*. في وضع المهيكل (Content-Type: application/cloudevents+json) يكون الحدث بأكمله نص JSON، وتقوم النسخة المتأثرة بتعيين كل حقل امتداد في ذلك JSON إلى ترويسات الرسالة عبر setHeader(key.toLowerCase(Locale.US), value) وبدون HeaderFilterStrategy. أسماء الامتدادات يختارها المُرسِل، لذا يمكن للمهاجم تعيين ترويسة تحكم داخلية في Camel. هنا يصبح الامتداد المُحقن camelsqlquery ترويسة CamelSqlQuery (ترويسات Camel غير حساسة لحالة الأحرف) — وهي العبارة التي كان منتج camel-sql سينفّذها (حقن ترويسات → CWE-74).
ملاحظة حول نسخة Spring Boot. نقل HTTP الخاص بـ knative مبني على Vert.x ويُستخدم في نشرات camel-main / Camel Quarkus. لا يستضيف تطبيق servlet في Spring Boot هذا النقل، لذا تشغّل أداة إعادة الإنتاج الخاصة بـ Spring Boot عملية الفك المعرّض للثغرة تمامًا (
CloudEventProcessors.fromSpecVersion("1.0").consumer(...)) مباشرة — وهو نفس مسار الكود الذي يسلكه طلب واردapplication/cloudevents+jsonداخل مستهلك knative. نسخة Camel Quarkus هي أداة إعادة الإنتاج الكاملة المُدارة عبر HTTP (أرسل POST لحدث CloudEvent إلى المصدر المباشر).
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 structured CloudEvent (no extension):
CamelSqlQuery ... = [null]
2) Malicious structured CloudEvent (injected extension 'camelsqlquery'):
CamelSqlQuery ... = [SELECT * FROM secrets WHERE 1=1 -- injected-by-attacker]
>>> PROVEN: ... a camel-sql producer downstream would execute this attacker-supplied statement: true
النشرة الأمنية: https://camel.apache.org/security/CVE-2026-63621.html
تعيين الامتدادات في الوضع المهيكل يمرّر الآن كل حقل عبر HeaderFilterStrategy (وهو DefaultHeaderFilterStrategy) قبل تعيينه، بما يتوافق مع مسار وضع المحتوى الثنائي — لذلك تُسقَط أسماء الامتدادات Camel* القادمة من النص غير الموثوق:
// fixed (AbstractCloudEventProcessor.mapExtensionAsHeader)
final String headerName = key.toLowerCase(Locale.US);
if (!headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange)) {
message.setHeader(headerName, value);
}
نُشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة، والتحقق مما إذا كانوا متأثرين بها، والتأكد من أن الترقية تحلّها. القيمة المُحقنة هي علامة حميدة (سلسلة SQL خاملة لا تُنفَّذ هنا أبدًا). لا تستخدم هذه المادة ضد أنظمة لا تملكها أو تشغّلها.
| بيئة التشغيل | الدليل | المكدس التقني | الأسلوب |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.18.2 | فك ترميز مباشر (انظر الملاحظة) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (يضمّ Camel 4.20.0) | مصدر knative كامل مُدار عبر HTTP |
| الخاصية | القيمة |
|---|
| المكوّن | camel-knative (Spring Boot: camel-knative; Quarkus: camel-quarkus-knative) |
| CWE | CWE-20 (التحقق غير السليم من الإدخال) → CWE-74 (الحقن) |
| ناقل الهجوم | حدث CloudEvent في الوضع المهيكل (application/cloudevents+json) مع حقل امتداد يختاره المهاجم |
| التأثير | حقن ترويسات تحكم داخلية في Camel على الـ Exchange (هنا CamelSqlQuery) |
| الإصدارات المتأثرة | من 3.15.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-24084 |
| الإسناد | Andrea Cosentino (Apache Software Foundation) |