
CVE-2026-85245 को पुनरुत्पादित करने वाला एक रन करने योग्य Spring Boot प्रूफ-ऑफ-कॉन्सेप्ट, जो camel-thrift क्रॉस-एक्सचेंज डेटा डिस्क्लोज़र है, जिसमें प्रभावित बनाम ठीक किए गए संस्करण की तुलना और शमन नोट्स शामिल हैं।
Apache Camel भेद्यता के लिए चलाने योग्य प्रूफ-ऑफ-कॉन्सेप्ट पुनरुत्पादक, जहाँ Thrift डेटा फ़ॉर्मेट लक्ष्य प्रकार के साझा defaultInstance में अनमार्शल किया गया था, न कि एक नई प्रति में, और उस साझा ऑब्जेक्ट को एक्सचेंज बॉडी के रूप में लौटाया गया। चूँकि इंस्टेंस पूरे प्रोसेस में साझा है, एक संदेश को अनमार्शल करते समय लिखी गई स्थिति ऑब्जेक्ट पर बनी रही और बाद के प्रत्येक संदेश को दिखाई दी जिसने उसी प्रकार का उपयोग किया। बाद के पेलोड में अनुपस्थित फ़ील्ड ने पिछले संदेश के मान बनाए रखे, इसलिए एक प्रेषक की सामग्री दूसरे प्रेषक के संदेश को संसाधित करते समय पढ़ी जा सकती थी, और समवर्ती एक्सचेंज एक-दूसरे की आंशिक रूप से लिखी गई स्थिति को देख सकते थे। ऐसे परिनियोजन में जो एक ही मार्ग के माध्यम से एक से अधिक टेनेंट या उपयोगकर्ताओं को सेवा प्रदान करता है, यह एक पक्ष के डेटा का दूसरे को प्रकटीकरण है।
केवल Spring Boot। कोई
camel-quarkus-thriftएक्सटेंशन नहीं है, इसलिए यह पुनरुत्पादक एक एकल Camel Spring Boot मॉड्यूल प्रदान करता है। (दोष कंपोनेंट केThriftDataFormatमें है, जो रनटाइम-स्वतंत्र है।)
| रनटाइम | निर्देशिका | स्टैक |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-thrift 4.22.0 (प्रभावित; 4.22.1 में ठीक किया गया) |
एक मार्ग एक ThriftDataFormat परिभाषित करता है (जो उत्पन्न Thrift प्रकार Work द्वारा समर्थित है) और इसे प्रत्येक संदेश के लिए पुनः उपयोग करता है, जैसा कि मार्ग सामान्यतः करते हैं। दो टेनेंट इसके माध्यम से एक संदेश भेजते हैं:
Work{num1=1, op=ADD, comment="TENANT-A-SECRET-…"} — वैकल्पिक comment फ़ील्ड संवेदनशील
डेटा रखता है;Work{num1=3, op=SUBTRACT} — कोई comment फ़ील्ड नहीं।मार्ग टेनेंट A के संदेश को अनमार्शल करता है, फिर टेनेंट B के संदेश को।
comment को लेकर वापस आता है — Thrift केवल आने वाले बाइट्स में मौजूद फ़ील्ड असाइन करता है, और दोनों संदेशों को उसी साझा इंस्टेंस में डीसेरियलाइज़ किया गया (और उसी के रूप में लौटाया गया), इसलिए B के अनुपस्थित फ़ील्ड ने A का मान बनाए रखा। दोनों बॉडी वस्तुतः एक ही ऑब्जेक्ट हैं।comment null है — प्रत्येक एक्सचेंज को अपनी स्वयं की साफ़ की गई प्रति मिलती है।cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: B sees A's secret; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85245-thrift-cross-exchange-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: B's comment is null; >>> Not exploited
| गुण | मान |
|---|---|
| घटक | camel-thrift (ThriftDataFormat.unmarshal) |
| CWE | CWE-488 (गलत सत्र को डेटा तत्व का एक्सपोज़र) |
| गंभीरता | मध्यम |
| आक्रमण वेक्टर | एक ही रूट के माध्यम से एक ही Thrift प्रकार के दो संदेश; बाद का संदेश जो किसी फ़ील्ड को छोड़ देता है, वह पहले वाले का मान विरासत में ले लेता है |
| प्रभाव | क्रॉस-एक्सचेंज / क्रॉस-टेनेंट डेटा प्रकटीकरण; समवर्ती एक्सचेंज एक-दूसरे की आंशिक रूप से लिखी गई स्थिति को देख सकते हैं |
| प्रभावित संस्करण | 4.0.0 से 4.18.5 से पहले तक, 4.19.0 से 4.22.1 से पहले तक |
| ठीक किए गए संस्करण | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24442 |
| श्रेय | Claude Security Scan Tool |
सलाह: https://camel.apache.org/security/CVE-2026-85245.html
उत्पन्न Thrift प्रकार (Work, Operation) Apache Camel के अपने camel-thrift परीक्षणों से सार्वजनिक परीक्षण फ़िक्स्चर हैं।
ThriftDataFormat.unmarshal अब प्रति-एक्सचेंज प्रति में डीसेरियलाइज़ करता है:
TBase instance = defaultInstance.deepCopy(); instance.clear(); — फिर बाइट्स को instance में डीसेरियलाइज़ करता है और
उसे लौटाता है। प्रत्येक एक्सचेंज को अपना स्वयं का साफ़ किया गया ऑब्जेक्ट मिलता है, इसलिए संदेशों के बीच कोई फ़ील्ड नहीं जाती और कोई भी दो एक्सचेंज एक ही बॉडी साझा नहीं करते।
डेटा फ़ॉर्मेट चलने के तुरंत बाद अनमार्शल किए गए बॉडी को एक नई प्रति में कॉपी करें, और लौटाए गए ऑब्जेक्ट के संदर्भ न रखें।
यह रिपॉज़िटरी शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रकाशित की गई है: Apache Camel उपयोगकर्ताओं को भेद्यता को समझने, यह सत्यापित करने में मदद करने के लिए कि क्या वे प्रभावित हैं, और पुष्टि करने के लिए कि अपग्रेड करने से यह हल हो जाता है। "secret" एक निष्क्रिय, मनगढ़ंत मार्कर स्ट्रिंग है। इस सामग्री का उपयोग उन सिस्टमों के विरुद्ध न करें जिनके आप स्वामी या संचालक नहीं हैं।