
أداة إثبات مفهوم قابلة للتشغيل لإعادة إنتاج CVE-2026-78165، تُظهر إزالة تسلسل JDK غير المُفلترة لحمولات Redis PUBLISH في Apache Camel camel-spring-redis.
مُعيد إنتاج قابل للتشغيل لإثبات المفهوم (PoC) لثغرة Apache Camel حيث كان camel-spring-redis، عند عدم تكوين خيار
serializer، يبني JdkSerializationRedisSerializer مجرّدًا بدون java.io.ObjectInputFilter
ويستخدمه في كل عملية قراءة. كان RedisConsumer.setBody يطبّقه على البايتات الخام لكل رسالة تُنشر إلى
القنوات المشترك بها، قبل إنشاء الـ Exchange — لذا فإن أي فاعل قادر على إصدار PUBLISH على قناة مشترك بها
يصل مباشرةً إلى مصرف إلغاء التسلسل ويمكنه تنفيذ readObject لأي رسم بياني لكائنات متسلسلة عشوائيًا
(تنفيذ تعليمات برمجية عن بُعد، CWE-502). كان المُسلسِل الافتراضي نفسه يدعم أوامر قراءة المنتج
(GET/HGET/HGETALL/HVALS) وSpringRedisIdempotentRepository.
| بيئة التشغيل | الدليل | المكدّس |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-redis 4.22.0 (متأثر؛ مُصلَح في 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-spring-redis 3.29.0 (Camel 4.15.0، متأثر) |
يعود هذا العيب إلى إدخال المكوّن في الإصدار 2.11.0، لذا فإن كل إصدار متأثر وCamel 4.15.0 في أحدث Camel Quarkus عرضة للثغرة. يأتي الإصلاح في Camel 4.18.5 / 4.22.1 / 4.23.0؛ تشغّل وحدة Spring Boot كلاً من البناء المتأثر (4.22.0) والبناء المُصلَح (4.22.1). لا يوجد إصدار منشور من Camel Quarkus يتضمن بعد نسخة Camel مُصلَحة.
يشغّل التطبيق مسار Camel يقوم بـ SUBSCRIBE إلى cve-channel دون خيار serializer (لذا يُستخدم
JdkSerializationRedisSerializer الافتراضي). المهاجم هو عميل Redis عادي لا يستطيع سوى PUBLISH إلى تلك
القناة — وليس لديه أي وصول إلى عملية Camel. ينشر البايتات المتسلسلة الخام لكائن com.example.PwnMarker
غير ضار عمدًا، والذي لا يفعل readObject الخاص به سوى قلب راية عامة على مستوى JVM (لا gadget، لا أوامر). على
البناء المتأثر يقوم المستهلك بإلغاء تسلسله ويُنفَّذ readObject؛ وعلى البناء المُصلَح ترفض قائمة السماح
الافتراضية (أنواع java./javax. القياسية وorg.apache.camel.) الكائن com.example.PwnMarker مع
InvalidClassException: filter status: REJECTED.
cd camel-spring-boot
mvn clean package
docker compose up -d --build # starts Redis + the reproducer
curl -s http://localhost:8080/exploit/attack
docker compose down
الناتج المتوقع على البناء المتأثر:
Attacker connects to Redis redis:6379 and PUBLISHes a serialized com.example.PwnMarker to channel 'cve-channel'.
PUBLISH delivered to 1 subscriber(s).
Result:
>>> PROVEN: the Redis consumer deserialized the attacker-published, non-allow-listed class
>>> (com.example.PwnMarker) with no ObjectInputFilter — its readObject executed.
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-spring-redis (camel-spring-redis-starter / camel-quarkus-spring-redis) |
| CWE | CWE-502 (إلغاء تسلسل البيانات غير الموثوقة) |
| الخطورة | عالية |
| ناقل الهجوم | PUBLISH إلى قناة يشترك فيها مستهلك Camel spring-redis (أو التحكم في مفتاح Redis يقرأه المنتج)؛ يُلغي المُسلسِل الافتراضي تسلسل الحمولة دون أي مرشّح |
| التأثير | تنفيذ تعليمات برمجية عن بُعد داخل عملية Camel عبر فئة gadget، قبل تشغيل أي منطق للمسار |
| الإصدارات المتأثرة | من 2.11.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24421 |
| الفضل | Leon Zlobecki |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-78165.html
يتحكم خيار نقطة النهاية الجديد deserializationFilter في المرشّح المطبَّق أثناء قراءة المُسلسِل الافتراضي
للحمولات. عند عدم تعيينه، يُحترم jdk.serialFilter على مستوى JVM إن وُجد، وإلا يُطبَّق
قائمة سماح محافظة (أنواع Java وApache Camel القياسية؛ مع رفض java.net)، وعلى 4.23.0/4.22.1
تُفرض أيضًا حدود شكل الرسم البياني الخاصة بـ JEP-290. يُبنى المُسلسِل عبر مُنشئه القائم على Converter
مع مُحوِّل لإلغاء التسلسل يعيّن المرشّح على التدفق قبل قراءة الرسم البياني. لا يزال تعيين serializer إلى
RedisSerializer مخصص يتجاوز المرشّح، لأن Camel حينها لم يعد يتحكم في كيفية قراءة الحمولة.
عيّن -Djdk.serialFilter=... على مستوى JVM (يحترمه المسار المتأثر)، أو عيّن خيار نقطة النهاية serializer إلى
مُسلسِل غير تابع لـ Java مثل StringRedisSerializer (كخيار serializer، وليس فقط على
redisTemplate مخصص). اشترط المصادقة على Redis وقيّد من يُسمح له بالنشر إلى القنوات المشترك بها.
يُنشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. الحمولة عبارة عن علامة حميدة لا تنفّذ أي تعليمات برمجية. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.