
Spring Cloud Config CVE-2026-40982 के लिए ऑफ़लाइन जाँचकर्ता — बताता है कि आपकी संस्करण पंक्ति में OSS फिक्स है भी या नहीं (3.1.x/4.1.x/4.2.x: इसमें नहीं है)
Spring Cloud Config CVE-2026-40982 离线排查工具 —— 零依赖、单 jar、不联网。
它回答的不是「我受不受影响」,而是那个更难受的问题:
我这条版本线,在 Maven Central 上到底有没有能升的安全版?
对 3.1.x / 4.1.x / 4.2.x 三条线,答案是 没有。
आधिकारिक advisory(spring.io/security/cve-2026-40982) द्वारा दिया गया फ़िक्स्ड संस्करण:
| संस्करण श्रृंखला | आधिकारिक फ़िक्स्ड संस्करण | उपलब्धता | Maven Central पर उस श्रृंखला का उच्चतम संस्करण | क्या आप अपग्रेड कर सकते हैं |
|---|---|---|---|---|
| 3.1.x | 3.1.14 | Enterprise Support Only | 3.1.10 | ❌ |
| 4.1.x | 4.1.10 | Enterprise Support Only | 4.1.7 | ❌ |
| 4.2.x | 4.2.7 | Enterprise Support Only | 4.2.4 | ❌ |
| 4.3.x | 4.3.3 | OSS | 4.3.4 | ✅ |
| 5.0.x | 5.0.3 | OSS | 5.0.4 | ✅ |
那三个修复版本不在公开仓库里。任何人都能验证:
curl -sI https://repo1.maven.org/maven2/org/springframework/cloud/spring-cloud-config-server/4.2.7/
# HTTP/1.1 404 Not Found
और स्वचालित टूल आपको यह नहीं बताएंगे — GitHub advisory के संरचित डेटा में,
इन तीनों लाइनों का first_patched_version बिल्कुल null है:
{"range": "<= 3.1.13", "first_patched_version": null}
{"range": ">= 4.1.0, <= 4.1.9", "first_patched_version": null}
{"range": ">= 4.2.0, <= 4.2.6", "first_patched_version": null}
{"range": ">= 4.3.0, <= 4.3.2", "first_patched_version": "4.3.3"}
{"range": ">= 5.0.0, <= 5.0.2", "first_patched_version": "5.0.3"}
Dependabot / OSV ठीक इसी डेटा का उपभोग करते हैं। यदि कोई अपग्रेड लक्ष्य नहीं है, तो अपग्रेड सुझाव नहीं दिया जा सकता।
java -jar scc-check.jar <目录或 jar/war 路径>
# 中文乱码时(Windows 控制台代码页与 Java 判断常常对不上):
java -jar scc-check.jar target/ --utf8
Java 17+ आवश्यक है। रनटाइम पर शून्य निर्भरताएँ, सीधे ऑफ़लाइन वातावरण में डाला जा सकता है।
एग्ज़िट कोड: 2 वर्ज़न लाइन अपग्रेड नहीं हो सकती · 1 प्रभावित लेकिन अपग्रेड संभव / निर्धारित नहीं कर सकता · 0 नहीं मिला · 3 उपयोग या पथ त्रुटि
.jar / .war फ़ाइल नामBOOT-INF/lib/, WEB-INF/lib/)META-INF/maven/.../pom.properties) — jar का नाम बदला गया हो तो भी पहचान लेता हैpom.xml1. क्लाइंट को प्रभावित नहीं मानता।
यह CVE केवल सर्वर-साइड spring-cloud-config-server को प्रभावित करता है। जो प्रोजेक्ट spring-cloud-starter-config
(क्लाइंट) को शामिल करते हैं, वे प्रभावित नहीं हैं, टूल आपको स्पष्ट रूप से बताएगा, बजाय आपको व्यर्थ घबराने के।
2. 4.0.x पर निर्णय नहीं देता।
आधिकारिक advisory का कोई भी रेंज 4.0.x को कवर नहीं करता (4.0.0 > 3.1.13, निचली सीमा रहित वाली में नहीं आता)।
टूल केवल "आधिकारिक कवरेज सीमा से बाहर" रिपोर्ट करता है, CRITICAL रिपोर्ट नहीं करता — अनुमान लगाकर निर्णय तालिका भरने से लोग गलत निर्णय ले सकते हैं।
3. वर्ज़न पढ़ न पाने पर स्पष्ट रूप से "निर्धारित नहीं कर सकता" कहता है, कभी भी सुरक्षित नहीं मानता।
Spring Cloud release train से वर्ज़न को एकीकृत रूप से प्रबंधित करता है, pom.xml में अक्सर <version> बिल्कुल नहीं होता।
ऐसी स्थिति में टूल आपको बिल्ड आर्टिफ़ैक्ट स्कैन करने के लिए कहेगा, बजाय यह दिखावा करने के कि कोई समस्या नहीं मिली।
इसी तरह, scope जिनका test / provided है, वे निर्भरताएँ उपयोगकर्ता तक पारित नहीं होतीं, एक्सपोज़र सतह में नहीं गिनी जातीं;
XML टिप्पणियों में लिपटी निर्भरताएँ हटा दी जाती हैं।
tools/gen_rules.py दो प्राथमिक डेटा स्रोतों से RuleTable.java संकलित करता है:
GHSA-6g23-24mc-hx6x → प्रभावित रेंज + आधिकारिक फ़िक्स्ड वर्ज़नrepo1.maven.org का maven-metadata.xml → सार्वजनिक रिपॉज़िटरी में वास्तव में मौजूद वर्ज़नऔर चार एसेर्शन लाता है: रेंज संख्या ≥5, first_patched=null वाले ≥3, वर्ज़न लाइन ≥5, ENTERPRISE_ONLY के रूप में निर्धारित ≥3। कोई भी एक संतुष्ट न हो तो सीधे रोक दिया जाता है, फ़ाइल जनरेट नहीं होती —
अन्यथा पार्सिंग विफल होते ही एक खाली तालिका उत्पन्न हो जाएगी, और यूनिट टेस्ट खाली तालिका के सामने फिर भी सभी हरे दिखेंगे।
python tools/gen_rules.py # 重新生成判定表
mvn test # 31 个测试
यह टूल केवल संस्करण तुलना करता है, यह जाँच नहीं करता कि आपका Config Server वास्तव में सार्वजनिक इंटरनेट पर उजागर है या नहीं, WAF है या नहीं, या किसी अन्य तरीके से पहले ही शमन किया गया है या नहीं। निर्णय परिणाम जाँच का प्रारंभिक बिंदु है, सुरक्षा निष्कर्ष नहीं। आधिकारिक advisory ही मानक है।
MIT
यह टूल इस प्रश्न का उत्तर देता है कि "क्या मैं प्रभावित हूँ"। निम्नलिखित बातों का यह उत्तर नहीं दे सकता, इनके लिए आप मुझसे संपर्क कर सकते हैं:
📮 [email protected] —— स्थिति स्पष्ट करें, मैं 24 घंटे के भीतर आपको एक पृष्ठ का लिखित उत्तर दूँगा: हो सकता है या नहीं, कठिनाई कहाँ है, लगभग कितना समय लगेगा। यह चरण निःशुल्क है, और आपको पहले से किसी प्रतिबद्धता की आवश्यकता नहीं है।
| कोड | अर्थ |
|---|---|
0 | स्कैन पूरा हुआ, और प्रत्येक फ़ाइल वास्तव में पढ़ी गई, कोई ऐसी खोज नहीं जिस पर आपको कार्रवाई करनी हो |
4 | कोई फ़ाइल पढ़ी नहीं जा सकी —— zip नहीं है, सामग्री कटी हुई है, या पढ़ने में विफलता |
🔴 4 को 2026-09-09 को जोड़ा गया था, और इसे जोड़ने का कारण स्पष्ट रूप से बताना उचित है।
इससे पहले, अपठनीय फ़ाइलें आउटपुट में केवल एक पंक्ति का संकेत छोड़ती थीं, और एक्ज़िट कोड पहले की तरह 0 ही रहता था ——
निशान मनुष्यों के देखने के लिए होता है, CI और स्क्रिप्ट एक्ज़िट कोड देखते हैं, इसलिए "मैं इसे पढ़ नहीं सका" स्वचालन में "पास" के बराबर हो गया।
एक भ्रष्ट, एन्क्रिप्टेड या अधूरी डाउनलोड हुई jar चुपचाप "कोई समस्या नहीं मिली" में बदल जाती है।
"मैं इसे पढ़ नहीं सकता" और "आप सुरक्षित हैं" दो अलग वाक्य होने चाहिए।
⚠️ वैध खाली jar अपठनीय नहीं मानी जाती (22 बाइट का EOCD रिकॉर्ड एक वास्तविक खाली zip है), यह 4 ट्रिगर नहीं करेगी ——
झूठे अलर्ट अधिक होंगे तो असली अलर्ट को कोई नहीं देखेगा।
शेष एक्ज़िट कोड के अर्थ के लिए ऊपर दिए गए विभिन्न निर्णय स्तरों और उपयोग निर्देशों को देखें।