
शून्य-निर्भरता वाला, ऑफ़लाइन CLI स्कैनर जो JARs और Spring Boot fat-JARs के अंदर fastjson खोजता है, CVE-2026-16723 जोखिम को चिह्नित करता है, और CI गेटिंग के लिए shaded dependencies का पता लगाता है।
एक ही कमांड से पता लगाएं कि आपके Java एप्लिकेशन में fastjson है या नहीं, कहाँ छिपा है, और क्या यह CVE-2026-16723 से प्रभावित है।
शून्य निर्भरता · पूर्णतः ऑफ़लाइन · एकल 23KB की jar · Java 8+ समर्थित
21 जुलाई 2026 को fastjson ने आधिकारिक रूप से CVE-2026-16723 (CVSS 9.0, रिमोट कोड एक्ज़ीक्यूशन) की घोषणा की:
बड़ी संख्या में सुरक्षा सूचनाएँ (कई अंग्रेज़ी सुरक्षा मीडिया सहित) आज भी कहती हैं कि "1.x EOL हो चुका है, कभी भी पैच नहीं आएगा, केवल fastjson2 पर माइग्रेट करें"। यह कथन 2026-07-29 से मान्य नहीं है। आप स्वयं सत्यापित कर सकते हैं:
| प्रमाण | लिंक |
|---|---|
Maven केंद्रीय रिपॉज़िटरी में com.alibaba:fastjson:1.2.84 उपलब्ध है, jar 2026-07-29 को अपलोड किया गया | repo1 |
GitHub release 1.2.84, 2026-07-29T08:24:51Z को प्रकाशित | release |
मुख्य कमिट fix: strengthen autoType type name validation and whitelist verification | 2026-07-29T07:02:55Z |
1.2.83 मई 2022 में जारी हुआ था, उसके बाद 1.x शाखा में चार वर्षों तक कोई कमिट नहीं —— 1.2.84 इस कमज़ोरी के लिए विशेष रूप से अपवाद स्वरूप जारी किया गया है।
इसके release शीर्षक में सुरक्षा सुधार का उल्लेख नहीं है: 1.2.83 के शीर्षक में "(सुरक्षा सुधार)" लिखा था, जबकि 1.2.84 में केवल
"1.2.84版本发布" लिखा है। लेकिन मुख्य भाग में लिखा गया है —— एक पूरा Security Fixes अनुभाग है, जिसमें चार AutoType
सुदृढ़ीकरण बिंदुओं को क्रमबद्ध रूप से सूचीबद्ध किया गया है, और यह जारी होने के पहले दिन (2026-07-29) से ही ऐसा है (Wayback संग्रह 20260729094935 में देखा जा सकता है)।
जहाँ तक पैच जारी होने के बाद भी अधिकांश सुरक्षा सूचनाओं और स्कैनरों द्वारा अनुसरण क्यों नहीं किया गया, इसका मैंने पता नहीं लगाया, यहाँ कोई अनुमान नहीं लगा रहा हूँ।
📌 2026-08-14 सुधार: यहाँ पहले लिखा था "पूरे पाठ में सुरक्षा का उल्लेख नहीं, इसलिए अनुसरण नहीं किया गया"। पहला आधा भाग release के मुख्य पाठ और Wayback के उसी दिन के संग्रह से परीक्षण करने पर गलत पाया गया (केवल शीर्षक में उल्लेख नहीं था), दूसरा आधा भाग इस कारण अपना आधार खो देता है, इसे भी हटा दिया गया है।
👉 1.x उपयोगकर्ताओं पर वास्तविक प्रभाव: 1.2.84 पर अपग्रेड करना सबसे कम लागत वाला उपाय है (उसी शाखा का लघु संस्करण, सामान्यतः कोड बदलने की आवश्यकता नहीं), तुरंत fastjson2 के बड़े संस्करण माइग्रेशन के लिए बाध्य होने की आवश्यकता नहीं। यह टूल इसी के अनुसार सुझाव देता है।
⚠️ पूर्व शर्त JDK 8 या उससे ऊपर है (2026-10-14 परीक्षण): 1.2.84 के 274 class सभी Java 8 बाइटकोड (major 52) हैं, 1.2.83 Java 5 (major 49) है। JDK 7 (Zulu 7u352) पर
javacकेवल चेतावनी देता है, निकास कोड 0, रनटाइम पर सीधेUnsupportedClassVersionError: com/alibaba/fastjson/JSON : Unsupported major.minor version 52.0फेंकता है। अन्य: 1.2.84 मेंJSON.VERSIONस्थिरांक अभी भी"1.2.83"है, इससे संस्करण जाँचने पर गलत परिणाम मिलेगा; यह टूलpom.propertiesपढ़ता है, इससे प्रभावित नहीं होता।
और सबसे मुश्किल बात यह है:
fastjson सामान्यतः एक ट्रांज़िटिव निर्भरता होती है —— कोई इसे सक्रिय रूप से इंस्टॉल नहीं करता, यह किसी अन्य लाइब्रेरी के साथ आ जाती है। कई टीमों को पता ही नहीं होता कि वे इसे उपयोग कर रहे हैं।
mvn dependency:tree निर्भरताएँ सूचीबद्ध कर सकता है, लेकिन दो स्थितियों में असमर्थ है:
यह टूल इन्हीं दो स्थितियों के लिए लिखा गया है।
Releases से fastjson-check.jar डाउनलोड करें, फिर:
# 扫一个 jar(Spring Boot fat-JAR 会自动逐层展开)
java -jar fastjson-check.jar ./myapp.jar
# 扫一整个目录(递归查找所有 jar/war)
java -jar fastjson-check.jar /opt/apps
# 输出 JSON,接入流水线
java -jar fastjson-check.jar /opt/apps --json
इंस्टॉल करने की आवश्यकता नहीं, खाते की आवश्यकता नहीं, इंटरनेट की आवश्यकता नहीं, कोई डेटा अपलोड नहीं।
एक ही आर्टिफ़ैक्ट CLI और Maven प्लगइन दोनों है। इस उपयोग में पहले jar डाउनलोड करने की आवश्यकता नहीं है:
# 在你的项目目录下直接跑,扫的是 Maven 解析后的依赖
mvn io.github.xiaoqimikko:fastjson-check:0.3.1:check
या बिल्ड जीवनचक्र में बाँधें (verify चरण):
<plugin>
<groupId>io.github.xiaoqimikko</groupId>
<artifactId>fastjson-check</artifactId>
<version>0.3.1</version>
<executions>
<execution>
<goals><goal>check</goal></goals>
</execution>
</executions>
</plugin>
pom.xml स्कैन करने देने से अधिक सटीक क्यों हैजब CLI pom.xml स्कैन करता है तो जो पढ़ा जाता है वह टेक्स्ट होता है, जबकि वास्तविक प्रोजेक्ट में fastjson का संस्करण अक्सर उस टेक्स्ट में नहीं होता:
<version>${fastjson.version}</version><parent> से विरासत में मिला, आपके अपने pom में यह पंक्ति नहीं हैप्लगइन को Maven द्वारा रिज़ॉल्व होने के बाद की डिपेंडेंसी सेट मिलती है, प्रत्येक डिपेंडेंसी के साथ लोकल रिपॉज़िटरी में वास्तविक jar पथ होता है।
इसलिए यह ठीक उसी रास्ते पर चलता है जिसमें यह टूल सबसे माहिर है: वास्तविक jar के अंदर com/alibaba/fastjson(2)/JSON.class स्कैन करना,
न कि pom में लिखी बातों पर भरोसा करना।
⚠️ लेकिन पहचान की सीमा इसमें नहीं बदली: निर्धारण कुंजी अभी भी वही class पथ है, इसलिए relocate / पैकेज नाम बदलकर पुनः पैकेज की गई डिपेंडेंसी अभी भी पहचानी नहीं जा सकती (नीचे "यह क्या नहीं है" देखें)। प्लगइन "संस्करण कहाँ लिखा है" का समाधान करता है, "पैकेज नाम बदल दिया गया" का नहीं।
| पैरामीटर | डिफ़ॉल्ट | विवरण |
|---|---|---|
-Dfastjson-check.failOnFound | false | CRITICAL / HIGH मिलने पर बिल्ड विफल करें |
-Dfastjson-check.path | सेट नहीं | डिपेंडेंसी ट्री स्कैन न करें, इसके बजाय इस पथ को स्कैन करें (डायरेक्टरी / jar / war / fat-jar) |
-Dfastjson-check.skip | false | निष्पादन छोड़ें |
🔴 डिफ़ॉल्ट रूप से बिल्ड विफल नहीं होने देना जानबूझकर है, यह CLI के एक्ज़िट कोड अर्थशास्त्र से भिन्न है:
कमांड लाइन आप स्वयं टाइप करते हैं, एक्ज़िट कोड 1 वही है जो आप चाहते हैं; जबकि प्लगइन पाइपलाइन पर लगा होता है,
एक स्व-जाँच टूल को आपकी बिना तैयारी के बिल्ड को लाल नहीं करना चाहिए। CI गेट के रूप में उपयोग करने के लिए, स्पष्ट रूप से
-Dfastjson-check.failOnFound=true जोड़ें।
💡 Windows पर यदि रिपोर्ट में अक्षर बिगड़े हुए (गड़बड़) दिखें, तो कंसोल को वापस GBK पर स्विच करें (
chcp 936)—— प्लगइन मोड का आउटपुट एन्कोडिंग Maven द्वारा निर्धारित होता है, CLI के--utf8/--gbkस्विच यहाँ काम नहीं आते।
fastjson-check 0.1.0 —— fastjson 应急排查(离线,不外传任何数据)
扫描目标:myapp.jar
已展开归档:3 个
发现 2 处 fastjson:
[CRITICAL] fastjson 1.2.83
位置 :myapp.jar!/BOOT-INF/lib/fastjson-1.2.83.jar
版本来源:pom.properties
场景 :Spring Boot fat-JAR ← CVE-2026-16723 的主要在野利用场景
结论 :命中 CVE-2026-16723(CVSS 9.0 远程代码执行),默认配置即可利用
处置 :1.x 已停止维护,不会有修复版本。应急处置二选一:①(推荐)迁移至
fastjson2 2.0.63 或更高版本;② 无法立即迁移时,先启用 SafeMode
彻底关闭 AutoType 以缓解,但这不是长期方案。