Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
log4j-4255 — مختبر Docker شامل من البداية إلى النهاية يعيد إنتاج Apache log4j2 #4255 — تجاوز قائمة السماح في FilteredObjectInputStream عبر java.rmi.MarshalledObject (إلغاء تسلسل غير مفلتر → تنفيذ تعليمات برمجية عن بُعد) على Log4j 2.26.1 / JDK 17. | Kitploit
أدوات/GitHubGitHub/dinosn/log4j-4255
تحليل الثغرات الأمنيةالاستغلالأمن الويبالتعلم والتعليماستغلال الملفات الثنائية
GitHubdinosn/log4j-4255

log4j-4255

مختبر Docker شامل من البداية إلى النهاية يعيد إنتاج Apache log4j2 #4255 — تجاوز قائمة السماح في FilteredObjectInputStream عبر java.rmi.MarshalledObject (إلغاء تسلسل غير مفلتر → تنفيذ تعليمات برمجية عن بُعد) على Log4j 2.26.1 / JDK 17.

عرض المستودع
1813منذ يوم واحدلم تتم المراجعة بعد
الموقع الإلكتروني

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

log4j2 #4255 — تجاوز قائمة السماح في FilteredObjectInputStream عبر java.rmi.MarshalledObject

مختبر مستقل ومعزول بالحاويات يعيد إنتاج مشكلة Apache log4j2 #4255 من البداية إلى النهاية ضد القطع الرسمية Log4j 2.26.1 على JDK 17، مع ضوابط إيجابية، ومرجع مُحصّن، وتخفيف مُتحقق منه.

⚠️ الاستخدام المسؤول

يحتوي هذا المختبر على ثغرة إلغاء تسلسل تعمل بتنفيذ أوامر عن بُعد (RCE) ضد مشكلة Log4j غير مُصححة حاليًا (#4255 مفتوحة / waiting-for-maintainer وقت كتابة هذا؛ لا يوجد CVE معيّن). يعمل بالكامل داخل حاويات Docker مؤقتة على جهازك الخاص ولا يتصل بأي شيء خارجي سوى Maven Central (لتنزيل ملفات jar الرسمية) — لا يتم الاتصال بأي هدف.

  • المُبلّغ الأصلي (U-Sec / Wujie Security) يحجب PoC الخاص به بانتظار إصلاح. هذا إعادة إنتاج مستقلة بُنيت للتحقق الدفاعي وهندسة الكشف.
  • لا تشغّل هذا ضد أنظمة لا تملكها أو غير مصرح لك باختبارها صراحةً.
  • هذا يوضح ثغرة RCE مشروطة بالتطبيق، وليست ثغرة RCE عامة في Log4j (انظر ).
النطاق

الخلاصة

FilteredObjectInputStream (FOIS) في Log4j هو قائمة سماح لإلغاء التسلسل تعتمد على resolveClass. تتضمن قائمة السماح الخاصة به java.rmi.MarshalledObject. يخزّن MarshalledObject حمولته كـ byte[] غير شفاف، وMarshalledObject.get() يلغي تسلسل تلك الحمولة على ObjectInputStream جديد وغير مُصفّى — لذلك لا تفحص قائمة السماح أبدًا الرسم البياني الداخلي.

يُطلق Log4j هذا بنفسه: Log4jLogEvent$LogEventProxy (الشكل السلكي المتسلسل لـ LogEvent، منذ 2.8) يحمل رسالة الحدث Message داخل MarshalledObject ويستدعي .get() تلقائيًا أثناء إلغاء التسلسل (readResolve() ← message()). أي تطبيق يقرأ LogEvent متسلسلًا عبر FOIS يقوم بالتالي بإلغاء تسلسل غير مُصفّى لبايتات المهاجم — ولأن message() تبتلع الاستثناء الناتج وتتراجع إلى SimpleMessage، يسجّل المستقبِل حدثًا حميدًا ويستمر في العمل. الاستغلال صامت.

السبب الجذري (تم التحقق منه ضد rel/2.26.1)

#الموقعالخلل
1log4j-api …/util/internal/SerializationUtil.javaREQUIRED_JAVA_CLASSES يحتوي على java.rmi.MarshalledObject
2log4j-api …/util/FilteredObjectInputStream.javaيتجاوز فقط resolveClass()؛ حمولة objBytes الخاصة بـ MarshalledObject غير مرئية له
3log4j-core …/impl/Log4jLogEvent.javaLogEventProxy.marshalledMessage هو MarshalledObject<Message>
4log4j-core …/impl/Log4jLogEvent.javamessage() تستدعي marshalledMessage.get() (بدون تصفية) وتبتلع جميع الاستثناءات

ما يشغّله المختبر

بديل أمين لـ ObjectInputStreamLogEventBridge المُهمَل من log4j-samples: مستقبِل TCP غير مُصادَق يقرأ LogEvent متسلسلًا واحدًا لكل اتصال عبر FOIS. يرسل المهاجم كائنًا متسلسلًا واحدًا؛ المرجع هو ملف إثبات يُكتب في دليل مُثبّت بالربط فقط داخل حاوية المستقبِل، لذا فإن ظهوره يثبت أن الكود نُفّذ داخل المستقبِل عبر إلغاء التسلسل.

#السيناريومسار فئات الضحيةjdk.serialFilterالمتوقع
S1أداة محظورة مُرسلة على المستوى الأعلى+ أداةلا شيءرفض — FOIS يفرض قائمة السماح الخاصة به
S2نفس الأداة ملفوفة في LogEvent+ أداةلا شيءrce — تشغيل تلقائي (يتطلب فئة الأداة على الضحية)
S3CommonsCollections6 خام على المستوى الأعلىlog4j + cc-3.2.1لا شيءرفض — FOIS يحظر CC
S4CC6 مُدمجة داخل MarshalledObjectlog4j + cc-3.2.1 فقطلا شيءrce — لا توجد فئة مهاجم على الضحية
S5حمولة S4log4j + cc-3.2.1!java.rmi.MarshalledObjectرفض — تخفيف
S6حمولة S4log4j + cc-3.2.1maxdepth=5;maxbytes=1000000صامت — التدفق الداخلي يرث الفلتر؛ CC6 عميقة جدًا
S7حمولة S4log4j + cc-3.2.2لا شيءصامت — 3.2.2 يعطّل إلغاء تسلسل الدوال غير الآمنة

rce = تم تنفيذ الكود. reject = FOIS رمى استثناءً على التدفق الخارجي. silent = تمت معالجة الكائن الخارجي، لم يتم تنفيذ أي كود (محظور في العمق، أو إصدار الأداة آمن).

تشغيله

root@kitploit:~
./run.sh            # أو: make run

المتطلبات: Docker فقط (يتم سحب JDK كـ eclipse-temurin:17-jdk). يقوم السكربت بتنزيل ملفات jar الرسمية ويتحقق منها مقابل SHA-1 في Maven Central قبل الاستخدام. ثبّت إصدار Log4j مختلفًا في النطاق الضعيف باستخدام LOG4J_VERSION=2.20.0 ./run.sh.

التأثير وطريقة الهجوم

  • التسليم: كتابة TCP واحدة غير مُصادَق عليها بحجم ~2.8 كيلوبايت لـ LogEvent متسلسل إلى مستقبِل قائم على FOIS. لا يمكن تشغيله عن طريق تسجيل سلسلة نصية (على عكس Log4Shell) — بل يتطلب وصول بايتات متسلسلة خام إلى جسر المقبس.
  • النتيجة: تنفيذ أوامر تعسفي في عملية المستقبِل، بصمت.
  • مسار الهجوم: بناء LogEvent ← writeReplace()/writeObject() في Log4j يلف Message في MarshalledObject ← الأداة تختبئ داخل byte[] غير الشفاف ← على المستقبِل، readResolve() ← message() ← MarshalledObject.get() يفتح تدفقًا غير مُصفّى جديدًا ← أداة ← Runtime.exec. src/attacker/Attacker.java (poc2) يدمج رسمًا بيانيًا نقيًا من CommonsCollections6 في objBytes الخاص بـ MarshalledObject، لذا لا توجد حاجة لفئة مهاجم على الضحية.

التخفيف

  • موثوق: -Djdk.serialFilter='!java.rmi.MarshalledObject' على JVM المستقبِل (S5). تحذير: هذا يحظر أيضًا كائنات LogEventProxy المتسلسلة الشرعية (فهي تستخدم MarshalledObject أيضًا) — إنه فعّال لكنه ليس شفافًا لنقل السجلات المتسلسلة.
  • غير موثوق: فلاتر maxdepth/maxbytes العامة. الفلتر على مستوى العملية ينتشر إلى تدفق MarshalledObject الداخلي ويبدأ العمق من جديد هناك، لذا maxdepth=5 يحظر CC6 (S6) لكن أداة ضحلة ستمر. يعتمد على عمق السلسلة، وليس حدًا فاصلًا.
  • هيكلي: تخلص من نقل السجلات المتسلسلة عبر Java (استخدم JSON / RFC 5424 عبر TLS مُصادَق)؛ أزل تبعيات الأدوات المعروفة؛ لا تعرّض مستقبلات متسلسلة قديمة لشبكات غير موثوقة. الإصلاح من المنبع (حسب المشكلة): إزالة MarshalledObject من قائمة السماح ونقل الرسالة المُغلّفة إلى writeWrappedObject/readWrappedObject المُصفّاة في Log4j.

النطاق والقيود الصادقة

  • مشروط بالتطبيق، وليس ثغرة RCE عامة في Log4j. يتطلب تطبيقًا يعرض مستقبِل LogEvent متسلسلًا غير مُصادَق قائمًا على FOIS ولديه إصدار أداة قابل للاستخدام على مسار الفئات الخاص به. عمليات نشر Log4j العادية لا تشغّل مثل هذا المستقبِل.
  • خادم المقبس المتسلسل داخل النواة كان موجودًا فقط حتى 2.8.2 (net.server.TcpSocketServer نُقل خارج log4j-core في 2017؛ وغائب من 2.9.0 فصاعدًا). المستقبلات الحديثة هي كود تطبيق/عينة، وهذا ما يُمثّله هذا المختبر.
  • يعتمد على إصدار الأداة. commons-collections 3.2.1 ← RCE؛ 3.2.2 يحظرها (S7). أي أداة قابلة للاستخدام تكفي، لكن "وجود commons-collections" ليس كافيًا بحد ذاته.
  • uid=0 في المختبر هو جذر الحاوية — لا يوجد هروب من Docker؛ RCE يعمل كـ عملية المستقبِل.
  • البدائية (MarshalledObject يتغلب على فلتر resolveClass) هي فن سابق معروف؛ انظر نقاش Apache #4168 ("تقوية إلغاء التسلسل في Log4j 2.x"). التشغيل التلقائي الخاص بـ Log4j هو مساهمة #4255.

البنية

root@kitploit:~
run.sh                     مشغّل محمول (مثبّت بالمجموع الاختباري، مرجع مُحصّن)
Makefile                   make build | run | clean
src/victim/Receiver.java   مستقبِل سجلات FOIS (بديل ObjectInputStreamLogEventBridge)
src/attacker/Attacker.java باني الحمولة: ضوابط، PoC-1، PoC-2 (CC6 + دمج البايتات)
src/attacker/EvilMessage.java  أداة PoC-1 ذاتية الاحتواء
docs/RESULTS.md            مصفوفة الأدلة + التحليل

المراجع

  • المشكلة #4255 — https://github.com/apache/logging-log4j2/issues/4255
  • النقاش #4168 (تقوية إلغاء التسلسل) — https://github.com/apache/logging-log4j2/discussions/4168
  • الأسئلة الشائعة حول CWE-502 في Log4j — https://logging.apache.org/security/faq.html
  • إشعار أمان Apache Commons Collections — https://commons.apache.org/proper/commons-collections/security.html

الاعتمادات

الثغرة أُبلغت بواسطة U-Sec (Wujie Security) في Apache log4j2 #4255. هذا المستودع هو مختبر إعادة إنتاج/تحقق مستقل للبحث الدفاعي وهندسة الكشف.

تنزيل الأداة