
مدقق دون اتصال لـ 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 الثلاثة، الجواب هو لا.
الإصدار المُصلَح المذكور في الاستشارة الرسمية (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+. بلا أي تبعيات وقت التشغيل، ويمكن إلقاؤه مباشرة في بيئة معزولة (offline).
رموز الخروج: 2 توجد خطوة إصدار لا يمكن الترقية إليها · 1 متأثر لكن يمكن الترقية / لا يمكن الحكم · 0 لم يُعثر على شيء · 3 خطأ في الاستخدام أو المسار
.jar / .warBOOT-INF/lib/، WEB-INF/lib/)META-INF/maven/.../pom.properties) —— يتعرّف عليها حتى لو أُعيدت تسمية jarpom.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، وغالبًا لا يوجد <version> إطلاقًا في pom.xml.
في هذه الحالة تخبرك الأداة بفحص مخرجات البناء (build artifacts)، بدلًا من التظاهر بأنه لم يُعثر على مشكلة.
كذلك، التبعيات ذات scope بقيمة test / provided لا تنتقل إلى المستخدم، ولا تُحتسب ضمن سطح التعرّض؛
والتبعيات المحاطة بتعليقات XML تُجرَّد.
يُصرِّف tools/gen_rules.py ملف RuleTable.java من مصدرين للبيانات الأولية:
GHSA-6g23-24mc-hx6x → النطاقات المتأثرة + الإصدارات الرسمية المُصلحةmaven-metadata.xml من repo1.maven.org → الإصدارات الموجودة فعليًا في المستودع العاممع أربعة تحققات (assertions): عدد النطاقات ≥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 فارغ صالح لا يُعدّ تعذّر قراءة (سجل EOCD بحجم 22 بايت هو ملف zip فارغ حقيقي)، ولن يُفعّل 4 ——
فكثرة التنبيهات الكاذبة تجعل لا أحد ينتبه للتنبيهات الحقيقية.
لمعاني رموز الخروج الأخرى، راجع مستويات التحديد وتعليمات الاستخدام أعلاه.