تقرير GCSA: الثغرة Fast 1.2.83 تسمح بتنفيذ كود عن بُعد دون الحاجة إلى جادجت

iconMetaEra
مشاركة
AI summary iconملخص
التحالف العالمي للأمن السيبراني (GCSA)، بالتعاون مع MetaEra، نشر تقريرًا عن ثغرة حرجة في Fast 1.2.83 تسمح بتنفيذ كود عن بُعد دون سلاسل أدوات. تعمل هذه الثغرة حتى عند تعطيل AutoType، وقد تم اختبارها في JDK 8/17/21/25 وSpring Boot Loader. يمكن للمهاجمين استغلال استكشاف بيانات الفئة لتحميل كود ضار. وحث التقرير المستخدمين على الترقية إلى Fast 2.x وتمكين SafeMode. تتماشى النتائج مع جهود CFT لتأمين البنية التحتية. يُنصح المطورون بالتحرك بسرعة للامتثال لـ MiCA ومعايير تنظيمية أخرى.
يُمكن تفعيل تنفيذ رموز عن بُعد دون استخدام أدوات تقليدية في Fastjson 1.2.83 حتى مع تفعيل AutoType=false، وقد تم إعادة إنتاجه في بيئة معزولة JDK 8/17/21/25 + Spring Boot Loader.

كاتب المقال، المصدر: GCSA

ملخص

في نظام الدفاع ضد ثغرات التسلسل العكسي في Java التقليدية، يسود في الصناعة فهم خاطئ متمثل في: "إيقاف AutoType افتراضيًا يجعله آمنًا" و"تحديد المعلمة الثانية لـ parseObject (النوع الهدف العلوي) يجعله آمنًا" و"إزالة تبعيات Gadget التسلسل العكسي من Classpath المحلي يجعله آمنًا". ومع ذلك، فقد دمرت التطورات الحديثة في الهجوم والدفاع هذه الأوهام تمامًا.

أصدر تحالف الأمن السيبراني العالمي (GCSA) اليوم تقريرًا حصريًا للرؤى التقنية. يحلل التقرير بعمق السبب الجذري الكامن وراء تنفيذ التعليمات البرمجية عن بُعد (RCE) دون الاعتماد على Gadget تقليدي، حتى في حالة تفعيل AutoType=false في Fastjson 1.2.83. وقد تم إعادة إنتاج تقنية الاستغلال هذه بنجاح في بيئات معزولة تشمل JDK 8 / 17 / 21 / 25 و Spring Boot Loader. هذه الثغرة ليست "تجاوز القائمة السوداء للعثور على Gadget محلي" تقليديًا، بل تقوم بتحويل منطق استكشاف بيانات الفئة الخاص بـ Fastjson مباشرة إلى قناة للحصول على فئة خبيثة عن بُعد والتصريح بها. إليكم النص الكامل

الجهة الناشرة: GCSA Alliance العالمية للأمن السيبراني

نوع التقرير: رؤى تقنية حصرية / تقرير تحليل عميق للثغرات

تاريخ التقرير: 2026-07-21

حالة التقرير: تم إكمال مراجعة الشفرة المصدرية ومحاكاة البيئة المعزولة

رقم الثغرة: رقم البحث الداخلي FJ-GETRESOURCE-RCE (لا يتوافق مع CVE مُعلَن عنه)

يُمكن تفعيل تنفيذ رموز عن بُعد دون استخدام أدوات تقليدية في Fastjson 1.2.83 حتى عند تفعيل AutoType=false، وقد تم إعادة إنتاج ذلك في بيئة معزولة من JDK 8/17/21/25 + Spring Boot Loader. يُوصى بتمكين SafeMode فورًا والانتقال إلى Fastjson 2.x.

1. ملخص تنفيذي

يقوم ParserConfig.checkAutoType في Fastjson 1.2.83 بتحويل قيمة @type الخاضعة لسيطرة المستخدم إلى اسم مورد فئة، ثم يمررها إلى getResourceAsStream لـ ClassLoader الحالي:

في بيئة ClassLoader لـ fat-jar قادرة على تحليل أسماء موارد URLs مطلقة، يمكن للمهاجم استخدام نقطة بديلة لبناء URLs من نوع http: و jar:http: و jar:file: لتنزيل class ضار يحتوي على @JSONType من طرف الهجوم. بعد اكتشاف Fastjson لهذا التعليق، تقوم باستدعاء loadClass وتعيد الـ class مباشرة قبل إجراء فحص الفئات الأساسية الخطرة وفحص التوافق مع النوع المستهدف. عند تهيئة وتهيئة الـ class، يمكن تنفيذ أي كود.

لا يعتمد هذا الاستغلال على أدوات سلسلة التفكيك التقليدية المتوفرة مسبقًا في classpath الهدف، ويمكن تفعيله حتى في الحالة الافتراضية حيث Fastjson AutoType=false. لا يمكن منع التنفيذ عن طريق تثبيت نوع الهدف لـ JSON.parseObject؛ يمكن لتمكين SafeMode منع مسار الاستغلال الطبيعي قبل الوصول إلى الموارد.

تم إعادة إنتاج هذا التقرير باستخدام نفس حمولة JSON داخل حاوية لينكس معزولة:

2. تقييم الثغرة

لا يُوصى بتحديد CVSS 9.8 موحد بناءً على إصدار المكون فقط: إن AppClassLoader العادي هو ضابط سلبي، وسلسلة JDK الحديثة الكاملة تعتمد أيضًا على مشغّل يمكنه تحليل عنوانين مطلقين لملف JAR و/proc/self/fd. في البيئات الإيجابية المذكورة في هذا التقرير، يكون تأثير الثغرة هو تنفيذ عن بُعد بدون مصادقة عبر الشبكة.

3. نطاق التأثير والشروط المسبقة

تم التأكيد على النطاق 3.1

  • تأكيد التشغيل: Fastjson 1.2.83
  • تم التأكيد على JDK: 8، 17، 21، 25
  • تم التحقق من نظام التشغيل: Linux؛ تم تكرار JDK 17/21/25 أيضًا على macOS باستخدام /dev/fd
  • تأكيد المُحمّل: Spring Boot 2.7.18 مُحمّل كلاسيكي + JDK 8؛ مُحمّل Spring Boot 3.2.0 + JDK 17/21/25
  • تأكيد API: JSON.parse و JSON.parseObject مع أنواع علوية ثابتة

3.2 Version Range Description

يُعد النطاق المعروف من 1.2.68 إلى 1.2.83 أكثر ملاءمة كنطاق اختبار معروف بدلاً من إصدار إدخال الثغرة. تشير مراجعة الشيفرة المصدرية إلى أن كود اكتشاف الموارد الفئوي الحاسم موجود بالفعل في الإصدارين 1.2.67 و1.2.68. تم إكمال التحقق الكامل عبر بيئة تشغيل JDK في هذا التقرير فقط للإصدار 1.2.83.

3.3 استخدام الشروط المطلوبة

1. يمكن للمهاجم التحكم في JSON المُرسَل إلى Fastjson، وسيتم تحليل @type في الإدخال.

2. SafeMode غير مُفعّل.

3. يمكن لـ ClassLoader الخاص بـ Fastjson تحليل اسم المورد المطلق المُنشأ إلى URL.

4. يمكن للعملية المتضررة الاتصال بخدمة HTTP الخاصة بالمهاجم.

5. تتطلب أنظمة Linux الحديثة قابلية قراءة /proc/self/fd، ويمكن للـ loader تحليله

jar:file:/proc/self/fd/N!...。

يجب أن يكون JDK قادرًا على إنشاء ذاكرة مؤقتة JAR عن بُعد طبيعية؛ وهذا عادةً يعني أن دليل المؤقتات الخاص بـ JVM قابل للكتابة.

المهاجمون لا يحتاجون:

  • كتابة ملف إلى classpath الهدف
  • تم تثبيت مسبقًا فئات الـ gadget مثل TemplatesImpl و JNDI و C3P0 و Commons Collections في مسار الفئة المستهدف
  • تمكين Fastjson AutoType
  • التحكم في المعلمة الثانية لـ JSON.parseObject

4. تحليل السبب الجذري

4.1 يُعامل اسم نوع المستخدم كرابط URL للمورد

موقع الكود المصدري:

الكود الأساسي:

يفترض هذا المنطق أن resource هو مسار classpath عادي، لكنه لا يقيد بروتوكوله أو دلالات المسار المطلق أو مصادره. بالنسبة لـ fat-jar loader معين، ستتحول المدخلات التالية إلى عنوان URL مطلق بعد الاستبدال:

لذلك، فإن getResourceAsStream يحمّل موارد شبكة قابلة للتحكم من قبل المهاجم بسبب تجاوز الاستعلام من البيانات الميتا المحلية.

4.2 يُستخدم @JSONType في الفئة البعيدة كأساس للصلاحية

يستخدم Fastjson قارئ ClassReader الخاص به لتحليل محتوى الموارد:

يحتاج مهاجم الطرف إلى جعل الفئة البعيدة تحتوي على ملاحظة @JSONType من Fastjson لتعيين jsonType على true. هنا يتم التحقق من البايتات المقدمة من المهاجم، وليس من فئة تم تحميلها مسبقًا من مسار فئة موثوق.

4.3 jsonType يُحفّز تحميل الفئة الفعلية

موقع الكود المصدري:

يحاول TypeUtils.loadClass بشكل متسلسل المُحمِّل الصريح، ومُحمِّل سياق الخيط، وClass.forName. في البيئة الإيجابية، يقوم مُحمِّل سياق الخيط بتحليل اسم المورد المطلق نفسه مرة أخرى، وتنزيل الفئة وتنفيذ defineClass.

4.4 @JSONType العودة المبكرة تتجاوز الفحوصات الأمنية اللاحقة

موقع الكود المصدري:

  • لن يتم تنفيذ فحص الفئة الأساسية الخطرة
  • لن يتم تنفيذ expectClass.isAssignableFrom(clazz)
  • لا يمكن منع التنفيذ قبل تهيئة الفئة باستخدام نوع ربط البيانات الثابت

4.5 فشل تكوين قناة ناعمة بعد لاحقة الاستثناء/الخطأ

موقع الكود المصدري:

4.6 موقع SafeMode

يتم فحص SafeMode قبل الوصول إلى المورد:

5. شرح التسلسل السلاسل

5.1 JDK 8: تحميل مباشر للـ class عن بُعد

الصيغة الأقصر:

سيقوم JDK 17+ أيضًا بإكمال طلبات الشبكة، لكنه يرفض أقسام المسار الفارغة في الأسماء الداخلية،

5.2 الإصدار الحديث لـ JDK المرحلة الأولى: تنزيل ملف JAR عن بُعد

العنصر الأول للمصفوفة في الحمولة الواحدة:

يرفض JDK 17+ لاحقًا الاسم الداخلي للـ jar: http://... في المرحلة الأولى، لكن Fastjson يستمر في تحليل المصفوفة بسبب لاحقة Exception.

5.3 المرحلة الثانية من JDK الحديثة: إعادة فتح مقبض المخزن المؤقت FD

العناصر المرشحة التالية:

أول تطابق في سجل تحميل الفئة لـ JDK 17 هو:

5.4 لماذا يتوافق حمل واحد مع JDK 8 وJDK حديث؟

  • JDK 8 يقبل مباشرة ملف jar من المرحلة الأولى: http://... class وينفذه
  • بعد تنفيذ أمر class المرحلة الأولى، يتم إلقاء RuntimeException("stage-one-stop") عمدًا لمنع JDK 8 من محاولة مواصلة استخدام FDs للـ socket/pipe غير ذات الصلة
  • فشل JDK 17+ في المرحلة الأولى بسبب اسم غير صالح قبل تهيئة الفئة، ثم عاد بلينوت عبر Exception إلى مرحلة تعداد FD

6. بيئة التكرار والأدلة

6.1 هاش المكون الخاضع للاختبار

6.2 إعادة إنتاج واحدة

Expected output:The script will:

  • Compile the victim fat jar;
  • إنشاء JAR هجومي بفئة مخصصة لـ FD؛
  • أنشئ مصفوفة JSON payload؛
  • تشغيل خدمة HTTP لهجوم في شبكة Docker معزولة؛
  • تشغيل حاويات الضحايا الخاصة بـ JDK 8/17/21/25 على حدة؛
  • تحقق من كل خريطة حاوية إلى /tmp/fastjson-getresource-rce.

6.3 إنشاء JAR وهجوم يدويًا

6.4 إرسال عبر Burp Suite

يقوم Burp فقط بإرسال JSON إلى واجهات الضحية التي تحتوي على نقاط تحليل Fastjson؛ لا يزال يجب توفير JAR الهجومي من قبل خدمة HTTP الخاصة بالمهاجم.

نموذج الطلب:

إذا كان التطبيق يستخدم نوعًا علويًا ثابتًا، فيمكن تغليف المصفوفة وفقًا لهيكل الحقول، على سبيل المثال:

استخدمت هذه التجربة JSON.parseObject(json, BoundEnvelope.class) لتحليل الحزمة أعلاه، وظلت النتيجة RCE-OK وعادت BoundEnvelope بشكل طبيعي.

6.5 اختبار الحدود الرئيسية

7. إصلاحات وتوصيات التخفيف7.1 المفضل: النقل خارج Fastjson 1.x

قم بالترحيل الأولي إلى Fastjson 2.x قيد الصيانة، وأعد التحقق من جميع تكوينات الأنواع المتعددة، وAutoType، ووضع التوافق. لا تقتصر على استبدال JAR دون إجراء اختبارات回归.

7.2 تفعيل SafeMode فورًا

تكوين الكود:

معلمات JVM:

ملاحظة: إذا تم تسجيل AutoTypeCheckHandler، فيجب مراجعته أو إزالته بشكل مزامن، لأن المعالج يتم تنفيذه قبل فحص SafeMode.

7.3 قيود مدخلات التسلسل العكسي

  • لا تُمرّر الطلبات غير الموثوقة مباشرة إلى JSON.parse/JSON.parseObject
  • رفض أي نوع من أنواع البيانات الوصفية الخاصة على البوابة أو نقطة دخول التطبيق
  • لا يكفي تثبيت أنواع Java العليا فقط كخط دفاع، لأن الكائنات المضمنة لا تزال تستطيع معالجة @type، كما أن jsonType الخاص بهذه الثغرة يعود مبكرًا ليتجاوز فحوصات التوافق

7.4 قاعدة مؤقتة لجدار نار الويب/البوابة

حظر مؤقتًا الطلبات التي يكون مفتاح JSON بعد فك تشفيره يساوي @type، وتجاوز معلمات URL وجسم الطلب والكائنات المضمنة. لا تبحث فقط عن "@type" كنص عادي، فمحرّك Fastjson يفك تشفير أسماء الحقول أولاً، على سبيل المثال:

قواعد WAF لا يمكنها إلا أن تكون تخفيفًا، ولا يمكنها أن تحل محل ترقية المكونات وSafeMode.

7.5 تعزيز التشغيل والخروج من الشبكة

  1. حظر اتصالات HTTP/HTTPS من JVM إلى عناوين خارجية غير ضرورية.
  2. تطبيق سياسات شبكة حد أدنى على حاويات التطبيق.
  3. قيّد تعرض /proc/self/fd أو استخدم محاكاة حاوية أكثر صرامة عند السماح بالتوافق.
  4. مراجعة معالجة ClassLoader لأسماء موارد URL المطلقة، ورفض بروتوكولات مثل http: وhttps: وjar: وfile:.
  5. راقب الأنشطة غير الطبيعية في دليل JVM المؤقت الذي يحتوي على jar_cache*.

8. اقتراحات الكشف ومؤشرات التهديد

8.1 ميزات الطلب

التركيز على قيم @type المفككة التي تحتوي على:

ظهور Exception بمفرده لا يكفي لإصدار تنبيه، بل يجب ربطه بتحليل مترابط مع شكل البروتوكول و@type وقيم FD المتتالية داخل المصفوفة.

8.2 ميزات جانب الشبكة

  • يطلب JVM ملف JAR أو .class بدون امتداد من خادم غير صالح
  • ظهر طلب GET/HEAD مكرر من 1 إلى 3 مرات خلال نفس طلب التحليل
  • قد تظهر مسارات طلب مثل /x أو /a.class أو مسارات مخصصة من قبل المهاجم

8.3 ميزات الطرف المضيف

  • إنشاء دليل مؤقت لـ JVM باسم jar_cache*
  • يُعيد عملية Java فتح ملفها الخاص عبر /proc/self/fd/N
  • تظهر سجلات class-load مشابهة:

9. الخاتمة

هذه الثغرة ليست "تجاوز القائمة السوداء والبحث عن جهاز محلي" التقليدي، بل تحول منطق استكشاف بيانات الفئة الخاص بـ Fastjson إلى قناة للحصول على فئة عن بُعد وتفويضها. يؤدي العودة المبكرة لـ @JSONType إلى قبول الفئة المقدمة من المهاجم قبل فحص الفئات الأساسية الخطرة وربط النوع؛ كما أن قناة الفشل اللينة للاستثناءات وذاكرة التخزين المؤقت المؤقتة لـ JDK jar:http: توسع مبادئ التحميل المباشر لـ JDK 8 لتشمل JDK 17/21/25.

لذلك لا تنطبق أي من الأحكام الشائعة التالية:

  • "AutoType مُعطل افتراضيًا، لذا فهو آمن" — غير صحيح
  • "تثبيت المعامل الثاني لـ parseObject، لذا فهو آمن" — غير صحيح
  • "لا توجد أدوات معروفة في classpath، لذا فهي آمنة" — غير صحيح
  • سيرفض JKD 17+ الأسماء الداخلية التي تبدأ بـ http://، لذا فهي لا تتجاوز SSRF فقط" — غير صحيح



في البيئات التي تحقق شروط التحميل المعتمد، والشبكة، ووصف الملفات، يمكن أن يتطور هذا المشكل من طلب JSON غير معتمد واحد إلى تنفيذ كود عن بُعد حقيقي. يجب تفضيل التحول إلى Fastjson 2.x وتمكين SafeMode فورًا، وتشديد حدود خروج الشبكة وتحليل موارد ClassLoader.

10. مسار المرفقات والأدلة

حقوق النشر والنقل: تم نشر هذا التقرير والتحليلات التقنية الحصرية من قبل GCSA Alliance العالمية للأمن السيبراني. يُرجى الاحتفاظ الكامل بمصدر GCSA الرسمي والرابط الأصلي عند النقل، وعدم تعديل الآراء الأساسية للتقرير بشكل ضار.

المصدر: GCSA Alliance العالمية للأمن السيبراني

الموقع الرسمي: www.gcsa.org

إخلاء المسؤولية: قد تكون المعلومات الواردة في هذه الصفحة قد حصلت عليها من أطراف ثالثة ولا تعكس بالضرورة وجهات نظر أو آراء KuCoin. يُقدّم هذا المحتوى لأغراض إعلامية عامة فقط ، دون أي تمثيل أو ضمان من أي نوع ، ولا يجوز تفسيره على أنه مشورة مالية أو استثمارية. لن تكون KuCoin مسؤولة عن أي أخطاء أو سهو ، أو عن أي نتائج ناتجة عن استخدام هذه المعلومات. يمكن أن تكون الاستثمارات في الأصول الرقمية محفوفة بالمخاطر. يرجى تقييم مخاطر المنتج بعناية وتحملك للمخاطر بناء على ظروفك المالية الخاصة. لمزيد من المعلومات، يرجى الرجوع إلى شروط الاستخدام واخلاء المسؤولية.