
Un agente para hacer hotpatch a la vulnerabilidad RCE de log4j de CVE-2021-44228.
Esta es una herramienta que inyecta un agente Java en un proceso JVM en ejecución. El agente intentará parchear el método lookup() de todas las instancias cargadas de org.apache.logging.log4j.core.lookup.JndiLookup para que devuelvan incondicionalmente la cadena "Patched JndiLookup::lookup()". Está diseñada para abordar la vulnerabilidad de ejecución remota de código CVE-2021-44228 en Log4j sin reiniciar el proceso Java. Esta herramienta también abordará la CVE-2021-45046.
Actualmente solo se ha probado con JDK 8, 11, 15 y 17 en Linux!
Para compilar en Linux, Mac y el subsistema de Windows para Linux
./gradlew build
Para compilar en Windows
.\gradlew.bat build
Dependiendo de la plataforma en la que compiles. Esto generará build/libs/Log4jHotPatch.jar
Para compilar usando Maven usa
mvn clean package
Esto generará un target/Log4jHotPatch.jar.
JDK 8
java -cp <java-home>/lib/tools.jar:Log4jHotPatch.jar Log4jHotPatch <java-pid>
JDK 11 y más recientes
java -jar Log4jHotPatch.jar <java-pid>
Simplemente agrega el agente a tu línea de comandos de Java de la siguiente manera:
java -classpath <class-path> -javaagent:Log4jHotPatch.jar <main-class> <arguments>
Hay un conjunto de pruebas que se pueden ejecutar fuera de Gradle o Maven.
build-tools/bin/run_tests.sh Log4jHotPatch.jar <JDK_ROOT>
Si obtienes un error como:
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)
esto significa que tu JVM está rechazando cualquier tipo de ayuda porque se está ejecutando con -XX:+DisableAttachMechanism.
Si obtienes un error como:
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)
esto significa que estás ejecutando como un usuario diferente (incluyendo root) que la JVM objetivo. JDK 8 no puede manejar el parcheo como usuario root (y desencadena un volcado de hilos en la JVM objetivo que es inofensivo). En JDK 11, parchear un proceso no root desde un proceso root funciona bien.
Si obtienes un error como este en el proceso objetivo:
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)
significa que el proceso objetivo tiene instalado un administrador de seguridad. Busca esta opción de línea de comandos en el proceso objetivo:
-Djava.security.policy=/local/apollo/.../apollo-security.policy
Si encuentras este error, asegúrate de estar usando la última versión de la herramienta
Importante: Si intentaste parchear como el usuario equivocado, es posible que necesites eliminar los archivos .attach_pid<pid> (que se encuentran en /tmp y/o en el directorio de trabajo del proceso de la VM) antes de volver a intentarlo. Estos archivos deben tener la propiedad correcta para que el adjunto tenga éxito.