
Ein Agent zum Hotpatchen der log4j-RCE aus CVE-2021-44228.
Dies ist ein Tool, das einen Java-Agenten in einen laufenden JVM-Prozess injiziert. Der Agent versucht, die lookup()-Methode aller geladenen org.apache.logging.log4j.core.lookup.JndiLookup-Instanzen zu patchen, sodass sie bedingungslos den String "Patched JndiLookup::lookup()" zurückgibt. Es wurde entwickelt, um die CVE-2021-44228-Schwachstelle zur Remote-Codeausführung in Log4j zu beheben, ohne den Java-Prozess neu zu starten. Dieses Tool behebt auch CVE-2021-45046.
Dies wurde derzeit nur mit JDK 8, 11, 15 und 17 unter Linux getestet!
Zum Erstellen unter Linux, Mac und Windows-Subsystem für Linux
./gradlew build
Zum Erstellen unter Windows
.\gradlew.bat build
Abhängig von der Plattform, auf der Sie erstellen. Dies erzeugt build/libs/Log4jHotPatch.jar
Zum Erstellen mit Maven verwenden
mvn clean package
Dies erzeugt eine target/Log4jHotPatch.jar.
JDK 8
java -cp <java-home>/lib/tools.jar:Log4jHotPatch.jar Log4jHotPatch <java-pid>
JDK 11 und neuer
java -jar Log4jHotPatch.jar <java-pid>
Fügen Sie den Agenten einfach wie folgt zu Ihrer Java-Befehlszeile hinzu:
java -classpath <class-path> -javaagent:Log4jHotPatch.jar <main-class> <arguments>
Es gibt eine Reihe von Tests, die außerhalb von Gradle oder Maven ausgeführt werden können.
build-tools/bin/run_tests.sh Log4jHotPatch.jar <JDK_ROOT>
Wenn Sie einen Fehler wie diesen erhalten:
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)
bedeutet dies, dass Ihre JVM jegliche Hilfe verweigert, weil sie mit -XX:+DisableAttachMechanism ausgeführt wird.
Wenn Sie einen Fehler wie diesen erhalten:
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)
bedeutet dies, dass Sie als ein anderer Benutzer (einschließlich root) ausgeführt werden als die Ziel-JVM. JDK 8 kann das Patchen als Root-Benutzer nicht verarbeiten (und löst einen Thread-Dump in der Ziel-JVM aus, der harmlos ist). In JDK 11 funktioniert das Patchen eines Nicht-Root-Prozesses von einem Root-Prozess aus einwandfrei.
Wenn Sie einen Fehler wie diesen im Zielprozess erhalten:
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)
bedeutet dies, dass der Zielprozess einen Security Manager installiert hat. Suchen Sie nach dieser Befehlszeilenoption im Zielprozess:
-Djava.security.policy=/local/apollo/.../apollo-security.policy
Wenn Sie auf diesen Fehler stoßen, stellen Sie sicher, dass Sie die neueste Version des Tools verwenden
Wichtig: Wenn Sie versucht haben, als falscher Benutzer zu patchen, müssen Sie möglicherweise .attach_pid<pid>-Dateien löschen (zu finden in /tmp und/oder dem Arbeitsverzeichnis des VM-Prozesses), bevor Sie es erneut versuchen. Diese Dateien müssen den richtigen Besitzer haben, damit das Anhängen erfolgreich ist.