
Java JAR/WAR आर्टिफैक्ट्स में असुरक्षित Apache Commons Text का पता लगाएँ और उसे पैच करें; क्लासेस का फ़िंगरप्रिंट लें और CVE-2022-42889 (Text4Shell) कॉल साइट्स के लिए बाइटकोड स्कैन करें।
खोजने के लिए क्लिक करें:
CVE-2022-42889 जावा-आधारित अनुप्रयोगों की एक विस्तृत श्रृंखला के लिए एक गंभीर खतरा पैदा कर सकता है। इस संदर्भ में एक डेवलपर जो महत्वपूर्ण प्रश्न पूछ सकता है वे हैं:
commons-text शामिल है? कौन से संस्करण?क्या रिलीज़ किए गए कोड में commons-text शामिल है? उसमें लाइब्रेरी का कौन सा संस्करण शामिल है? दो कारकों के कारण इन प्रश्नों का उत्तर तुरंत नहीं मिल सकता है:
ट्रांज़िटिव निर्भरताएँ: जबकि commons-text प्रोजेक्ट की प्रत्यक्ष निर्भरता सूची में नहीं हो सकता है, इसका उपयोग किसी अन्य निर्भरता द्वारा अप्रत्यक्ष रूप से किया जा सकता है।
इस लाइब्रेरी का कोड सीधे एक अलग फ़ाइल के रूप में प्रकट नहीं हो सकता है, बल्कि इसे किसी अन्य कोड जार फ़ाइल में बंडल किया जा सकता है।
JFrog इस समस्या को हल करने में मदद के लिए एक टूल जारी कर रहा है: scan_commons_text_versions। यह टूल StringLookupFactory के क्लास कोड को खोजता है (चाहे .jar फ़ाइल नाम और pom.xml फ़ाइलों की सामग्री कुछ भी हो), और ऑब्जेक्ट के संस्करणों का फिंगरप्रिंट लेने का प्रयास करता है ताकि रिपोर्ट कर सके कि शामिल commons-text संस्करण असुरक्षित है या नहीं।
commons-text फ़ंक्शनों का उपयोग करता है?यह प्रश्न उन मामलों के लिए प्रासंगिक है जहाँ डेवलपर यह सत्यापित करना चाहेगा कि कोडबेस में commons-text के कॉल संभावित रूप से हमलावर-नियंत्रित डेटा पास कर सकते हैं। जैसा कि एडवाइज़री में चर्चा की गई है, भेद्यता को ठीक करने का सबसे सुरक्षित तरीका उचित पैच लागू करना है, लेकिन अनपैच्ड commons-text की धारणा के तहत संभावित प्रभाव को नियंत्रित करना और सत्यापित करना कई स्थितियों में मूल्यवान हो सकता है।
scan_commons_text_calls_jar.py, जो संकलित .jar में असुरक्षित फ़ंक्शनों के कॉल का पता लगाता है, और निष्कर्षों को क्लास नाम और मेथड नाम के रूप में रिपोर्ट करता है जिसमें प्रत्येक कॉल दिखाई देती है।
commons-text जार फ़ाइलें हैं, मैं खतरनाक व्यवहार को जल्दी से कैसे अक्षम कर सकता हूँ?अपडेट करना सबसे अच्छा समाधान है - यह समाधान तेज़ हॉट पैचिंग के लिए है
CVE-2022-42889 भेद्यता के संदर्भ में, commons-text में क्लास org/apache/commons/text/lookup/ScriptStringLookup उन स्क्रिप्टों के निष्पादन को सक्षम करता है जो हमलावर-नियंत्रित स्रोत से प्राप्त स्ट्रिंग में ${script} के माध्यम से एम्बेडेड हो सकती हैं। इसलिए, ScriptStringLookup.lookup फ़ंक्शन का आह्वान इस कार्यक्षमता के सक्रिय होने का संकेत है।
हम एक टूल, Text4ShellPatch प्रदान करते हैं, जो इस विशेष कॉल को पैच करने की अनुमति देता है ताकि स्क्रिप्ट निष्पादन कार्यक्षमता का उपयोग न किया जा सके। पैच लागू करने के बाद, लाइब्रेरी हमेशा एक चेतावनी संदेश लौटाने वाली स्क्रिप्ट निष्पादित करेगी (संभावित रूप से हमलावर-नियंत्रित कोड के बजाय)
इसी तरह, DNS और URL लुकअप ${dns} और ${url} के माध्यम से हमलावर द्वारा नियंत्रित किए जाने पर अविश्वसनीय सामग्री लोड कर सकते हैं, इस प्रकार, उनके संबंधित लुकअप DnsStringLookup और UrlStringLookup को पैच के माध्यम से अक्षम किया जा सकता है ताकि चेतावनी संदेश लौटाया जा सके,
पैच को किसी विशिष्ट जार फ़ाइल पर लागू किया जा सकता है, केवल script लुकअप के लिए या , और के लिए बेहतर सुरक्षा हेतु यदि इनका उपयोग अनुप्रयोग में करने का इरादा नहीं है,
commons-text जार की स्कैनिंग और पैचिंग को स्वचालित कर सकता हूँ?हमारे दो टूल मिलकर असुरक्षित commons-text जार फ़ाइलों को स्कैन और पैच करने की क्षमता प्रदान करते हैं।
इस Github रिपॉजिटरी में scan_and_patch.sh नाम से एक उदाहरण bash स्क्रिप्ट मौजूद है। मूल रूप से, यह किसी विशिष्ट root-folder के अंतर्गत असुरक्षित संस्करण वाली commons-text जार फ़ाइलों को खोजने के लिए scan_commons_text_versions.py स्क्रिप्ट का उपयोग करता है और उनके विरुद्ध Text4ShellPatch टूल को निम्नानुसार चलाता है।

scan_commons_text_versions.pypython scan_commons_text_versions.py root-folder [-quiet] [-exclude folder1 folder2 ..]
यह टूल root_folder को पुनरावर्ती रूप से .jar और .war फ़ाइलों के लिए स्कैन करेगा; प्रत्येक मिली फ़ाइल में टूल StringLookupFactory.class की खोज करता है (प्रत्येक .jar फ़ाइल में पुनरावर्ती रूप से)। यदि कम से कम एक क्लास मिलती है, तो टूल उसके संस्करण का फिंगरप्रिंट लेने का प्रयास करता है (पैच और बैकपोर्ट पैच में पाए जाने वाले कुछ बदलावों सहित) ताकि यह रिपोर्ट कर सके कि कोड असुरक्षित है या नहीं।
-quiet फ़्लैग के साथ, केवल संस्करण निष्कर्ष मुद्रित होते हैं, और अन्य संदेश (फ़ाइलें नहीं मिलीं / आर्काइव खोलने में विफल / पासवर्ड संरक्षित आर्काइव) म्यूट कर दिए जाते हैं।
-exclude (वैकल्पिक) के बाद आने वाले फ़ोल्डरों को छोड़ दिया जाता है।
scan_commons_text_calls_jar.pyइस टूल के लिए python 3 और निम्नलिखित तृतीय-पक्ष लाइब्रेरी की आवश्यकता होती है: jawa, tqdm, easyargs, colorama
pip install -r requirements.txt
डिफ़ॉल्ट उपयोग मामला:
python scan_commons_text_calls_jar.py root-folder
यह root-folder में सभी .jar फ़ाइलों को पुनरावर्ती रूप से स्कैन करेगा, और प्रत्येक के लिए StringSubstitutor/StringLookup के lookup/replace/replaceIn मेथडों के कॉल के स्थान (क्लास नाम और मेथड नाम) प्रिंट करेगा।
निम्नलिखित कमांड लाइन फ़्लैग का उपयोग करके टूल को अतिरिक्त उपयोग मामलों के लिए कॉन्फ़िगर किया जा सकता है।
text_4_shell_patchjava -jar Text4ShellPatch.jar TARGET_JAR [PATCHING_MODE]
Where TARGET_JAR is the application to patch and PATCHING_MODE is
0 (default): Patch Script lookup
1: Patch Script + DNS + URL lookups
[Note: The original Jar will be kept in the same folder with the .orig.jar extension]
यह टूल दिए गए commons-text जार में org/apache/commons/text/lookup/ScriptStringLookup क्लास को खोजेगा और lookup() फ़ंक्शन की सामग्री को चेतावनी संदेश से बदल देगा और फ़ंक्शन से बाहर लौट जाएगा। इस प्रकार, नई ScriptStringLookup क्लास में eval मौजूद नहीं होगा।
यह DnsStringLookup और URLStringLookup क्लासों को भी पैच कर सकता है और PATCHING_MODE विकल्प को 1 पर सेट करने पर lookup() फ़ंक्शन को अक्षम कर सकता है।
इस प्रक्रिया के दौरान मूल जार के समान पथ में .orig.jar एक्सटेंशन के साथ एक बैकअप फ़ाइल तैयार की जाती है।
Text4ShellPatch को Maven के साथ सरल कमांड का उपयोग करके संपादित और संकलित किया जा सकता है:
mvn clean assembly:single। यह target/ फ़ोल्डर में एक Text4ShellPatch.jar फ़ाइल बनाएगा।
scriptdnsurlपैच वाली फ़ाइल से बदले जाने से पहले मूल जार के समान स्थान पर एक बैकअप तैयार किया जाता है। बैकअप फ़ाइल नाम निम्न पैटर्न का पालन करता है: <original_jar_name>_YYYY.MM.DD_HH.mm.ss.orig.jar जहाँ YYYY, MM, DD क्रमशः वर्ष, माह और दिन हैं, और HH, mm, ss क्रमशः घंटे, मिनट और सेकंड हैं।
commons-text के असुरक्षित संस्करणों का पता लगाना और उन्हें स्वचालित रूप से पैच करना भी संभव है, जैसा कि अगला प्रश्न उत्तर देता है।
| फ़्लैग | डिफ़ॉल्ट मान | उपयोग |
|---|
--class_regex | (.*StringSubstitutor|.*StringLookup) | आवश्यक क्लास नाम के लिए रेगुलर एक्सप्रेशन |
--method_regex | (lookup|replace|replaceIn) | आवश्यक मेथड नाम के लिए रेगुलर एक्सप्रेशन |
--quickmatch_string | (StringLookup|StringSubstitutor) | फ़ाइल विश्लेषण के लिए पूर्व-शर्त: निर्दिष्ट regex वाली नहीं मिलने वाली .jar फ़ाइलों को अनदेखा किया जाएगा |
--class_existence | सेट नहीं | जब सेट न हो, regexes द्वारा निर्दिष्ट क्लास::मेथड कॉल खोजें। जब सेट हो, --method_regex अनदेखा किया जाता है, और टूल जार में --class_regex द्वारा निर्दिष्ट क्लासों के अस्तित्व की खोज करेगा। |
--no_quickmatch | सेट नहीं | जब सेट हो, --quickmatch_string का मान अनदेखा किया जाता है और सभी जार फ़ाइलों का विश्लेषण किया जाता है |
--caller_block | .*org/apache/commons/text | यदि कॉलर क्लास इस regex से मेल खाती है, तो इसे प्रदर्शित नहीं किया जाएगा |