
Hotpatch инструмент для CVE-2021-44228 (Log4Shell), который использует JVM Instrumentation API для исправления JndiLookup::lookup() в работающих Java-процессах без перезапуска. Поддерживает JDK 6–11 и Windows.
https://github.com/qingtengyun/cve-2021-44228-qingteng-patch
Исправление уязвимости CVE-2021-44228 в log4j2 с использованием Instrumentation API, предоставляемого JVM, для изменения существующего байт-кода, загруженного в JVM.
Без перезапуска Java-процесса модифицирует метод lookup класса org.apache.logging.log4j.core.lookup.JndiLookup, всегда возвращая 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-процессы.
Можно ввести несколько PID через пробел.
Windows:
Дважды щёлкните attach.bat, затем введите PID Java-процесса.
Или передайте PID в командной строке cmd, например: 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
Возможные причины:
-XX:+DisableAttachMechanism — это означает, что Attach отключён./tmp/.java_pid$pid был создан, а затем удалён. Attach невозможен, этот метод не работает.su, заменив pid_username и pid:su -l -s /bin/bash -c "$(pwd)/attach.sh pid" pid_username