क्रोम शून्य-दिन: "यह शोषण जंगली में है", इसलिए अभी अपना संस्करण जांचें

क्रोम शून्य-दिन: "यह शोषण जंगली में है", इसलिए अभी अपना संस्करण जांचें

स्रोत नोड: 2704382

Google का नवीनतम Chrome अपडेट जारी हो गया है, और इस बार कंपनी इसके शब्दों को छोटा नहीं किया गया है इसमें शामिल दो सुरक्षा पैच में से एक के बारे में:

Google को पता है कि यह एक शोषण है CVE-2023-3079 जंगल में मौजूद है.

यह कहने के लिए कि कंपनी किसी शोषण की "रिपोर्टों से अवगत है" जैसा कि हमने पहले अक्सर Google में देखा है, दो-डिग्री-पृथक्करण की कोई शब्दावली नहीं है।

इस बार, यह "हम स्वयं इसके बारे में जानते हैं", जिसका अनुवाद और भी स्पष्ट रूप से "हम जानते हैं कि बदमाश इसका दुरुपयोग कर रहे हैं" में किया गया है, यह देखते हुए कि बग रिपोर्ट सीधे Google के अपने खतरा अनुसंधान समूह से आई है।

हमेशा की तरह, इसका तात्पर्य यह है कि Google एक सक्रिय हमले की जाँच कर रहा था (चाहे Google के विरुद्ध, या किसी बाहरी संगठन के विरुद्ध, हम नहीं जानते) जिसमें Chrome को पहले से अज्ञात सुरक्षा छेद द्वारा बंधक बना लिया गया था।

बग का वर्णन बस इस प्रकार किया गया है: V8 में कन्फ्यूजन टाइप करें। (समझ में आता है, Google इस स्तर पर इससे अधिक कुछ नहीं कह रहा है।)

जैसा कि हमने पहले बताया है, ए भ्रम टाइप करें बग तब होता है जब आप एक प्रोग्राम को डेटा का एक हिस्सा प्रदान करते हैं जिसे उसे एक तरह से पार्स करना, मान्य करना, प्रोसेस करना और उस पर कार्य करना होता है...

...लेकिन बाद में आप प्रोग्राम को धोखा देकर डेटा की अलग, अनधिकृत, अमान्य और संभावित रूप से खतरनाक तरीके से व्याख्या करने में कामयाब हो जाते हैं।

प्रकार के भ्रम के खतरों की व्याख्या की गई

कल्पना कीजिए कि आप सी में एक प्रोग्राम लिख रहे हैं। (इससे कोई फर्क नहीं पड़ता कि आप सी जानते हैं या नहीं, आप वैसे भी इसका अनुसरण कर सकते हैं।)

सी में, आप आमतौर पर वेरिएबल्स को व्यक्तिगत रूप से घोषित करते हैं, इस प्रकार न केवल मेमोरी को आरक्षित करते हैं जहां उन्हें संग्रहीत किया जा सकता है, बल्कि प्रोग्राम को यह संकेत भी दिया जाता है कि उन वेरिएबल्स का उपयोग कैसे किया जाना चाहिए।

उदाहरण के लिए:

 लंबा लंबा int जूलियनडेनंबर; हस्ताक्षरित वर्ण* ग्राहक नाम;

पहली परिवर्तनीय घोषणा में खगोलीय दिन संख्या का प्रतिनिधित्व करने वाले एक सादे पुराने पूर्णांक मान को संग्रहीत करने के लिए 64 बिट्स आरक्षित हैं। (यदि आप सोच रहे हैं, तो आज दोपहर जेडीएन 23157 है - जूलियन डेज़ दोपहर से शुरू होते हैं, आधी रात से नहीं, क्योंकि खगोलशास्त्री अक्सर रात में काम करते हैं, आधी रात उनके कार्य दिवस का मध्य होता है।)

दूसरा मेमोरी एड्रेस संग्रहीत करने के लिए 64 बिट्स आरक्षित रखता है जहां ग्राहक के नाम की टेक्स्ट स्ट्रिंग पाई जा सकती है।

जैसा कि आप कल्पना कर सकते हैं, बेहतर होगा कि आप इन दोनों मानों को न मिलाएं, क्योंकि एक संख्या जो समझ में आती है, और सुरक्षित है, एक दिन की संख्या के रूप में उपयोग करने के लिए, जैसे कि 23157, मेमोरी पते के रूप में उपयोग करने के लिए लगभग निश्चित रूप से असुरक्षित होगी।

जैसा कि आप चल रहे विंडोज प्रोग्राम के इस मेमोरी डंप से देख सकते हैं, उपयोग के लिए आवंटित सबसे कम मेमोरी एड्रेस शुरू होता है 0x00370000, जो दशमलव में 3,604,480 है, किसी भी समझदार दिन संख्या से कहीं अधिक बड़ा है।

विंडोज़ द्वारा उपयोग किए जाने वाले वास्तविक मेमोरी पते समय के साथ बेतरतीब ढंग से बदलते रहते हैं, जिससे बदमाशों के लिए आपके मेमोरी लेआउट का अनुमान लगाना कठिन हो जाता है, इसलिए यदि आप एक ही प्रोग्राम चलाते हैं, तो आपको मान मिलेंगे, लेकिन फिर भी वे समान होंगे:

और (हालाँकि यह ऊपर की छवि के नीचे है) जब यह प्रोग्राम चलता है तो रनटाइम उपयोगकर्ता डेटा अनुभाग के मेमोरी पते 0x01130000 सेवा मेरे 0x01134FFF, 22 जुलाई 44631 से 16 अगस्त 44687 की असंभावित तिथि सीमा का प्रतिनिधित्व करता है।

वास्तव में, यदि आप उन दो चरों को मिलाने का प्रयास करते हैं, तो कंपाइलर को आपको चेतावनी देने का प्रयास करना चाहिए, उदाहरण के लिए इस तरह:

 जूलियनडेनंबर = ग्राहक नाम; ग्राहकनाम = जूलियनडेनंबर; चेतावनी: असाइनमेंट कास्ट के बिना पॉइंटर से पूर्णांक बनाता है चेतावनी: असाइनमेंट कास्ट के बिना पूर्णांक से पॉइंटर बनाता है

अब, यदि आपने कभी C में प्रोग्राम किया है, तो आपको पता होगा कि सुविधा के लिए, आप इसका उपयोग करके कई अलग-अलग व्याख्याओं के साथ वेरिएबल घोषित कर सकते हैं। union कीवर्ड, इस तरह:

 संघ {लंबा लंबा int जूलियनडेन्यूमर; हस्ताक्षरित वर्ण* ग्राहक नाम; } डेटा;

अब आप मेमोरी में बिल्कुल एक ही वेरिएबल को दो अलग-अलग तरीकों से संदर्भित कर सकते हैं।

यदि आप लिखते हैं data.JulianDayNumber, आप जादुई ढंग से संग्रहीत डेटा को एक पूर्णांक के रूप में व्याख्या करते हैं, लेकिन लिखते हुए data.CustomerName कंपाइलर को बताता है कि आप एक मेमोरी एड्रेस का संदर्भ दे रहे हैं, भले ही आप उसी संग्रहीत डेटा तक पहुंच रहे हों।

आप जो कर रहे हैं, कमोबेश, कंपाइलर को यह स्वीकार करना है कि आप कभी-कभी प्राप्त डेटा को एक तारीख के रूप में मानेंगे, और अन्य समय में एक मेमोरी एड्रेस के रूप में, और वह आप यह याद रखने की ज़िम्मेदारी ले रहे हैं कि कौन सी व्याख्या किस क्षण लागू होती है कोड में

आप एक दूसरा वेरिएबल रखने का निर्णय ले सकते हैं, जिसे a के नाम से जाना जाता है tag (आम तौर पर एक पूर्णांक) आपके साथ जाने के लिए union इस बात पर नज़र रखने के लिए कि आप अभी किस प्रकार के डेटा के साथ काम कर रहे हैं, उदाहरण के लिए:

 संरचना { पूर्णांक टैग; संघ {लंबा लंबा int जूलियनडेन्यूमर; हस्ताक्षरित वर्ण* ग्राहक नाम; } डेटा; } कीमत;

आप यह तय कर सकते हैं कि कब value.tag इसके लिए सेट है 0, डेटा अभी तक उपयोग के लिए प्रारंभ नहीं किया गया है, 1 इसका मतलब है कि आप कोई तारीख संग्रहीत कर रहे हैं, 2 इसका मतलब है कि यह एक मेमोरी एड्रेस है, और कुछ भी त्रुटि को दर्शाता है।

खैर, बेहतर होगा कि आप किसी और को इसमें गड़बड़ी न करने दें value.tag सेटिंग, अन्यथा आपका प्रोग्राम नाटकीय रूप से दुर्व्यवहार कर सकता है।

इससे भी अधिक चिंताजनक उदाहरण कुछ इस प्रकार हो सकता है:

 संरचना { पूर्णांक टैग; // 1 = हैश, 2 = फ़ंक्शन पॉइंटर्स यूनियन {अहस्ताक्षरित चार हैश[16]; // या तो एक यादृच्छिक हैश संरचना संग्रहीत करें { void* openfunc; //या दो सावधानीपूर्वक-सत्यापित शून्य* क्लोज़फंक; // बाद में निष्पादित करने के लिए कोड पॉइंटर्स } सत्यापित करें; } } कीमत;

अब, हम मेमोरी के उसी ब्लॉक को ओवरलोड कर रहे हैं ताकि हम कभी-कभी इसका उपयोग 16-बाइट हैश को स्टोर करने के लिए कर सकें, और कभी-कभी दो 8-बाइट पॉइंटर्स को उन फ़ंक्शंस में स्टोर करने के लिए कर सकें जिन्हें हमारा प्रोग्राम बाद में कॉल करेगा।

जाहिर है, जब value.tag == 1, हमें अपने सॉफ़्टवेयर को यूनियन के लिए आवंटित मेमोरी में किसी भी 16-बाइट स्ट्रिंग को संग्रहीत करने में खुशी होगी, क्योंकि हैश छद्म यादृच्छिक हैं, इसलिए बाइट्स का कोई भी संग्रह समान रूप से संभव है।

लेकिन जब value.tag == 2, हमारे कोड को अतिरिक्त रूप से सावधान रहने की आवश्यकता होगी ताकि उपयोगकर्ता को बाद में निष्पादित करने के लिए अमान्य, अविश्वसनीय, अज्ञात फ़ंक्शन पते प्रदान करने की अनुमति न मिले।

अब कल्पना करें कि आप इस कोड के लिए एक मान सबमिट कर सकते हैं जबकि टैग 1 पर सेट था, इसलिए इसकी जाँच और सत्यापन नहीं हुआ...

...लेकिन बाद में, प्रोग्राम द्वारा वास्तव में संग्रहीत मूल्य का उपयोग करने से ठीक पहले, आप टैग को 2 पर स्विच करने के लिए कोड को धोखा देने में सक्षम थे।

कोड तब आपके अमान्य फ़ंक्शन पते को "ज्ञात और पहले से सत्यापित सुरक्षित" के रूप में स्वीकार करेगा (भले ही वे नहीं थे), और प्रोग्राम निष्पादन को मेमोरी में एक दुष्ट स्थान पर भरोसेमंद रूप से भेज देगा जिसे आपने पहले से चुपचाप चुना था।

और एक प्रकार के भ्रम बग में यही होता है, भले ही एक काल्पनिक और सरलीकृत उदाहरण का उपयोग करते हुए,

वह मेमोरी जिसका उपभोग करना सुरक्षित होता अगर उसे एक ही तरीके से संभाला जाता तो उसे दुर्भावनापूर्ण तरीके से वैकल्पिक, असुरक्षित तरीके से संसाधित करने के लिए प्रोग्राम में भेज दिया जाता है।

क्या करना है?

सुनिश्चित करें कि आपके पास क्रोम या क्रोमियम का नवीनतम संस्करण है।

आप क्रोम चाहते हैं 114.0.5735.106 या बाद में Mac और Linux पर, और 114.0.5735.110 या बाद में विंडोज़ पर।

क्रोमियम पर आधारित माइक्रोसॉफ्ट एज भी इस बग से प्रभावित है।

माइक्रोसॉफ्ट ने अब तक [2023-06-06T16:25:00Z] अवलोकन किया कि

Microsoft जंगल में मौजूद हालिया कारनामों से अवगत है। हम सुरक्षा पैच जारी करने पर सक्रिय रूप से काम कर रहे हैं।

एज वर्तमान में संस्करण 114.0.1823.37 पर है, इसलिए कुछ भी क्रमांकित है उससे बाद में इसमें Microsoft का CVE-2023-3079 पैच शामिल होना चाहिए।

अपने संस्करण की जांच करने और यदि कोई ऐसा संस्करण है जो आपको अभी तक प्राप्त नहीं हुआ है तो उसे अपडेट करने के लिए बाध्य करने के लिए:

  • Google क्रोम तीन बिंदु वाला मेन्यू (⋮) > मदद > क्रोम के बारे में
  • माइक्रोसॉफ्ट बढ़त। सेटिंग्स और अधिक (...) > सहायता और प्रतिक्रिया > माइक्रोसॉफ्ट एज के बारे में

आपका स्वागत है।


समय टिकट:

से अधिक नग्न सुरक्षा