
Log4Shell सुरक्षा छेद (CVE-2021-44228) का व्यावहारिक प्रदर्शन
यह रिपॉजिटरी केवल शैक्षिक और प्रदर्शन उद्देश्यों के लिए है, जो एक सुरक्षा-संबंधित सेमिनार कार्य के भाग के रूप में है। इस कोड का उपयोग उत्पादन वातावरण में या स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध न करें। इसका निर्माण सुरक्षा जागरूकता बढ़ाने और यह दिखाने के लिए किया गया है कि जब प्रतीत होने वाली हानिरहित सुविधाएँ जैसे लॉगिंग, नाम समाधान और क्लासेस का गतिशील लोडिंग एक साथ संयोजित होती हैं, तो जटिल भेद्यताएँ कैसे उत्पन्न हो सकती हैं।
इस सेमिनार कार्य का उद्देश्य Log4Shell सुरक्षा छिद्र (CVE-2021-44228) की गहरी समझ प्रदान करना है, जो दिसंबर 2021 में ज्ञात हुआ और हाल के वर्षों के सबसे गंभीर सुरक्षा छिद्रों में से एक माना गया। इस कार्य में सैद्धांतिक आधारों को समझाया गया है, साथ ही भेद्यता का एक व्यावहारिक प्रदर्शन भी दिखाया गया है।
Log4Shell सुरक्षा छिद्र के व्यावहारिक चित्रण के लिए, इस रिपॉजिटरी में एक पृथक और कंटेनरीकृत वातावरण स्थापित किया गया है, जो पूर्ण हमले की प्रक्रिया को पुनरुत्पादित रूप से प्रस्तुत करता है। प्रदर्शन तीन प्रमुख घटकों पर आधारित है:
User-Agent हेडर को लॉग करता है, जिसे हमलावर भेद्यता का शोषण करने के लिए हेरफेर कर सकते हैं।Exploit.class) प्रदान करता है। LDAP सर्वर की तरह, यह सर्वर भी हमलावर के नियंत्रण में है।नोट: सेटअप और प्रदर्शन के निष्पादन के बारे में अधिक जानकारी के लिए अनुभाग 4. परियोजना संरचना और सेटअप और 5. परियोजना का डेमो देखें।
Log4Shell Java लाइब्रेरी Log4j में CVE-2021-44228 नामक एक गंभीर सुरक्षा छिद्र का नाम है। यह एक हमलावर को न्यूनतम प्रयास के साथ किसी दूरस्थ सर्वर पर मनमाना कोड निष्पादित करने (Remote Code Execution, संक्षेप में RCE) की अनुमति देता है।
यह भेद्यता Log4j के संस्करणों 2.0 से 2.14.1 को प्रभावित करती है और इतनी गंभीर है कि इसे कई सुरक्षा एजेंसियों, जिनमें BSI (Bundesamt für Sicherheit in der Informationstechnik) शामिल है, द्वारा उच्चतम जोखिम स्तर पर रखा गया है।
Log4Shell इसलिए विशेष रूप से खतरनाक है, क्योंकि ...
वास्तविक कारण Log4j की एक कार्यक्षमता में निहित है जो लुकअप के माध्यम से लॉग संदेशों में गतिशील सामग्री लोड करने की अनुमति देती है। JNDI (Java Naming and Directory Interface) और प्रोटोकॉल LDAP (Lightweight Directory Access Protocol) के साथ संयोजन में, यह दूरस्थ दुर्भावनापूर्ण Java क्लासेस को लोड और निष्पादित करने की अनुमति देता है।
भेद्यता की खोज और प्रकाशन ने दुनिया भर में सुरक्षा की लहर पैदा कर दी। कई प्रणालियों को तुरंत पैच या बंद करना पड़ा। बाद के समय में, अन्य संबंधित भेद्यताएँ (जैसे CVE-2021-45046) ज्ञात हुईं, जो दर्शाती हैं कि समस्या कितनी गहरी और खतरनाक थी।
निम्नलिखित में, शामिल प्रौद्योगिकियों और उनकी अंतःक्रिया को विस्तार से समझाया गया है, ताकि भेद्यता की गहरी समझ विकसित की जा सके।
Log4j Apache द्वारा बनाई गई एक लाइब्रेरी है जो Java अनुप्रयोगों में घटनाओं को लॉग करने के लिए है। लॉगिंग सॉफ्टवेयर विकास में सिस्टम की निगरानी या त्रुटियों का विश्लेषण करने के लिए एक केंद्रीय उपकरण है। Log4j Java पारिस्थितिकी तंत्र में सबसे प्रसिद्ध और सबसे अधिक उपयोग किए जाने वाले लॉगिंग फ्रेमवर्क में से एक है, और इसका उपयोग छोटे अनुप्रयोगों से लेकर बड़े एंटरप्राइज़ सिस्टम तक किया जाता है।
जब कोई प्रोग्राम चल रहा होता है, तो उदाहरण के लिए निम्नलिखित घटनाएँ होती हैं:
इन घटनाओं को लॉग्स के साथ दस्तावेज़ित किया जा सकता है, आमतौर पर कंसोल, फ़ाइलों या नेटवर्क प्रोटोकॉल के माध्यम से केंद्रीय लॉग सर्वर पर पाठ आउटपुट के रूप में। सार्थक लॉगिंग के माध्यम से यह पता लगाया जा सकता है कि एप्लिकेशन ने कब क्या किया।
Log4j लॉग संदेशों के उत्पादन और प्रसंस्करण के लिए एक लचीला, अत्यधिक कॉन्फ़िगरेबल बुनियादी ढाँचा प्रदान करता है। केंद्रीय कार्यों में शामिल हैं:
DEBUG, INFO, WARN, ERROR), जिनसे यह नियंत्रित किया जा सकता है कि कितने विस्तार से लॉग किया जाए।सेमिनार कार्य के लिए प्रासंगिक अन्य सुविधाओं पर बाद के अनुभागों में चर्चा की जाएगी, विशेष रूप से प्लेसहोल्डर कार्यक्षमता और लुकअप कार्यक्षमता।
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
public class Example { private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.info("Starte Anwendung...");
}
}
इस सरल उदाहरण में, एक Logger इंस्टेंस बनाया जाता है या यदि वह पहले से मौजूद है तो उसे प्राप्त किया जाता है। उसके बाद, `INFO` स्तर पर एक लॉग संदेश आउटपुट किया जाता है। Log4j कॉन्फ़िगरेशन के आधार पर संदेश को फ़ॉर्मेट और आउटपुट करता है। एक उदाहरण कॉन्फ़िगरेशन इस प्रकार दिख सकता है:```xml
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
यह कॉन्फ़िगरेशन एक Appender परिभाषित करता है जो लॉग संदेशों को प्रारूप Datum Uhrzeit Log-Level Loggername - Nachricht में कंसोल पर आउटपुट करता है। यह Appender फिर रूट-लॉगर को असाइन किया जाता है, जो INFO स्तर या उससे ऊपर के सभी लॉग संदेशों को संसाधित करता है।
आउटपुट कुछ इस तरह दिख सकता है:``` 2023-10-01 12:00:00 INFO Example - Starte Anwendung...
आइए अब Log4j की उन विशिष्ट विशेषताओं पर आते हैं जो Log4Shell सुरक्षा कमजोरी के लिए सबसे अधिक प्रासंगिक हैं।
#### लॉग संदेशों में प्लेसहोल्डर
Log4j की एक विशेष रूप से उपयोगी विशेषता लॉग संदेशों में **प्लेसहोल्डर** का समर्थन है। इस प्रकार रनटाइम पर गतिशील सामग्री को लॉग आउटपुट में डाला जा सकता है:```java
String username = "Alice";
logger.info("Benutzer angemeldet: {}", username);
इसके लिए रनटाइम पर {} को वेरिएबल username के वास्तविक मान से बदल दिया जाता है।
इससे निम्नलिखित आउटपुट प्राप्त होता है:```text
"Benutzer angemeldet: Alice"
#### गतिशील अभिव्यक्तियाँ (तथाकथित लुकअप)