
再起動せずに実行中のJavaプロセスのJndiLookup::lookup()を修正するためにJVM Instrumentation APIを使用するCVE-2021-44228 (Log4Shell)用のホットパッチツール。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
考えられる原因
1、VM に -XX:+DisableAttachMechanism オプションが指定されて実行されている(Attach を無効化)。
2、/tmp/.java_pid$pid ソケットファイルが作成された後に削除されてしまい、Attach できず、この方法が使用不可。
二、Java プロセスを実行しているユーザーと同じユーザーである必要があります。実行ユーザーがログイン不可の場合、root で su を実行してください。その際、pid_username と pid を適宜置き換えてください。
su -l -s /bin/bash -c "$(pwd)/attach.sh pid" pid_username