青藤 log4j2-patch

https://github.com/qingtengyun/cve-2021-44228-qingteng-patch

修复 log4j2的 CVE-2021-44228 , 利用 JVM 提供的 Instrumentation API来更改加载到 JVM 中的现有字节码。
在不重启Java进程的情况下,修改org.apache.logging.log4j.core.lookup.JndiLookup类的lookup方法,固定返回 Patched JndiLookup::lookup()。

简单参考了 https://github.com/corretto/hotpatch-for-apache-log4j2 进行了修改增强,支持JDK版本6、7、8、9、10、11, 支持Windows
jattach和 jattach.exe 来自 https://github.com/apangin/jattach, 可以和github的对比。

如不放心下载的构建好的工具,可下载代码自行执行 build.sh 打包替换。
build.sh 打包结果位于 build/cve-2021-44228-qingteng-patch 目录下

使用方法

Linux:

./attach.sh $pid
./attach.sh

./attach.sh 不带pid将使用jps列出此机器上所有java进程,然后输入行号选择进程来进行注入修复,输入all将会注入所有列出的java进程 可输入多个,空格分割。

Windows:
双击 attach.bat, 然后输入java进程pid
或者cmd命令行里传入pid,例如 attach.bat pid

例子

$ ./attach.sh 438625
/data/qingteng/cve-2021-44228-qingteng-patch
will patch pid: 438625
/data/qingteng/cve-2021-44228-qingteng-patch/jattach 438625 load instrument false /data/qingteng/cve-2021-44228-qingteng-patch/qt-log4j-agent.jar=/data/qingteng/cve-2021-44228-qingteng-patch/qt-log4j-patch.jar
Connected to remote JVM
JVM response code = 0
0

末尾返回

JVM response code = 0
0

表示注入成功。 否则为失败。

注意事项

一、如果报如下错误

Could not start attach mechanism: No such file or directory

可能的原因有 1、VM带有下面参数运行 -XX:+DisableAttachMechanism,表示已禁用 Attach 。
2、/tmp/.java_pid$pid socket文件产生过然后已被删除,无法 Attach,无法使用此方法。

二、需要和Java进程运行的用户是相同用户,如果运行用户禁止登录,可以用root执行su来执行,注意替换pid_username和pid

su -l -s /bin/bash -c "$(pwd)/attach.sh pid" pid_username