
عامل لتصحيح فوري لثغرة log4j RCE من CVE-2021-44228.
هذه أداة تقوم بحقن وكيل Java في عملية JVM قيد التشغيل. سيحاول الوكيل تصحيح طريقة lookup() لجميع مثيلات org.apache.logging.log4j.core.lookup.JndiLookup المحملة لإرجاع السلسلة "Patched JndiLookup::lookup()" بشكل غير مشروط. إنه مصمم لمعالجة ثغرة تنفيذ التعليمات البرمجية عن بُعد CVE-2021-44228 في Log4j دون إعادة تشغيل عملية Java. ستقوم هذه الأداة أيضًا بمعالجة CVE-2021-45046.
تم اختبار هذا حاليًا فقط مع JDK 8 و11 و15 و17 على Linux!
للبناء على لينكس وماك ونظام Windows الفرعي للينكس
./gradlew build
للبناء على Windows
.\gradlew.bat build
اعتمادًا على النظام الأساسي الذي تقوم بالبناء عليه. سيؤدي هذا إلى إنشاء build/libs/Log4jHotPatch.jar
للبناء باستخدام Maven استخدم
mvn clean package
سيؤدي هذا إلى إنشاء target/Log4jHotPatch.jar.
JDK 8
java -cp <java-home>/lib/tools.jar:Log4jHotPatch.jar Log4jHotPatch <java-pid>
JDK 11 والإصدارات الأحدث
java -jar Log4jHotPatch.jar <java-pid>
ما عليك سوى إضافة الوكيل إلى سطر أوامر java الخاص بك كما يلي:
java -classpath <class-path> -javaagent:Log4jHotPatch.jar <main-class> <arguments>
هناك مجموعة من الاختبارات التي يمكن تشغيلها خارج Gradle أو Maven.
build-tools/bin/run_tests.sh Log4jHotPatch.jar <JDK_ROOT>
إذا حصلت على خطأ مثل:
Exception in thread "main" com.sun.tools.attach.AttachNotSupportedException: The VM does not support the attach mechanism
at jdk.attach/sun.tools.attach.HotSpotAttachProvider.testAttachable(HotSpotAttachProvider.java:153)
at jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:56)
at jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207)
at Log4jHotPatch.loadInstrumentationAgent(Log4jHotPatch.java:115)
at Log4jHotPatch.main(Log4jHotPatch.java:139)
هذا يعني أن JVM الخاص بك يرفض أي نوع من المساعدة لأنه يعمل مع -XX:+DisableAttachMechanism.
إذا حصلت على خطأ مثل:
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:63)
at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:208)
at Log4jHotPatch.loadInstrumentationAgent(Log4jHotPatch.java:182)
at Log4jHotPatch.main(Log4jHotPatch.java:259)
هذا يعني أنك تعمل كمستخدم مختلف (بما في ذلك root) عن JVM الهدف. لا يمكن لـ JDK 8 معالجة التصحيح كمستخدم root (ويؤدي إلى تفريغ سلسلة في JVM الهدف وهو غير ضار). في JDK 11، يعمل تصحيح عملية غير root من عملية root بشكل جيد.
إذا حصلت على خطأ مثل هذا في العملية المستهدفة:
Exception in thread "Attach Listener" java.lang.ExceptionInInitializerError
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:411)
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "log4jFixerAgentVersion" "write")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:886)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.System.setProperty(System.java:794)
at Log4jHotPatch.<clinit>(Log4jHotPatch.java:66)
هذا يعني أن العملية المستهدفة بها مدير أمان مثبت. ابحث عن خيار سطر الأوامر هذا في العملية المستهدفة:
-Djava.security.policy=/local/apollo/.../apollo-security.policy
إذا واجهت هذا الخطأ، فتأكد من استخدام أحدث إصدار من الأداة
هام: إذا حاولت التصحيح كمستخدم خاطئ، فقد تحتاج إلى حذف ملفات .attach_pid<pid> (الموجودة في /tmp و/أو CWD لعملية VM) قبل المحاولة مرة أخرى. يجب أن تكون هذه الملفات مملوكة بشكل صحيح حتى ينجح الإرفاق.