
Ferramenta de hotpatch para CVE-2021-44228 (Log4Shell) que utiliza a API de Instrumentação JVM para corrigir JndiLookup::lookup() em processos Java em execução sem reinicialização. Suporta JDK 6–11 e Windows.
https://github.com/qingtengyun/cve-2021-44228-qingteng-patch
Corrige o CVE-2021-44228 do log4j2, usando a Instrumentation API fornecida pela JVM para alterar o bytecode existente carregado na JVM.
Sem reiniciar o processo Java, modifica o método lookup da classe org.apache.logging.log4j.core.lookup.JndiLookup para retornar fixamente
Patched JndiLookup::lookup().
Baseou-se simplesmente em https://github.com/corretto/hotpatch-for-apache-log4j2 para modificações e melhorias, suporta versões do JDK 6, 7, 8, 9, 10, 11, suporta Windows
jattach e jattach.exe são de https://github.com/apangin/jattach, pode comparar com o GitHub.
Se não confiar na ferramenta pré-construída baixada, pode baixar o código e executar build.sh para empacotar e substituir.
O resultado do empacotamento do build.sh está no diretório build/cve-2021-44228-qingteng-patch
Linux:
./attach.sh $pid
./attach.sh
./attach.sh sem pid usará jps para listar todos os processos Java nesta máquina, depois insira o número da linha para selecionar o processo para injeção e correção, inserir all injetará em todos os processos Java listados Pode inserir vários, separados por espaço.
Windows:
Clique duas vezes em attach.bat, depois insira o pid do processo Java
Ou passe o pid na linha de comando cmd, por exemplo 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
O retorno no final
JVM response code = 0
0
indica sucesso na injeção. Caso contrário, é falha.
Could not start attach mechanism: No such file or directory
As possíveis causas são:
A VM executou com o parâmetro -XX:+DisableAttachMechanism, indicando que o Attach está desabilitado.
O arquivo socket /tmp/.java_pid$pid foi criado e depois deletado, impossibilitando o Attach, não é possível usar este método.
É necessário ser o mesmo usuário que está executando o processo Java. Se o usuário em execução tiver login proibido, pode usar root para executar su, lembrando de substituir pid_username e pid
su -l -s /bin/bash -c "$(pwd)/attach.sh pid" pid_username