
مختبرات Docker + ماسح دفاعي لثغرة RCE عبر تحميل الفئات عن بُعد في fastjson. fastjson 1.2.66-1.2.83: استكشاف موارد @JSONType (CVE-2026-16723). fastjson2 2.0.57: يصل @type الخاص بالمهاجم إلى loadClass مع تعطيل autoType عبر الأنواع متعددة الأشكال (@JSONType(seeAlso) / Jackson @JsonSubTypes). حمولات تقتصر على العلامات فقط؛ مع ضوابط safeMode + JDK17.
@JSONTypeيحتفظ هذا المستودع الآن بمساري بحث متميزين لـ Fastjson:
modern-fd/ هو إعادة البناء الموصى بها والمقتصرة على العلامات فقط لسلسلة 1.2.83 أحادية الجسم لـ Fastjson عبر remote-JAR/وصف الملف على Spring Boot 3 وTomcat المضمّن العادي وJDK 17. يستخدم المستقبل الحرفي الثابت JSON.parseObject(body, BoundEnvelope.class) مع تعطيل AutoType.scanner/ على كشف سلبي للطلبات/السجلات، وجرد ثابت للقطع الأثرية، ومسبار وصول غير منفّذ للأكواد.الخلل: يستعلم
ParserConfig.checkAutoTypeعن كل قيمة@typeبحثًا عن تعليق@JSONTypeعبر تنفيذgetResourceAsStream(typeName.replace('.','/') + ".class"). على مجموعات Linux/JDK الحديثة، يمكن لمسبارjar:httpعن بُعد أن يترك JAR مخزّنًا مؤقتًا خلف واصف مفتوح؛ ويمكن لمسبارات لاحقةjar:file:/proc/self/fd/Nفي نفس الجسم إعادة فتحه تحت أسماء فئات صالحة وتهيئة فئة مُعلَّقة. يعمل تركيب 1.2.83 الدقيق مع تعطيل AutoType وعبر DTO ثابت يحتوي علىList<Object>. لذلك فإن مجرد الربط ليس تخفيفًا. الشرح الكامل:docs/MECHANISM.md.
غطّت المراجعة المصاحبة للمشروع بأكمله 2,041 صفًا من الاستدعاءات/المُهيّئات الثابتة عبر جميع ملفات Fastjson 1.2.83 الإنتاجية البالغ عددها 193 ملف Java. يعطي الجدول أدناه الأولوية للنتائج الأكثر تأثيرًا؛ وهو ليس ادعاءً بأن كل نشر لـ Fastjson متأثر. يعيد هذا المستودع إنتاج F105 مباشرةً. وتلخّص الإدخالات المتبقية مراجعة المصدر المستقلة والمغلفة والأدلة المختبرية المحدودة.
| الأولوية | النتيجة | النتيجة المُثبتة | الحدود المهمة |
|---|---|---|---|
| 1 | F105 — تنفيذ bytecode عن بُعد عبر @JSONType | تهيئة فئة مقدَّمة من المهاجم عبر محمّلات Spring Boot المتوافقة، بما في ذلك المسار المباشر على JDK 8 واستمرارية JAR المحتفَظ بها /proc/self/fd/N على Linux/JDK 17 | يتطلب حامل @type يمكن الوصول إليه من المحلِّل، ومحمّل Boot/TCCL متوافقًا، ووصولًا صادرًا، وتعطيل SafeMode/IgnoreAutoType، وJAR دقيق من المهاجم. كما يحتاج مسار DTO الثابت الحديث إلى مسار قيمة عامة (يستخدم المختبر List<Object>) وprocfs على Linux وواصفًا محتفَظًا ومطابقة دقيقة للأسماء؛ وهي ليست عامة عبر كل JDK أو محمّل أو نظام تشغيل |
| 2 | F1/F45 — تنفيذ أوامر عبر TemplatesImpl | تنفيذ أوامر بالعلامات عبر واجهة DTO الثابتة، بما في ذلك خاصية جسم مهملة | يتطلب سياسة خادم مُضعَفة: قبول الفئات، وAutoType، وملء الحقول الخاصة أو مسارات مكافئة؛ الإعدادات الافتراضية النقية تمنعه |
| 3 | F70/C016 — تخزين مؤقت غير محدود وتوسعة GZIP | مسارات byte/InputStream المعنونة وDTO المُعلَّقة تتوسع أو تُخزَّن مؤقتًا دون سقف إخراج؛ تم إعادة إنتاج Java OOME بكومة مقيدة | يلزم الوصول إلى نقطة النهاية/المخطط وبايتات المهاجم؛ لم يتم إثبات انقطاع على نطاق الإنتاج |
| 4 | F18/C089 — استنفاد مكدس خيط المحلِّل | يمكن لقيم الكائنات العادية المتداخلة بعمق إنتاج StackOverflowError ضمن التحليل الافتراضي | تأثير على توافر خيط الطلب؛ وليس تعطلًا دائمًا على مستوى JVM أو الخدمة |
| 5 | F120/C162 — SSRF عبر HTTP و/أو تحميل موارد محلية بمخطط ثابت | JEditorPane/JTextPane.page المتحكَّم فيه من الجسم ينفذ طلبات HTTP ويمكنه تحميل محتوى file: محدود في حالة Document | يتطلب أن يصرّح التطبيق بنوع Swing؛ لم يتم إثبات أي تسريب تلقائي للاستجابة أو RCE |
| 6 | F118/C160 — فشل التفويض/سلامة البيانات عبر تصادم التجزئة | يمكن لتصادم Unicode مميز في FNV-1a-64 الارتباط بثابت enum متميز أو توجيه تغيير JSONPath إلى مَعيّن bean خاطئ | يتطلب تصادمًا قابلًا للاستخدام وثقة في المصب أو عملية تغيير JSONPath مكشوفة؛ لا قبول للفئات ولا RCE |
| 7 | F121/C163 — قابلية الوصول إلى JNDI عبر JdbcRowSet الثابت | تسبّب ترتيب المَعيّنات الدقيق في اتصال JNDI/LDAP صادر واحد تحدده الجسم | الأدلة تتوقف عند اتصال: لا استجابة تسمية، ولا مصنع كائنات، ولا تحميل bytecode، ولا RCE |
| 8 | F2/F45 — تحليل DNS الافتراضي | يعمل تحليل اسم المضيف المتحكَّم فيه من المهاجم تحت الإعداد الافتراضي وعبر خاصية DTO ثابتة مهملة | تفاعل DNS/OOB فقط، وليس SSRF عام عبر HTTP أو RCE |
انظر findings/FINDINGS.md للحصول على وسوم التحقق والمتطلبات المسبقة والنتائج الأدنى ترتيبًا وأولويات المعالجة والحدود السلبية الصريحة.
هذا المستودع مخصص لـ التعليم والبحث الدفاعي والاختبار المصرَّح به للأنظمة التي تملكها أو يُسمح لك صراحةً باختبارها. يُرجى، عند دعم النشر المضيف للشبكة الداخلية للمختبر الحديث، قصره على 127.0.0.1 فقط؛ فسكربتاته تقود الاختبار بالكامل داخل تلك الشبكة المعزولة. لا يملك المختبر الحديث أي بدائية لتنفيذ العمليات، ويضع فقط علامة ثابتة داخل JVM. أما مختبر JDK 8 القديم فينفذ id ويكتب مخرجه إلى /tmp/PWNED؛ أبقِه معزولًا. لا توجّه الاستغلال القديم أو المسبار النشط إلى أنظمة غير مصرَّح بها.
يوفّر دليل scanner/ أربع أدوات Python 3 بدون أي تبعيات (بدون تثبيت pip).
fjdetect.py — يفحص سلبيًا أجسام طلبات JSON المفكوكة أو سجلات JSON المنظمة بحثًا عن بذور remote-JAR وتسلسلات /proc/self/fd أو /dev/fd.fjscan_static.py — يجرد ملفات jars/wars/ears بحثًا عن التركيبة القابلة للاستغلال (محتوى 1.2.83 مُتحقَّق منه وموثَّق × محتوى فئة محمّل Spring Boot الفعلي). ويُبلَّغ بشكل منفصل عن إصدارات 1.2.48–1.2.82 التي تحمل مسبارًا والمرشحين المعتمدين على البيانات الوصفية/أسماء الملفات فقط للمراجعة. مناسب لبوابات CI (رمز خروج 2 عند EXPOSED).fjscan_probe.py — فحص وصول نشط وآمن: يطلق @type نحو كَنَري تتحكم فيه (مستمع مدمج أو Burp Collaborator / interactsh) ويربط استدعاء جلب المورد. يعيد مستمعه المدمج 404 فارغًا؛ اضبط المستمعات الخارجية بشكل مكافئ. لا يثبت الاستدعاء تحميل الفئة أو RCE.fjpayload.py — يولّد أجسام جلب موارد بعيدة للاختبار اليدوي؛ استخدم فقط مستمعًا فارغًا/404 عندما لا يكون التنفيذ مقصودًا.# 1) passive request/log inspection
python3 scanner/fjdetect.py --ndjson gateway.jsonl
# 2) inventory build artifacts / unpacked images (parallel)
python3 scanner/fjscan_static.py /path/to/artifacts --threads 16
# 3) active probe across many domains — simplest: --auto fires baseline + plain + escaped comparison
# DNS probes per target and prints a rollup; DNS callbacks land in your Burp Collaborator
python3 scanner/fjscan_probe.py --collaborator <sub>.oastify.com --auto --targets domains.txt --threads 50
cat domains.txt | python3 scanner/fjscan_probe.py --collaborator <sub>.oastify.com --auto --targets -
# 4) bulk fetch payloads for manual testing (one per domain, stable correlation token)
python3 scanner/fjpayload.py <collab-or-ip> --targets-file domains.txt
domains.txt = هدف واحد لكل سطر — إما [METHOD ]URL كاملة أو اسم نطاق مجرد (يُوسَّع عبر --scheme / --target-port / --path)؛ التعليقات التي تبدأ بـ # مسموحة:
api.internal.example
POST https://svc.example/v1/ingest
10.0.0.7:8080
fjscan_probe.py (المسبار النشط)