
CVE पुनरुत्पादन: cve-2026-34486-tomcat_encrypt_bypass_reproduction
| फ़ील्ड | मान |
|---|---|
| CVE | CVE-2026-34486 |
| CVSS | 7.5 उच्च |
| प्रकार | संवेदनशील डेटा की अनुपस्थित एन्क्रिप्शन |
| घटक | Apache Tomcat क्लस्टर EncryptInterceptor |
| प्रकाशित | 2026 |
CVE-2026-34486 एक रीग्रेशन है जो CVE-2026-29146 के अधूरे सुधार द्वारा पेश किया गया है। Apache Tomcat की क्लस्टर प्रतिकृति में, EncryptInterceptor क्लस्टर संदेशों को एन्क्रिप्ट और प्रमाणित करने के लिए ज़िम्मेदार है। CVE-2026-29146 के सुधार में एक रीफैक्टरिंग ने अनजाने में super.messageReceived(msg) कॉल को उस try-catch ब्लॉक के बाहर स्थानांतरित कर दिया जो डिक्रिप्शन विफलताओं को संभालता है। परिणामस्वरूप, जब किसी संदेश का डिक्रिप्शन विफल हो जाता है (अर्थात, यह प्लेनटेक्स्ट में प्राप्त होता है लेकिन इंटरसेप्टर एन्क्रिप्टेड डेटा की अपेक्षा करता है), तो कच्चा अनएन्क्रिप्टेड संदेश हैंडलर श्रृंखला के ऊपर भेज दिया जाता है, न कि त्याग दिया जाता है।
EncryptInterceptor.messageReceived() विधि तब लागू होती है जब एक क्लस्टर संदेश आता है। अपेक्षित प्रवाह है:
super.messageReceived(msg) को कॉल करेंकमजोर संस्करणों में, डिक्रिप्शन/सत्यापन तर्क try-catch में लिपटा रहता है, लेकिन कॉल श्रृंखला को पुनर्गठित किया गया था ताकि super.messageReceived(msg) try-catch ब्लॉक के बाहर निष्पादित हो जो डिक्रिप्शन की सुरक्षा करता है। चर msg try-catch से पहले घोषित किया जाता है और उसके अंदर निर्दिष्ट किया जाता है। जब डिक्रिप्शन एक अपवाद फेंकता है, तो msg अपना प्रारंभिक (अनएन्क्रिप्टेड/कच्चा) मान बनाए रखता है, और catch ब्लॉक केवल त्रुटि लॉग करता है — यह जल्दी वापस नहीं लौटता। निष्पादन असंसाधित कच्चे डेटा के साथ super.messageReceived(msg) तक जारी रहता है।
इसका मतलब है कि एक हमलावर जो Tomcat क्लस्टर पोर्ट तक पहुंच सकता है, वह मनमाना अनएन्क्रिप्टेड संदेश इंजेक्ट कर सकता है जिसे इंटरसेप्टर स्वीकार और संसाधित करेगा।
public void messageReceived(Message msg) {
// msg arrives raw
try {
// decrypt and populate msg fields
decrypt(msg);
} catch (Exception e) {
log.error("Decryption failed", e);
// BUG: no return statement here
}
// msg is still the original unencrypted object when catch is hit
super.messageReceived(msg); // outside try-catch → passes raw data
}
सुधार यह सुनिश्चित करना चाहिए कि या तो:
super.messageReceived(msg) को केवल try ब्लॉक के अंदर सफल डिक्रिप्शन के बाद कॉल किया जाए, या| उत्पाद | संस्करण |
|---|---|
| Apache Tomcat 11 | 11.0.20 |
| Apache Tomcat 10 | 10.1.53 |
| Apache Tomcat 9 | 9.0.116 |
EncryptInterceptor का उपयोग करके क्लस्टर प्रतिकृति सक्षम वाला एक कमजोर Tomcat इंस्टेंस<Receiver> के माध्यम से कॉन्फ़िगर किया गया) तक नेटवर्क पहुंचserver.xml में EncryptInterceptor के साथ कॉन्फ़िगर किए गए Tomcat क्लस्टर सदस्य की पहचान करें।इस निर्देशिका में exploit.py स्क्रिप्ट बाईपास को प्रदर्शित करती है। यह एक न्यूनतम Tomcat क्लस्टर संदेश (ClusterMessage सीरियलाइज़ेशन प्रारूप पर आधारित) बनाता है और उसे बिना किसी एन्क्रिप्शन के सीधे रिसीवर पोर्ट पर भेजता है। एक कमजोर इंटरसेप्टर एन्क्रिप्शन की कमी के बावजूद संदेश को स्वीकार और आगे भेज देगा।
Apache Tomcat के पैच किए गए संस्करण में अपग्रेड करें:
| उत्पाद | पैच किया गया संस्करण |
|---|---|
| Apache Tomcat 11 | 11.0.21+ |
| Apache Tomcat 10 | 10.1.54+ |
| Apache Tomcat 9 | 9.0.117+ |
यदि तुरंत अपग्रेड करना संभव नहीं है, तो Tomcat क्लस्टर पोर्ट तक नेटवर्क पहुंच को केवल विश्वसनीय होस्ट तक सीमित करें (उदाहरण के लिए, फ़ायरवॉल नियमों के माध्यम से या रिसीवर को लूपबैक या निजी इंटरफ़ेस से बांधकर)।