
CVE-2021-44228 से log4j RCE को हॉटपैच करने के लिए एक एजेंट।
यह एक उपकरण है जो चल रही JVM प्रक्रिया में Java एजेंट इंजेक्ट करता है। एजेंट सभी लोड किए गए org.apache.logging.log4j.core.lookup.JndiLookup इंस्टेंस के lookup() विधि को पैच करने का प्रयास करेगा ताकि वह बिना शर्त स्ट्रिंग "Patched JndiLookup::lookup()" लौटाए। यह Java प्रक्रिया को पुनः आरंभ किए बिना Log4j में CVE-2021-44228 रिमोट कोड निष्पादन भेद्यता को संबोधित करने के लिए डिज़ाइन किया गया है। यह उपकरण CVE-2021-45046 को भी संबोधित करेगा।
वर्तमान में इसका परीक्षण केवल Linux पर JDK 8, 11, 15 और 17 के साथ किया गया है!
Linux, mac और Windows subsystem for linux पर बिल्ड करने के लिए
./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)
इसका मतलब है कि आप लक्षित JVM से भिन्न उपयोगकर्ता (रूट सहित) के रूप में चल रहे हैं। JDK 8 रूट उपयोगकर्ता के रूप में पैचिंग को संभाल नहीं सकता (और लक्षित JVM में थ्रेड डंप ट्रिगर करता है जो हानिरहित है)। JDK 11 में रूट प्रक्रिया से गैर-रूट प्रक्रिया को पैच करना ठीक काम करता है।
यदि आपको लक्षित प्रक्रिया में निम्न जैसी त्रुटि मिलती है:
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 और/या VM प्रक्रिया के CWD में पाई जाती हैं)। Attach सफल होने के लिए इन फ़ाइलों का स्वामित्व सही होना आवश्यक है।