गंभीर सुरक्षा: GnuTLS OpenSSL का अनुसरण करता है, टाइमिंग अटैक बग को ठीक करता है

गंभीर सुरक्षा: GnuTLS OpenSSL का अनुसरण करता है, टाइमिंग अटैक बग को ठीक करता है

स्रोत नोड: 1956368

पिछले हफ्ते, हमने एक गुच्छा के बारे में लिखा था स्मृति प्रबंधन कीड़े जिन्हें लोकप्रिय ओपनएसएसएल एन्क्रिप्शन लाइब्रेरी के नवीनतम सुरक्षा अद्यतन में ठीक किया गया था।

उन मेमोरी बग्स के साथ, हमने डब किए गए बग पर भी सूचना दी CVE-2022-4304: RSA डिक्रिप्शन में टाइमिंग Oracle.

इस बग में, एक सर्वर पर एक ही एन्क्रिप्टेड संदेश को बार-बार फायर करना, लेकिन डेटा के अंत में पैडिंग को संशोधित करना, डेटा को अमान्य बनाने के लिए, और इस प्रकार किसी प्रकार के अप्रत्याशित व्यवहार को भड़काना ...

...यह मानते हुए कि आप नेटवर्क पर उस लक्ष्य के करीब थे, जिसके बारे में आप मज़बूती से अनुमान लगा सकते हैं कि प्रक्रिया के डेटा स्थानांतरण भाग में कितना समय लगेगा, लगातार समय नहीं लगेगा।

सभी डेटा समान रूप से संसाधित नहीं होते हैं

यदि आप किसी अनुरोध को बंद करते हैं, तो उत्तर में कितना समय लगता है, और नेटवर्क डेटा के निम्न-स्तर भेजने और प्राप्त करने में लगने वाले समय को घटा दें, आप जानते हैं कि अनुरोध को संसाधित करने के लिए सर्वर को आंतरिक गणना करने में कितना समय लगा .

यहां तक ​​​​कि अगर आप सुनिश्चित नहीं हैं कि नेटवर्क में कितना समय व्यतीत होता है, तो आप बहुत सारे अनुरोधों को दूर करके और नमूनों का भार एकत्र करके राउंड-ट्रिप समय में बदलाव देख सकते हैं।

यदि नेटवर्क यह मानने के लिए पर्याप्त विश्वसनीय है कि नेटवर्किंग ओवरहेड काफी हद तक स्थिर है, तो आप यह अनुमान लगाने के लिए सांख्यिकीय विधियों का उपयोग करने में सक्षम हो सकते हैं कि किस प्रकार के डेटा संशोधन के कारण किस प्रकार की अतिरिक्त प्रोसेसिंग देरी होती है।

इससे, आप मूल अनएन्क्रिप्टेड डेटा की संरचना, या यहां तक ​​कि सामग्री के बारे में कुछ अनुमान लगाने में सक्षम हो जाते हैं, जिसे प्रत्येक बार-बार अनुरोध के अंदर गुप्त रखा जाना चाहिए।

यहां तक ​​कि अगर आप केवल सादा पाठ का एक बाइट निकाल सकते हैं, ठीक है, ऐसा नहीं होना चाहिए।

तथाकथित समय के हमले इस तरह की चीजें हमेशा परेशानी होती हैं, भले ही आपको लाखों फर्जी पैकेट भेजने और उन सभी को समय देने की आवश्यकता हो, केवल एक बाइट के सादे डेटा को पुनर्प्राप्त करने का कोई मौका हो ...

…क्योंकि नेटवर्क कुछ साल पहले की तुलना में तेज़, अधिक अनुमानित और अधिक भार संभालने में सक्षम हैं।

आप सोच सकते हैं कि लाखों विश्वासघाती पैकेट आप पर स्पैम किए गए, मान लीजिए, अगले घंटे एक तरह के अंगूठे की तरह बाहर खड़े होंगे।

लेकिन "एक लाख पैकेट एक घंटे में सामान्य से अधिक या कम" बस अब कोई विशेष रूप से बड़ा बदलाव नहीं है।

GnuTLS में समान "ओरेकल" बग

खैर, वही व्यक्ति जिसने ओपनएसएसएल में फिक्स्ड-एट-लास्ट बग टाइमिंग बग की सूचना दी थी, ने भी रिपोर्ट की GnuTLS में समान बग उसी समय के बारे में।

इसमें बग पहचानकर्ता है CVE-2023-0361.

हालांकि GnuTLS OpenSSL की तरह लोकप्रिय या व्यापक रूप से उपयोग नहीं किया जाता है, आपके पास संभवतः आपके IT एस्टेट में या यहां तक ​​कि आपके अपने कंप्यूटर पर कई प्रोग्राम हैं, जो इसका उपयोग करते हैं या इसे शामिल करते हैं, संभवतः FFmpeg, GnuPG, Mplayer, QEMU सहित , डेस्कटॉप, सांबा, Wget और Wireshark।

विडंबना यह है कि जीएनयूटीएलएस में समय दोष उस कोड में दिखाई दिया जो पहली बार में टाइमिंग अटैक त्रुटियों को लॉग करने वाला था।

जैसा कि आप कोड अंतर से देख सकते हैं (diff) नीचे, प्रोग्रामर को पता था कि कोई भी सशर्त (if ... then) डिक्रिप्शन त्रुटि की जांच और निपटने में उपयोग किए जाने वाले ऑपरेशन समय भिन्नता उत्पन्न कर सकते हैं, क्योंकि सीपीयू आम तौर पर "शाखा" निर्देश के बाद आपका कोड किस तरह से जाता है, इसके आधार पर अलग-अलग समय लेता है।

(यह एक शाखा के लिए विशेष रूप से सच है जो अक्सर एक तरफ जाती है और दूसरी तरफ शायद ही कभी होती है, क्योंकि सीपीयू प्रदर्शन को बेहतर बनाने के लिए बार-बार चलने वाले कोड को याद करते हैं, या कैश करते हैं, इस प्रकार बार-बार लिया जाने वाला कोड पता लगाने में धीमा हो जाता है।)

3.7.8 के विरुद्ध gnutls-3.7.9/lib/auth/rsa.c का कोड अंतर

लेकिन प्रोग्रामर अभी भी लॉग इन करना चाहता था कि एक हमला हो सकता है, जो तब होता है जब if (ok) उपरोक्त परीक्षण विफल हो जाता है और शाखाएँ else { ... } अनुभाग।

इस बिंदु पर, कोड कॉल करता है _gnutls_debug_log() कार्य, जिसे अपना काम करने में काफी समय लग सकता है।

इसलिए सांकेतिक शब्दों में बदलनेवाला करने के लिए एक जानबूझकर कॉल डाला _gnutls_no_log() में then { ... } कोड का एक हिस्सा, जो एक "हमला" लॉग करने का नाटक करता है, जब कोई नहीं होता है, ताकि कोड किसी भी दिशा में खर्च किए जाने वाले समय को बढ़ाने की कोशिश कर सके। if (ok) शाखा निर्देश ले सकते हैं।

जाहिर है, हालांकि, दो कोड पथ उस समय पर्याप्त रूप से समान नहीं थे जब वे उपयोग किए गए थे (या शायद _gnutls_debug_log() विभिन्न प्रकार की त्रुटि से निपटने के लिए अपने आप में कार्य अपर्याप्त रूप से संगत था), और एक हमलावर दस लाख या इतने प्रयासों के बाद डिक्रिप्शन टेलटेल्स को अलग करना शुरू कर सकता है।

क्या करना है?

यदि आप एक प्रोग्रामर हैं: यहां बग फिक्स सरल था, और "कम ज्यादा है" सिद्धांत का पालन किया।

ऊपर गुलाबी रंग का कोड, जिसे वैसे भी बहुत उपयोगी हमले का पता लगाने वाला डेटा नहीं देने के लिए माना जाता था, बस हटा दिया गया था, इस आधार पर कि जो कोड नहीं है, उसे गलती से संकलित नहीं किया जा सकता है, चाहे आपकी बिल्ड सेटिंग कुछ भी हो ...

…और कोड जो संकलित नहीं है, कभी भी नहीं चल सकता है, चाहे दुर्घटना या डिज़ाइन द्वारा।

यदि आप GnuTLS उपयोगकर्ता हैं: हाल ही में जारी संस्करण 3.7.9 और "नया उत्पाद स्वाद" 3.8.0 यह सुधार, कई अन्य के साथ शामिल है।

यदि आप एक Linux डिस्ट्रो चला रहे हैं, तो आपके पास GnuTLS के किसी भी केंद्रीय-प्रबंधित साझा लाइब्रेरी संस्करण के साथ-साथ अपने स्वयं के संस्करण लाने वाले ऐप्स के अपडेट की जांच करें।

Linux पर, नाम वाली फ़ाइलें खोजें libgnutls*.so आस-पास पड़ी किसी भी साझा लाइब्रेरी को खोजने और खोजने के लिए gnutls-cli कमांड लाइन यूटिलिटी की किसी भी कॉपी को खोजने के लिए जो अक्सर लाइब्रेरी के साथ शामिल होती है।

तुम दौड़ सकते हो gnutls-cli -vv यह पता लगाने के लिए कि कौन सा संस्करण libgnutls यह गतिशील रूप से जुड़ा हुआ है:

 $ gnutls-cli -vv gnutls-cli 3.7.9 <- मेरे Linux डिस्ट्रो को पिछले शुक्रवार को अपडेट मिला (2023-02-10)

समय टिकट:

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