ओपन सोर्स ऑपरेटिंग सिस्टम डिस्ट्रीब्यूशन OpenBSD sysadmins के बीच अच्छी तरह से जाना जाता है, विशेष रूप से वे जो सर्वर का प्रबंधन करते हैं, इसकी गति, सुविधाओं और फैंसी फ्रंट-एंड पर सुरक्षा पर ध्यान देने के लिए।
ठीक है, शायद, इसका लोगो एक पफर फिश है - फुलाया हुआ, इसके स्पाइक्स किसी भी चालाक हैकर्स को पीछे हटाने के लिए तैयार हैं जो साथ आ सकते हैं।
लेकिन OpenBSD टीम शायद अपने पूरे डिस्ट्रो के लिए नहीं, बल्कि रिमोट एक्सेस टूलकिट के लिए जानी जाती है OpenSSH जिसे 1990 के दशक के अंत में ऑपरेटिंग सिस्टम में शामिल करने के लिए लिखा गया था।
एसएसएच, के लिए छोटा सुरक्षित खोल, मूल रूप से फिनिश कंप्यूटर वैज्ञानिक द्वारा बनाया गया था टाटू यलोनन 1990 के दशक के मध्य में टेलनेट प्रोटोकॉल का उपयोग करने की जोखिम भरी आदत से sysadmins को छुड़ाने की उम्मीद में।
टेलनेट के साथ परेशानी
टेलनेट उल्लेखनीय रूप से सरल और प्रभावी था: रिमोट सर्वर से टेलीटाइप कनेक्शन बनाने के लिए भौतिक तारों को जोड़ने (या एक टेलीफोन लाइन पर एक मॉडेम का उपयोग करने) के बजाय, आपने इसके बजाय एक टेलीटाइप नेटवर्क कनेक्शन का उपयोग किया।
मूल रूप से, डेटा जो आमतौर पर एक समर्पित सीरियल कनेक्शन या डायल-अप फोन लाइन पर आगे और पीछे प्रवाहित होता है, सर्किट-स्विच्ड पॉइंट-टू-पॉइंट लिंक के बजाय पैकेट-स्विच्ड टीसीपी नेटवर्क कनेक्शन का उपयोग करके इंटरनेट पर भेजा और प्राप्त किया गया था। .
समान परिचित लॉगिन प्रणाली, सस्ते कनेक्शन, समर्पित डेटा लाइनों की कोई आवश्यकता नहीं!
टेलनेट में विशाल दोष, निश्चित रूप से, इसकी एन्क्रिप्शन की कुल कमी थी, ताकि आपके सटीक टर्मिनल सत्र को सूँघना तुच्छ हो, जिससे क्रैकर्स आपके द्वारा टाइप की गई हर कमांड को देख सकें (यहां तक कि आपके द्वारा की गई गलतियाँ, और हर बार जब आप हिट करते हैं) [Backspace]
), और उत्पादन के हर बाइट का उत्पादन किया ...
…और निश्चित रूप से सत्र की शुरुआत में आपका उपयोगकर्ता नाम और पासवर्ड।
आपके नेटवर्क पथ पर कोई भी व्यक्ति न केवल आसानी से आपके sysadmin सत्रों को वास्तविक समय में अपनी स्क्रीन पर फिर से बना सकता है, बल्कि संभवत: आपके द्वारा दूरस्थ सर्वर पर भेजे गए आदेशों को संशोधित करके और वापस आने वाले नकली उत्तरों को संशोधित करके आपके सत्र के साथ छेड़छाड़ भी कर सकता है, इसलिए आपने ध्यान नहीं दिया चाल।
वे एक ढोंग सर्वर भी स्थापित कर सकते हैं, आपको इसके लिए आकर्षित कर सकते हैं, और आपके लिए धोखे का पता लगाना आश्चर्यजनक रूप से कठिन बना सकते हैं।
मजबूत एन्क्रिप्शन FTW
य्लोनेन के एसएसएच का उद्देश्य टेलनेट जैसे सत्र के प्रत्येक छोर पर मजबूत एन्क्रिप्शन और प्रमाणीकरण की एक परत जोड़ना है, जिससे एक सुरक्षित खोल (यदि आपने कभी सोचा है, तो नाम का मतलब यही है, हालांकि लगभग हर कोई इसे कहता है निबंध-निबंध-ऐच आये दिन)।
यह एक त्वरित हिट था, और हर जगह sysadmins द्वारा प्रोटोकॉल को जल्दी से अपनाया गया था।
जैसा कि हमने ऊपर उल्लेख किया है, OpenSSH ने जल्द ही अनुसरण किया, पहली बार 1999 के अंत में ओपनबीएसडी 2.6 रिलीज.
OpenBSD टीम उस प्रोटोकॉल का एक मुफ़्त, विश्वसनीय, खुला-स्रोत कार्यान्वयन बनाना चाहती थी जिसे वे और कोई और इस्तेमाल कर सकता है, बिना किसी लाइसेंसिंग या व्यावसायिक जटिलताओं के, जिसने रिलीज़ होने के तुरंत बाद के वर्षों में य्लोनेन के मूल कार्यान्वयन को रोक दिया था।
वास्तव में, यदि आप Windows SSH सर्वर चलाते हैं और इसे अभी Linux कंप्यूटर से कनेक्ट करते हैं, तो आप निश्चित रूप से दोनों सिरों पर OpenSSH कार्यान्वयन पर निर्भर होंगे।
SSH प्रोटोकॉल का उपयोग SCP और SFTP सहित अन्य लोकप्रिय क्लाइंट-सर्वर सेवाओं में भी किया जाता है, जिसका संक्षिप्त नाम है सुरक्षित प्रति और सुरक्षित एफ़टीपी क्रमश। SSH का शिथिल अर्थ है, "सुरक्षित रूप से कनेक्ट करें और दूसरे छोर पर एक कमांड SHell चलाएं", आमतौर पर इंटरएक्टिव लॉगिन के लिए, क्योंकि कमांड शेल के लिए यूनिक्स प्रोग्राम आमतौर पर होता है। /bin/sh
. एससीपी समान है, लेकिन फाइलों को कॉपी करने के लिए, क्योंकि यूनिक्स फाइल-कॉपी कमांड को आम तौर पर कहा जाता है /bin/cp
, और SFTP का नाम लगभग उसी तरह रखा गया है।
ओपनएसएसएच शहर में एकमात्र एसएसएच टूलकिट नहीं है।
अन्य प्रसिद्ध कार्यान्वयन में शामिल हैं: libssh2, उन डेवलपर्स के लिए जो सीधे अपने स्वयं के अनुप्रयोगों में SSH समर्थन बनाना चाहते हैं; भालू ड्रॉप, ऑस्ट्रेलियाई सांकेतिक शब्दों में बदलने वाला एक स्ट्रिप-डाउन SSH सर्वर मैट जॉनसन यह तथाकथित IoT (इंटरनेट ऑफ थिंग्स) उपकरणों जैसे होम राउटर और प्रिंटर पर व्यापक रूप से पाया जाता है; और पुट्टी, इंडी ओपन-सोर्स डेवलपर की ओर से विंडोज के लिए एसएसएच-संबंधित उपकरणों का एक लोकप्रिय, मुफ्त संग्रह साइमन ताथाम इंग्लैंड में।
लेकिन यदि आप एक नियमित एसएसएच उपयोगकर्ता हैं, तो आप लगभग निश्चित रूप से आज कम से कम एक ओपनएसएसएच सर्वर से जुड़े हैं, कम से कम नहीं क्योंकि अधिकांश समकालीन लिनक्स वितरण में इसे उनके मानक रिमोट एक्सेस टूल के रूप में शामिल किया गया है, और माइक्रोसॉफ्ट ओपनएसएसएच क्लाइंट और ओपनएसएसएच दोनों प्रदान करता है। सर्वर इन दिनों आधिकारिक विंडोज घटकों के रूप में।
डबल-फ्री बग फिक्स
ओपनएसएसएच संस्करण 9.2 अभी बाहर आया, और रिलीज नोट्स निम्नानुसार रिपोर्ट करें:
इस रिलीज़ में स्मृति सुरक्षा समस्या […] के लिए फ़िक्सेस शामिल हैं। [यह बग] शोषक नहीं माना जाता है, लेकिन हम अधिकांश नेटवर्क-पहुंच योग्य स्मृति दोषों को सुरक्षा बग के रूप में रिपोर्ट करते हैं।
बग प्रभावित करता है sshd
, OpenSSH सर्वर (the -d
प्रत्यय का बोध होता है डेमॉन, उस प्रकार की पृष्ठभूमि प्रक्रिया के लिए यूनिक्स नाम जिसे विंडोज़ कॉल करता है a सेवा):
एसएसडीडी (8): ओपनएसएसएच 9.1 में पेश किए गए प्री-ऑथेंटिकेशन डबल-फ्री मेमोरी फॉल्ट को ठीक करें। इसे शोषक नहीं माना जाता है, और यह अप्रतिबंधित पूर्व-लेखन प्रक्रिया में होता है जो चेरोट (2) के अधीन होता है और आगे अधिकांश प्रमुख प्लेटफार्मों पर सैंडबॉक्स किया जाता है।
एक डबल-फ्री बग का मतलब है कि एक मेमोरी ब्लॉक जिसे आप पहले ही ऑपरेटिंग सिस्टम में अपने प्रोग्राम के अन्य भागों में पुन: उपयोग करने के लिए वापस कर चुके हैं ...
...बाद में कार्यक्रम के एक हिस्से द्वारा फिर से वापस सौंप दिया जाएगा जो वास्तव में उस स्मृति का "स्वामित्व" नहीं रखता है, लेकिन यह नहीं जानता कि यह नहीं है।
(या जानबूझकर कोड के संकेत पर वापस सौंप दिया गया है जो बग को चालू करने के उद्देश्य से बग को भड़काने की कोशिश कर रहा है भेद्यता एक में शोषण करना.)
यह सूक्ष्म और कठिन-से-सुलझाने वाली बग को जन्म दे सकता है, खासकर यदि सिस्टम मुक्त-अप ब्लॉक को उपलब्ध के रूप में चिह्नित करता है जब पहली बार free()
होता है, बाद में जब यह मेमोरी के माध्यम से पूछता है तो इसे आपके कोड के दूसरे हिस्से में आवंटित करता है malloc(
), और फिर ब्लॉक को एक बार फिर से चिह्नित करता है जब ज़रूरत से ज़्यादा कॉल करता है free()
प्रकट होता है।
यह आपको उस तरह की स्थिति में छोड़ देता है जब आप एक होटल में जांच करते हैं जो कहता है, "ओह, अच्छी खबर! हमें लगा कि हमारा पेट भर गया है, लेकिन एक और मेहमान ने अभी जल्दी चेक आउट करने का फैसला किया, ताकि आप उनका कमरा ले सकें।"
यहां तक कि अगर कमरा बड़े करीने से साफ किया गया है और जब आप अंदर जाते हैं तो नए रहने वालों के लिए तैयार होते हैं, और ऐसा लगता है कि यह आपके विशेष उपयोग के लिए उचित रूप से आवंटित किया गया था, आपको अभी भी भरोसा करना होगा कि पिछले अतिथि का कीकार्ड वास्तव में सही ढंग से रद्द कर दिया गया था, और यह कि उनका " जल्दी चेकआउट ”उसी दिन बाद में चुपके से वापस जाने और आपका लैपटॉप चुराने का एक चालाक चाल नहीं था।
बग फिक्स के लिए बग फिक्स
विडंबना यह है कि यदि आप हाल के ओपनएसएसएच कोड इतिहास को देखते हैं, तो आप देखेंगे कि ओपनएसएसएच नामक फ़ंक्शन में एक मामूली बग था। compat_kex_proposal()
, कनेक्शन स्थापित करते समय उपयोग करने के लिए किस प्रकार की कुंजी-विनिमय एल्गोरिदम की जांच करने के लिए उपयोग किया जाता है।
लेकिन उस मामूली बग को ठीक करने के बजाय एक और गंभीर भेद्यता पेश की गई।
वैसे, कनेक्शन के सेटअप के दौरान उपयोग किए जाने वाले सॉफ़्टवेयर के एक भाग में बग की उपस्थिति इसे एक तथाकथित बनाती है नेटवर्क-पहुंच योग्य पूर्व-प्रमाणीकरण भेद्यता (या पूर्व प्रमाणीकरण बग छोटे के लिए)।
डबल-फ्री बग उस कोड में होता है जिसे चलाने की आवश्यकता होती है बाद एक ग्राहक ने एक दूरस्थ सत्र शुरू किया है, लेकिन से पहले कोई भी कुंजी-समझौता या प्रमाणीकरण हुआ है, इसलिए सिद्धांत रूप में भेद्यता को सत्यापन के लिए किसी भी पासवर्ड या क्रिप्टोग्राफ़िक कुंजियों को प्रस्तुत करने से पहले ट्रिगर किया जा सकता है।
ओपनएसएसएच 9.0 में, compat_kex_proposal
कुछ इस तरह देखा (यहाँ बहुत सरलीकृत):
char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }
विचार यह है कि कॉलर मेमोरी के अपने स्वयं के ब्लॉक में गुजरता है जिसमें एक कुंजी-विनिमय सेटिंग का सुझाव देने वाली एक टेक्स्ट स्ट्रिंग होती है, और या तो वे भेजे गए सुझाव का उपयोग करने के लिए एक अनुमोदन प्राप्त करते हैं, या एक अद्यतन सुझाव के साथ एक नया आवंटित टेक्स्ट स्ट्रिंग .
बग यह है कि यदि स्थिति 1 झूठी है लेकिन स्थिति 2 और 3 दोनों सत्य हैं, कोड आवंटित करता है दो नए टेक्स्ट स्ट्रिंग्स, लेकिन केवल रिटर्न एक.
द्वारा आवंटित मेमोरी ब्लॉक allocatenewstring1()
कभी मुक्त नहीं होता है, और जब फ़ंक्शन वापस आता है, तो इसका स्मृति पता हमेशा के लिए खो जाता है, इसलिए किसी भी कोड के लिए कोई रास्ता नहीं है free()
यह भविष्य में।
उस ब्लॉक को अनिवार्य रूप से छोड़ दिया गया है, जिसके कारण क्या जाना जाता है स्मृति रिसाव.
समय के साथ, यह परेशानी का कारण बन सकता है, शायद मेमोरी ओवरलोड से पुनर्प्राप्त करने के लिए सर्वर को बंद करने के लिए मजबूर भी कर सकता है।
OpenSSH 9.1 में, दो स्ट्रिंग आवंटित करने से बचने के प्रयास में कोड को अपडेट किया गया था लेकिन उनमें से एक को छोड़ दिया गया था:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion){ char* previousone = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { previousone = suggestion; suggestion = allocatenewstring2(); } free(previousone); } if (isblank(suggestion()) { error(); } return suggestion; }
इसमें डबल-फ्री बग है, क्योंकि यदि स्थिति 1 और शर्त 2 दोनों गलत हैं, लेकिन शर्त 3 सत्य है, तो कोड अपने उत्तर के रूप में वापस भेजने के लिए एक नई स्ट्रिंग आवंटित करता है ...
...लेकिन उस स्ट्रिंग को गलत तरीके से मुक्त कर देता है जिसमें कॉल करने वाला मूल रूप से पास हुआ था, क्योंकि function allocatenewstring1()
चर को अद्यतन करने के लिए कभी नहीं बुलाया जाता है suggestion
.
पास-इन सुझाव स्ट्रिंग मेमोरी है जो कॉलर की है, और यह कि कॉल करने वाला बाद में खुद को मुक्त कर लेगा, जिससे दोहरा-मुक्त खतरा पैदा हो जाएगा।
OpenSSH 9.2 में, कोड अधिक सतर्क हो गया है, उपयोग किए गए सभी तीन संभावित मेमोरी ब्लॉक का ट्रैक रखता है: मूल suggestion
(स्मृति किसी और के स्वामित्व में), और दो संभावित नए तार जो रास्ते में आवंटित किए जा सकते हैं:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion) { char* newone = NULL; char* newtwo = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { newone = allocatenewstring1(); } if (condition3) { newtwo = allocatenewstring2(); } free(newone); newone = newtwo; } if (isblank(newone)) { error(); } return newone; }
यदि शर्त 1 सत्य है, तो पास-इन स्ट्रिंग की एक नई प्रति का उपयोग किया जाता है, ताकि कॉलर बाद में कर सके free()
जब भी वे चाहें उनकी पास-इन स्ट्रिंग की स्मृति।
यदि हमें पिछली स्थिति 1 मिलती है, और स्थिति 2 सत्य है, लेकिन स्थिति 3 गलत है, तो वैकल्पिक सुझाव किसके द्वारा बनाया गया है allocatenewstring1()
वापस हो जाता है, और पारित हो जाता है suggestion
स्ट्रिंग अकेली रह गई है।
यदि स्थिति 2 गलत है और स्थिति 3 सत्य है, तो एक नई स्ट्रिंग उत्पन्न होती है और वापस आती है, और पास-इन हो जाती है suggestion
स्ट्रिंग अकेली रह गई है।
अगर शर्त 2 और शर्त 3 दोनों सही हैं, तो रास्ते में दो नए तार आवंटित किए जाते हैं; पहला मुक्त हो जाता है क्योंकि इसकी आवश्यकता नहीं है; दूसरा वापस आ गया है; और उत्तीर्ण suggestion
स्ट्रिंग अकेली रह गई है।
आप ऐसा कर सकते हैं आरटीएक्सएम यह पुष्टि करने के लिए कि यदि आप कॉल करते हैं free(newone)
कब newone
is NULL
, फिर "कोई ऑपरेशन नहीं किया जाता", क्योंकि यह हमेशा सुरक्षित होता है free(NULL)
. फिर भी, बहुत सारे प्रोग्रामर अभी भी इसके खिलाफ कोड जैसे मजबूती से पहरा देते हैं if (ptr != NULL) { free(ptr); }
.
क्या करना है?
जैसा कि ओपनएसएसएच टीम ने सुझाव दिया है, इस बग का दोहन करना कठिन होगा, कम से कम सीमित विशेषाधिकारों के कारण नहीं sshd
कार्यक्रम के पास उपयोग के लिए कनेक्शन स्थापित करते समय है।
फिर भी, उन्होंने इसे सुरक्षा छेद के रूप में रिपोर्ट किया क्योंकि यह यही है, इसलिए सुनिश्चित करें कि आपने अपडेट किया है ओपनएसएसएच एक्सएनयूएमएक्स.
और यदि आप सी में कोड लिख रहे हैं, तो याद रखें कि आप चाहे कितने भी अनुभवी क्यों न हों, स्मृति प्रबंधन में गलती होना आसान है...
…इसलिए वहां ध्यान रखना।
(हां, रस्ट और उसके आधुनिक दोस्त करेंगे आपको सही कोड लिखने में मदद करता है, लेकिन कभी-कभी आपको अभी भी C का उपयोग करने की आवश्यकता होगी, और यहाँ तक कि Rust भी इसकी गारंटी नहीं दे सकता है आपको गलत कोड लिखना बंद करो यदि आप अविवेकपूर्ण ढंग से प्रोग्राम करते हैं!)
- एसईओ संचालित सामग्री और पीआर वितरण। आज ही प्रवर्धित हो जाओ।
- प्लेटोब्लॉकचैन। Web3 मेटावर्स इंटेलिजेंस। ज्ञान प्रवर्धित। यहां पहुंचें।
- स्रोत: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/