
باحث أمني هجومي + ذكاء اصطناعي ضد ثغرة n-day جديدة: بناء أول PoC عام لـ CVE-2026-53435 في ليلة جمعة واحدة. سجل خام لمدة 8 ساعات و20 دقيقة بالداخل.
أول إثبات مفهوم عام لـ CVE-2026-53435، تم بناؤه عندما كان الإعلان التحذيري فقط موجودًا ولم يُنشر أي إثبات مفهوم في أي مكان. تم إعادة بنائه من إعلان تحذيري غامض من سطر واحد خلال حوالي 8.5 ساعة في ليلة جمعة — ليس عن طريق كتابة الاستغلال يدويًا، ولكن عن طريق توجيه ذكاء اصطناعي عبر النهايات المسدودة، والمحاور، والتحقق حتى ظهرت سلسلة عاملة.

إثبات المفهوم يصل إلى /etc/passwd على وحدة التحكم — تأكيد قراءة ملف تعسفية.
| CVE | CVE-2026-53435 (Jenkins SECURITY-3707) |
| الفئة | إلغاء تسلسل غير آمن (تجاوز ClassFilter عبر config.xml) |
| التأثير (إثبات المفهوم هذا) | قراءة ملف تعسفية موثقة على وحدة التحكم |
| المتأثر | Jenkins الأسبوعي ≤ 2.567، LTS ≤ 2.555.2 |
| المُصحَّح | Jenkins الأسبوعي 2.568، LTS 2.555.3 |
| الإعلان التحذيري | https://www.jenkins.io/security/advisory/2026-06-10/ (نُشر 2026-06-10) |
| الحالة وقت الكتابة | لا يوجد إثبات مفهوم عام (مستودعات إثبات المفهوم على GitHub: 0) |
هذه تجربة في عرض العملية، وليس فقط النتيجة.
لسنوات، كان مخرجات الباحث الهجومي استغلالًا واحدًا منتهيًا — الساعات الثماني من المسارات الخاطئة التي أنتجته اختفت. هذا المستودع يحافظ على المسارات الخاطئة. تم تضمين النص الكامل والمحرر بشكل طفيف لجلسة عمل بين إنسان وذكاء اصطناعي تعمل على ثغرة جديدة من اليوم صفر (n-day) من الإعلان التحذيري إلى إثبات المفهوم العامل كملحق.
النقطة التي يطرحها هي عمدًا ليست "الذكاء الاصطناعي فعلها". الساعات الثماني هي
الدليل على أنه لم يفعلها. لم يقم الذكاء الاصطناعي بنحت السلسلة في محاولة واحدة. ما حمل
العمل هو الخبرة في المجال — معرفة أن الإعلان التحذيري كان يخفي مصرف إلغاء تسلسل،
ومعرفة أين نبحث في أنواع نواة Jenkins بدلاً من الإضافات، ومعرفة أن
DescribableList قبل التصحيح لن يفرض نوع عناصره، ومعرفة كيفية
التحقق من ادعاء بدلاً من الوثوق به. قيمة الباحث لم تختفِ؛ لقد انتقلت من
كتابة الاستغلال إلى التوجيه، والتهذيب، والتحقق.
هذا التحول هو الشيء الذي يستحق التوثيق.
يحمي Jenkins إلغاء التسلسل باستخدام ClassFilter مخصص يسمح فقط
باستخدام الأنواع المعرفة في نواة Jenkins أو الإضافات. CVE-2026-53435 هي أن هذا
غير كافٍ: المهاجم الذي يمكنه إرسال طلب POST بـ config.xml يمكنه جعل Jenkins
يقوم بإلغاء تسلسل نوع تعسفي من النواة/الإضافة في سياق لم يتوقعه أبدًا،
ثم الوصول إلى ذلك الكائن عبر HTTP عبر توجيه Stapler.
يزرع إثبات المفهوم هذا نوع hudson.Plugin$DummyImpl (نوع من نواة Jenkins، لذا فهو يجتاز
القائمة البيضاء للموقع) في قائمة <properties> الخاصة بـ ListView —
وهي قائمة DescribableList<ViewProperty> التي، قبل التصحيح، لا تفرض نوع
عناصرها. يحمل الكائن المزروع baseResourceURL=file:/. توجيه طلب HTTP
إليه يقدم بعد ذلك الملفات مباشرة من نظام ملفات وحدة التحكم.
سلسلة ysoserial عامة لا تعمل هنا — يجب أن تكون الأداة (gadget) من نوع مقيم في Jenkins/إضافة لتبقى على قيد الحياة عبر الفلتر. هذا القيد هو اللعبة كلها.
استخدم فقط ضد الأنظمة التي تمتلكها أو مخول صراحة باختبارها.
تم تشغيل الاستغلال ضد حاويتين بنفس الإعداد — النسخة الضعيفة
2.555.2 والمصححة 2.555.3 — لتأكيد أنه يمارس ثغرة هذه CVE وليس
أي أساس قراءة ملف غير ذي صلة:
تقبل النسخة المصححة الطلب لكن التصحيح يرفض النوع المزروع عند وقت إلغاء التسلسل، لذا تعود قائمة الخصائص فارغة ولا يوجد شيء لتوجيهه إليه. يقع الفشل تمامًا على الآلية التي يصفها الإعلان التحذيري — وهو ما يجعل هذا إثبات مفهوم حقيقيًا لـ CVE-2026-53435.
python3 exploit_cve_2026_53435_v2.py <base_url> <user> <pass> <remote_file> [view_name]
# example (against your own lab):
python3 exploit_cve_2026_53435_v2.py http://127.0.0.1:8080 <user> <pass> /etc/passwd
base_url — http://host:port للهدف (HTTP عادي؛ لا تضع https
ما لم يكن المثيل ينهي TLS فعلاً).config.xml الخاص بعرض
(View/Configure)، بالإضافة إلى صلاحية القراءة الشاملة (Overall/Read).docker compose -f lab/docker-compose.yml up -d
# vulnerable: http://127.0.0.1:8080 (Jenkins LTS 2.555.2)
# patched: http://127.0.0.1:8081 (Jenkins LTS 2.555.3, negative control)
يقوم المختبر بتجهيز قاعدة بيانات مستخدمين محلية فقط عبر تهيئة Groovy بحيث يمكن اختبار المسار الموثق ذي الامتيازات المنخفضة دون مزود هوية خارجي.
2026-06-12 (الجمعة) 15:00 → 23:23 ≈ 8 س 20 د
15:00–15:12 بناء المختبر (docker: vuln 2.555.2 / patched 2.555.3) + استطلاع أولي
15:12–21:00 تحليل مصرف إلغاء التسلسل والأداة (gadget)
(محاولات تجاوز Commons-Collections فشلت → تحول
من الخصائص إلى الإجراءات والعودة)
21:00–22:30 تحليل ClassFilter + بحث جديد عن أداة، مقيد بأنواع النواة
22:30–23:00 إثبات مفهوم عامل (v1 → v2) + تحقق تفاضلي (vuln vs patched)
معظم تلك الساعات كانت تحليلًا، وليس كتابة. الاستغلال نفسه تم تجميعه في آخر حوالي 30 دقيقة — بمجرد معرفة المصرف والأداة الصحيحين.
تم بناؤه باستخدام Claude Code (Anthropic)، تم توجيهه تفاعليًا من قبل المؤلف:
النص الكامل والمحرر بشكل طفيف لجلسة العمل موجود في
transcript/ — محفوظ كما هو، بما في ذلك النهايات المسدودة. (تم التحرير فقط
لتخفيف بعض نبرة الأسطر ولإخفاء تفاصيل الشبكة المحلية؛ لم يتم إزالة أي شيء
تقني.)
للاستخدام في الاختبارات الأمنية المصرح بها، والبحث، والتعليم فقط. لا يتحمل المؤلف والمساهمون أي مسؤولية عن سوء الاستخدام. الثغرة المستهدفة مصحَّحة — قم بالتحديث إلى Jenkins LTS 2.555.3 / الأسبوعي 2.568 أو أحدث.
| 2.555.2 (ضعيفة) | 2.555.3 (مصحَّحة) |
|---|
createView | HTTP 200 | HTTP 200 |
<properties> المُخزَّن | <hudson.Plugin_-DummyImpl/> — يبقى | <properties/> — مُزَال |
التشغيل → /etc/passwd | root:x:0:0:... — تمت القراءة | فارغ — محظور |