
Replicating CVE-2021-45046

यह पाया गया कि Apache Log4j 2.15.0 में CVE-2021-44228 को संबोधित करने के लिए किया गया सुधार कुछ गैर-डिफ़ॉल्ट कॉन्फ़िगरेशन में अधूरा था। यह हमलावरों को Thread Context Map (MDC) इनपुट डेटा पर नियंत्रण रखने की अनुमति दे सकता है जब लॉगिंग कॉन्फ़िगरेशन एक गैर-डिफ़ॉल्ट Pattern Layout का उपयोग करता है जिसमें या तो Context Lookup (उदाहरण के लिए, $${ctx:loginId}) या Thread Context Map पैटर्न (%X, %mdc, या %MDC) होता है, जिससे JNDI Lookup पैटर्न का उपयोग करके दुर्भावनापूर्ण इनपुट डेटा तैयार किया जा सकता है और सेवा से वंचित (DOS) हमला हो सकता है। Log4j 2.15.0 डिफ़ॉल्ट रूप से JNDI LDAP लुकअप को localhost तक सीमित करने का सर्वोत्तम प्रयास करता है। Log4j 2.16.0 संदेश लुकअप पैटर्न के लिए समर्थन हटाकर और डिफ़ॉल्ट रूप से JNDI कार्यक्षमता को अक्षम करके इस समस्या को ठीक करता है।
Log4j ने Mapped Diagnostic Context या MDC की अवधारणा प्रस्तुत की।
Log4j 2 MDC और NDC के विचार को जारी रखता है लेकिन उन्हें एक एकल Thread Context में विलय कर देता है। Thread Context Map, MDC के समतुल्य है और Thread Context Stack, NDC के समतुल्य है। हालांकि इनका उपयोग अक्सर समस्या निदान के अलावा अन्य उद्देश्यों के लिए किया जाता है, फिर भी Log4j 2 में इन्हें अक्सर MDC और NDC के रूप में संदर्भित किया जाता है क्योंकि वे पहले से ही इन परिवर्णी शब्दों से सुपरिचित हैं।
अधिकांश वास्तविक-विश्व प्रणालियों को एक साथ कई क्लाइंटों से निपटना पड़ता है। ऐसी प्रणाली के एक सामान्य मल्टीथ्रेडेड कार्यान्वयन में, अलग-अलग थ्रेड अलग-अलग क्लाइंटों को संभालते हैं। लॉगिंग जटिल वितरित अनुप्रयोगों को ट्रेस और डीबग करने के लिए विशेष रूप से उपयुक्त है। एक क्लाइंट के लॉगिंग आउटपुट को दूसरे से अलग करने का एक सामान्य तरीका प्रत्येक क्लाइंट के लिए एक नया अलग लॉगर बनाना है। यह लॉगरों की वृद्धि को बढ़ावा देता है और लॉगिंग के प्रबंधन ओवरहेड को बढ़ाता है।
एक हल्की तकनीक एक ही क्लाइंट इंटरैक्शन से शुरू होने वाले प्रत्येक लॉग अनुरोध को विशिष्ट रूप से स्टैम्प करना है। Neil Harrison ने इस विधि का वर्णन पुस्तक "Patterns for Logging Diagnostic Messages," in Pattern Languages of Program Design 3, R. Martin, D. Riehle, और F. Buschmann द्वारा संपादित (Addison-Wesley, 1997) में किया है। जिस तरह एक मछली को टैग किया जा सकता है और उसकी गति को ट्रैक किया जा सकता है, उसी तरह लॉग घटनाओं को एक सामान्य टैग या डेटा तत्वों के सेट के साथ स्टैम्प करने से किसी लेन-देन या अनुरोध के पूर्ण प्रवाह को ट्रैक किया जा सकता है। हम इसे Fish Tagging कहते हैं।
Log4j Fish Tagging करने के लिए दो तंत्र प्रदान करता है; Thread Context Map और Thread Context Stack. Thread Context Map किसी भी संख्या में आइटम जोड़ने और key/value जोड़ियों का उपयोग करके उन्हें पहचानने की अनुमति देता है। Thread Context Stack एक या अधिक आइटम को Stack पर धकेलने और फिर Stack में उनके क्रम या डेटा द्वारा ही पहचाने जाने की अनुमति देता है। चूंकि key/value जोड़ियाँ अधिक लचीली होती हैं, Thread Context Map की सिफारिश तब की जाती है जब डेटा आइटम अनुरोध के प्रसंस्करण के दौरान जोड़े जा सकते हैं या जब एक या दो से अधिक आइटम हों।
Thread Context Stack का उपयोग करके प्रत्येक अनुरोध को विशिष्ट रूप से स्टैम्प करने के लिए, उपयोगकर्ता Stack पर प्रासंगिक जानकारी धकेलता है।
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45046 https://logging.apache.org/log4j/2.x/manual/thread-context.html