
ملعب لاختبار وسائل التخفيف من ثغرة Log4Shell (CVE-2021-44228)
ساحة تجريب لاختبار التخفيفات الخاصة بثغرة log4j الحرجة (المعروفة باسم Log4Shell) (CVE-2021-44228).
تكمُن هذه المشكلة تحديداً في ميزة JndiLookup وقدرة log4j على تفسير جميع وسائط استدعاء التسجيل.
كنت أتوقع أن تقوم بتفسير رسالة التنسيق فقط (الوسيط الأول في استدعاء التسجيل)، مثل Hello {} في log.info("Hello {}", "${jndi:ldap://127.0.0.1:8081}")، لكنها تفسّر جميع الوسائط.
تعمل التخفيفات على منع log4j من تفعيل عمليات بحث jndi، لكنها ما تزال تسمح بعمليات بحث أخرى مثل ${java:version}.
ملاحظة: منذ log4j 2.16.0 (LOG4J2-3211; diff) لم تعد رسالة التنسيق قابلة للتفسير.
يمكن تفعيل هذه الثغرة عن بُعد عندما يسجّل التطبيق المستهدف أي بيانات يوفّرها المستخدم، على سبيل المثال، من ترويسات HTTP الشائعة التالية:
AcceptCookieLocationOriginRefererUser-AgentX-Api-VersionX-Forwarded-ForX-Forwarded-HostX-Requested-Withالبناء:
sudo apt-get install -y openjdk-11-jdk-headless
wget https://archive.apache.org/dist/logging/log4j/2.10.0/apache-log4j-2.10.0-bin.tar.gz
wget https://archive.apache.org/dist/logging/log4j/2.16.0/apache-log4j-2.16.0-bin.tar.gz
tar xf apache-log4j-2.10.0-bin.tar.gz
tar xf apache-log4j-2.16.0-bin.tar.gz
javac -Werror -cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar Server.java
جرّب إصدار log4j ثغري:
java \
-cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar:apache-log4j-2.10.0-bin/log4j-core-2.10.0.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
جرّب التخفيف عبر إزالة فئة JndiLookup من مسار الفئات (classpath):
cp apache-log4j-2.10.0-bin/log4j-core-2.10.0.jar log4j-core-2.10.0-without-jndi-lookup.jar
zip -q -d log4j-core-2.10.0-without-jndi-lookup.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
java \
-cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar:log4j-core-2.10.0-without-jndi-lookup.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
جرّب التخفيف عبر متغير البيئة:
ملاحظة منذ 2021-12-15 (تقريباً تاريخ إصدار log4j 2.16.0 / CVE-2021-45046) لم يعد هذا الأسلوب موصى به.
LOG4J_FORMAT_MSG_NO_LOOKUPS=true \
java \
-cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar:apache-log4j-2.10.0-bin/log4j-core-2.10.0.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
جرّب إصدار log4j غير ثغري:
java \
-cp apache-log4j-2.16.0-bin/log4j-api-2.16.0.jar:apache-log4j-2.16.0-bin/log4j-core-2.16.0.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
جرّب grype لمعرفة ما إذا كان يكتشف الثغرة:
wget https://github.com/anchore/grype/releases/download/v0.27.2/grype_0.27.2_linux_amd64.tar.gz
tar xf grype_0.27.2_linux_amd64.tar.gz grype
./grype dir:.
جرّب trivy لمعرفة ما إذا كان يكتشف الثغرة:
wget https://github.com/aquasecurity/trivy/releases/download/v0.21.2/trivy_0.21.2_Linux-64bit.tar.gz
tar xf trivy_0.21.2_Linux-64bit.tar.gz trivy
./trivy fs --security-checks vuln .