
CVE-2021-44228 (Log4Shell)용 핫패치 도구로, JVM Instrumentation API를 사용하여 재시작 없이 실행 중인 Java 프로세스에서 JndiLookup::lookup()을 수정합니다. JDK 6–11 및 Windows를 지원합니다.
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
가능한 원인:
VM이 -XX:+DisableAttachMechanism 옵션으로 실행 중인 경우. Attach가 비활성화되었음을 의미합니다.
/tmp/.java_pid$pid 소켓 파일이 생성되었지만 삭제된 경우 Attach할 수 없으며 이 방법을 사용할 수 없습니다.
Java 프로세스 실행 사용자와 동일한 사용자여야 합니다. 실행 사용자가 로그인이 금지된 경우, root로 su를 사용하여 실행할 수 있습니다. pid_username과 pid를 적절히 교체하세요.
su -l -s /bin/bash -c "$(pwd)/attach.sh pid" pid_username