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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/GitHubGitHub/nccgroup/log4j-jndi-be-gone
أدوات دفاعيةتحليل الثغرات الأمنيةتحليل الكودالاستغلالأمن سلسلة التوريد
GitHubnccgroup/log4j-jndi-be-gone

log4j-jndi-be-gone

إصلاح قائم على وكيل Byte Buddy بلغة Java لـ CVE-2021-44228، ثغرة log4j 2.x "JNDI LDAP".

عرض المستودع
72165منذ 4 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

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

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

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

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

log4j-jndi-be-gone

أداة تعتمد على وكيل Java من Byte Buddy لإصلاح الثغرة CVE-2021-44228 (ثغرة "JNDI LDAP" في log4j 2.x).

تقوم بثلاثة أشياء:

  • تعطيل معالج الطريقة الداخلية لسلسل النصوص بتنسيق jndi: ("عمليات البحث").
  • تسجيل رسالة على System.err (أي stderr) تشير إلى محاولة JNDI لـ log4j (بما في ذلك سلسلة النص التي تمت محاولتها، مع تنظيف أي أحرف ${} لمنع الحقن الانتقالي).
  • تحويل سلسلة النص إلى "(log4j jndi disabled)" في رسالة السجل (لمنع الحقن الانتقالي).

الاستخدام

أضف -javaagent:path/to/log4j-jndi-be-gone-1.0.0-standalone.jar إلى أوامر java الخاصة بك.

ملاحظة: إذا كان لديك بالفعل Byte Buddy في مسار الفئات (classpath)، فجرب استخدام log4j-jndi-be-gone-1.0.0.jar.

root@kitploit:~
$ java -javaagent:path/to/log4j-jndi-be-gone-1.0.0-standalone.jar -jar path/to/some.jar

اعتبارًا من الإصدار 1.1.0، يهدف log4j-jndi-be-gone بشكل افتراضي إلى معالجة الإصدارات المُعاد تغليفها (المعروفة باسم "المُظللة" أو shaded) من log4j التي قد تكون مضمنة في JAR تحت اسم حزمة بديل لمنع التعارضات بين إصدار التطبيق من التبعية وإصدار تبعية التبعية نفسها. ومع ذلك، تجدر الإشارة إلى أن log4j لا يبدو أنه يُعاد تغليفه بسهولة ضمن أسماء/بادئات حزم بديلة بسبب استخدام التأمل (reflection) مع أسماء فئات ثابتة و/أو أسماء فئات من ملفات التكوين المضمنة.

يمكن تعطيل هذا السلوك بوضع =structureMatch=0 بعد مسار JAR الوكيل في الوسيط -javaagent:، على سبيل المثال:

root@kitploit:~
-javaagent:path/to/log4j-jndi-be-gone-1.0.0-standalone.jar=structureMatch=0

مما سيؤدي إلى نفس سلوك المطابقة كما في الإصدار 1.0.0، أي مقارنة بسيطة دقيقة للنص مقابل اسم الفئة.

الحصول على log4j-jndi-be-gone

يمكنك بناء JAR باستخدام ./gradlew (build/libs/log4j-jndi-be-gone-1.0.0(-standalone).jar) أو الحصول عليه من صفحة الإصدارات.

التوافق

يدعم JAR وكيل log4j-jndi-be-gone Java 6-17+.

مطابقة الفئات

يبدأ التنفيذ بمطابقة الفئات التي تحتوي على لاحقات تتطابق مع الحزم الفرعية الداخلية واسم فئة org.apache.logging.log4j.core.lookup.JndiLookup، و lookup.JndiLookup، حيث يمكن توقع أن org.apache.logging.log4j.core قد تم تشويهها بواسطة قواعد إعادة التغليف التي لم تسعَ للحفاظ على أسماء الحزم. بالإضافة إلى ذلك، بدلاً من مجرد إجراء فحوصات مماثلة لجميع أنواع log4j المتوقعة الأخرى، فإنه يضمن أنها موجودة تحت نفس الحزمة الأساسية أيضًا.

ثم يتجول التنفيذ عبر بنية أي فئات lookup.JndiLookup محتملة من log4j تم تحديدها، محاولاً التحقق من:

  • المعدِّلات (modifiers) على الفئة نفسها
  • الفئة الأصلية و/أو الواجهات المنفذة (تختلف بين إصدارات log4j)
  • التعليق التوضيحي org.apache.logging.log4j.core.config.plugins.Plugin المتوقع عبر جميع إصدارات 2.x، بما في ذلك معاملات التعليق التوضيحي وقيمها
  • الطريقة lookup()، مطابقةً لمعدِّلاتها وتوقيع نوعها (وتجاهل الإصدار ذو الوسيطة الواحدة من 2.0)
  • الطريقة convertJndiName()، مطابقةً لمعدِّلاتها وتوقيع نوعها
  • الحقل CONTAINER_JNDI_RESOURCE_PATH_PREFIX، مطابقةً لمعدِّلاته

تحذيرات

  • لن يعمل log4j-jndi-be-gone إذا تم تشويش مكتبة log4j أو إذا تم تعديل حزم/أسماء فئاتها بخلاف إعادة التغليف الأساسية (أي "التظليل").

    • على سبيل الذكر، log4j 2.x غير مرن إلى حد كبير فيما يتعلق بإعادة التغليف، لذا من غير الواضح مدى شيوع هذه الممارسات.
  • يضم log4j-jndi-be-gone-1.0.0-standalone.jar Byte Buddy. إذا كنت تستخدم Byte Buddy بالفعل، فقد تواجه مشاكل معه. جرب log4j-jndi-be-gone-1.0.0.jar بدلاً من ذلك، مع ملاحظة أن log4j-jndi-be-gone يتطلب Byte Buddy 1.12.x. اعتبارًا من الإصدار 1.1.0، يضم JAR المستقل log4j-jndi-be-gone نسخة معاد تغليفها من Byte Buddy ضمن بادئة حزمة خاصة به. من المفترض أن يمنع هذا أي تعارضات.

  • إذا كنت قد استبدلت فئات JndiLookup الخاصة بك بتطبيقات تحاول القيام بالتصيد (honeypotting) أو تسجيل استدعاءات lookup()، فمن المحتمل أن يقوم log4j-jndi-be-gone بتعطيل طريقة lookup الخاصة بها، مما يمنعها من العمل.

مثال

يحتوي الدليل tests/jnditest على حالة اختبار بسيطة حيث يقوم استدعاء تسجيل log4j بتمرير سلسلة تنسيق JNDI LDAP. كما يقوم بإعداد مستمع منفذ خاص به لتحديد ما إذا تم إجراء محاولة اتصال بواسطة log4j ويفشل الاختبار إذا تم استلام اتصال.

root@kitploit:~
$ ./tests/jnditest/test-uninstrumented.sh

BUILD SUCCESSFUL in 1s
6 actionable tasks: 5 executed, 1 up-to-date

BUILD SUCCESSFUL in 1s
3 actionable tasks: 3 up-to-date
JUnit version 4.12
.16:08:49.547 [main] ERROR trust.nccgroup.jnditest.test.JndiTest - Hello, _${jndi:ldap://127.0.0.1:8899/evil}_!
E
Time: 0.929
There was 1 failure:
1) logging(trust.nccgroup.jnditest.test.JndiTest)
java.lang.AssertionError: jndi ldap connection received
	at org.junit.Assert.fail(Assert.java:88)
	at trust.nccgroup.jnditest.test.JndiTest.logging(JndiTest.java:55)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
	at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
	at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
	at trust.nccgroup.jnditest.Main.main(Main.java:24)

FAILURES!!!
Tests run: 1,  Failures: 1

$ ./tests/jnditest/test-instrumented.sh

BUILD SUCCESSFUL in 1s
6 actionable tasks: 5 executed, 1 up-to-date

BUILD SUCCESSFUL in 1s
3 actionable tasks: 3 up-to-date
JUnit version 4.12
.log4j jndi lookup attempted: (sanitized) ldap://127.0.0.1:8899/evil
16:09:06.064 [main] ERROR trust.nccgroup.jnditest.test.JndiTest - Hello, _(log4j jndi disabled)_!

Time: 1.362

OK (1 test)

الترخيص

مرخص بموجب ترخيص Apache 2.

التوافق

إصدارات Java المختبرة

تم اختبار log4j-jndi-be-gone على OpenJDK 6 و8 و11 و17، وعلى أجهزة HotSpot وOpenJ9 الافتراضية (JVMs).

إصدارات log4j المختبرة

  • 2.0
  • 2.0.1
  • 2.0.2
  • 2.1
  • 2.2
  • 2.3
  • 2.4
  • 2.4.1
  • 2.5
  • 2.6
  • 2.6.1
  • 2.6.2
  • 2.7
  • 2.8
  • 2.8.1
  • 2.8.2
  • 2.9.0
  • 2.9.1
  • 2.10.0
  • 2.11.0
  • 2.11.1
  • 2.11.2
  • 2.12.0
  • 2.12.1
  • 2.12.2
  • 2.13.0
  • 2.13.1
  • 2.13.2
  • 2.13.3
  • 2.14.0
  • 2.14.1
  • 2.15.0
  • 2.16.0
  • 2.17.0
تنزيل الأداة