
أداة تصحيح ساخن لثغرة 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 التي توفرها 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 المدرجة.
يمكن إدخال أكثر من واحد، مفصولة بمسافات.
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، وبالتالي لا يمكن استخدام هذه الطريقة.ثانيًا، يجب أن تكون نفس المستخدم الذي يعمل به Java process. إذا كان المستخدم ممنوعًا من تسجيل الدخول، يمكنك استخدام root لتنفيذ su، مع الانتباه إلى استبدال pid_username و pid.
su -l -s /bin/bash -c "$(pwd)/attach.sh pid" pid_username