
ماسح ضوئي CLI دون أي اعتماديات ويعمل دون اتصال بالإنترنت، يكتشف fastjson داخل ملفات JAR وملفات Spring Boot fat-JAR، ويحدد مدى التعرض لـ CVE-2026-16723، ويكتشف الاعتماديات المظللة (shaded dependencies) لبوابات CI.
أمر واحد يكشف ما إذا كان تطبيق Java لديك يحتوي فعلاً على fastjson، وأين يختبئ، وما إذا كان متأثراً بـ CVE-2026-16723.
بدون أي تبعيات · يعمل دون اتصال بالكامل · ملف jar واحد بحجم 23KB · يدعم 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 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 كاستثناء خاص لهذه الثغرة تحديداً.
عنوان الإصدار لا يشير إلى إصلاح أمني: عنوان 1.2.83 ذكر «(إصلاح أمني)»، بينما كتب 1.2.84 فقط
«إصدار النسخة 1.2.84». لكن النص ذكر ذلك —— فهناك قسم كامل بعنوان Security Fixes يسرد أربعة تحسينات
لتقوية AutoType بنداً بنداً، وكان الأمر كذلك منذ يوم الإصدار (2026-07-29) (يمكن التحقق عبر أرشيف Wayback بالمعرّف 20260729094935).
أما سبب عدم متابعة معظم النشرات الأمنية وأدوات الفحص حتى بعد صدور التصحيح، فلم أتمكن من التحقق منه، ولن أخمّن هنا.
📌 تصحيح بتاريخ 2026-08-14: كان مكتوباً هنا سابقاً «لم يُذكر الأمان في النص كاملاً، لذلك لم تتم المتابعة». ثبت بالفحص الفعلي لنص الإصدار وأرشيف Wayback لذلك اليوم أن الشطر الأول خاطئ (العنوان فقط هو ما لم يُشر إليه)، وبالتالي فقد الشطر الثاني أساسه أيضاً، وقد حُذف كليهما.
👉 الأثر الفعلي على مستخدمي 1.x: الترقية إلى 1.2.84 هي أقل الإجراءات تكلفة (إصدار فرعي من نفس الفرع، عادةً دون الحاجة لتعديل الكود)، ولن تُضطر إلى القيام فوراً بترحيل كبير إلى fastjson2. هذه الأداة تقدّم توصيتها على هذا الأساس.
⚠️ الشرط هو JDK 8 أو أحدث (تم التحقق فعلياً في 2026-10-14): جميع الفئات الـ 274 في 1.2.84 هي bytecode من 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. كذلك: الثابتJSON.VERSIONفي 1.2.84 لا يزال"1.2.83"، لذا فإن تحديد الإصدار بناءً عليه سيكون خاطئاً؛ أما هذه الأداة فتقرأpom.properties، فلا تتأثر بذلك.
وأكثر ما يسبب المشقة هو:
fastjson عادةً ما يكون تبعية عابرة —— لا أحد يثبّته طوعاً، بل يأتي مصاحباً لمكتبة أخرى. كثير من الفرق لا يعرفون أصلاً أنهم يستخدمونه.
يمكن لـ mvn dependency:tree سرد التبعيات، لكنه عاجز عن حالتين:
كُتبت هذه الأداة لهاتين الحالتين.
نزّل fastjson-check.jar من Releases، ثم:
# 扫一个 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 الحقيقي في المستودع المحلي.
وبذلك تسلك بالضبط المسار الذي يتقنه هذه الأداة: فحص com/alibaba/fastjson(2)/JSON.class داخل jar الحقيقي،
بدلًا من الثقة بما هو مكتوب في 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 以缓解,但这不是长期方案。
[UNKNOWN] fastjson 版本未知
位置 :myapp.jar!/BOOT-INF/lib/some-sdk-3.1.0.jar
版本来源:未知
场景 :Spring Boot fat-JAR ← CVE-2026-16723 的主要在野利用场景
注意 :疑似被 shade 进宿主 jar(有 class 但无 Maven 元数据),mvn dependency:tree 查不到它
结论 :无法确定 fastjson 版本
汇总:CRITICAL 1 UNKNOWN 1
لاحظ النقطة الثانية — ملف some-sdk-3.1.0.jar قام بتضمين fastjson داخله، ولا يظهر إطلاقًا في شجرة التبعيات.