शेलशॉक (दूरस्थ शोषण CVE-2014-6271 और CVE-2014-7169) से बचने के लिए मैं बैश को कैसे पुनः स्थापित कर सकता हूं?


368

यह देखते हुए कि बैश 3.2 (ओएस एक्स द्वारा शिप किया गया संस्करण) "शेल शॉक" ( CVE-2014-6271 और CVE-2014-7169 ) के रूप में ज्ञात दूरस्थ निष्पादन कारनामे के प्रति संवेदनशील है, मैं कैसे बैश का पुनर्निर्माण करता हूं और अपने सिस्टम को आगे से सुरक्षित करता हूं आधिकारिक एप्पल पैच?

अद्यतन: ध्यान दें कि Apple ने अब आधिकारिक पैच जारी कर दिया है। विवरण के लिए नीचे देखें।


5
Apple ने एक फ़िक्स जारी किया है: support.apple.com/kb/DL1769
AT

1
ऊपर वर्णित OS X bash अपडेट 1.0 पैच OS X 10.9.5 या बाद के संस्करण के लिए विशिष्ट है - यहाँ उन सभी को दिया गया है: OS X 10.7.5 (Lion), OS X 10.8.5 (माउंटेन लायन), OS X 10.9.5 ( मावेरिक्स)।
l'L'l

हां, मेरे पास 9 घंटे पहले लिंक थे लेकिन वे गलत तरीके से हटा दिए गए थे। Apple.stackexchange.com/revisions/146849/10
AlBlue

एक gist बनाया। gist.github.com/dnozay/395dcdef05c6b4b1836a जिसमें अधिकांश चरण हैं और पहले से ही पैच शामिल हैं (और OSX 10.6 पर काम करना चाहिए)।
dnozay

@ gnozay आपके जिस्म के लिए धन्यवाद! पैच 55 और 56 (पहले से ही बाहर) और 57 (जल्द ही बाहर होने) को शामिल करने के लिए इसे अपडेट करें।
ओल्ड प्रो

जवाबों:


429

स्थिति

Apple ने शेलशॉक और संबंधित कमजोरियों के लिए बैश सिक्योरिटी फिक्स को " OS X बैश अपडेट 1.0 " के रूप में जारी किया है । उन्हें OS X Mountain Lion v10.8.5 या OS X Mavericks v10.9.5 का उपयोग करने वाले लोगों के लिए सामान्य सिस्टम अपडेट के माध्यम से स्थापित किया जा सकता है (वे सुरक्षा अद्यतन 2014-005 में शामिल हैं ) और मैन्युअल रूप से भी इंस्टॉल किए जा सकते हैं। ओएस एक्स लायन v10.7.5 और ओएस एक्स लायन सर्वर v10.7.5 के लिए आधिकारिक ऐप्पल फिक्स भी उपलब्ध हैं, लेकिन ये केवल मैनुअल डाउनलोड के माध्यम से उपलब्ध हैं। ऑपरेटिंग सिस्टम संस्करण पर आधारित विभिन्न URL के माध्यम से सुरक्षा फ़िक्सेस उपलब्ध हैं:

(यदि नए पैच जारी किए गए हैं, तो उन्हें यहां रखें लेकिन कृपया इन मौजूदा लोगों को संदर्भ के लिए रखें।)

Apple पैच शेलशॉक और कई अन्य कमजोरियों का ख्याल रखता है और ज्यादातर लोगों के लिए ठीक है। tl; dr लोग यहां पढ़ना बंद कर सकते हैं।

फिर भी, शेलशॉक बग पर ध्यान आकर्षित करने के कारण कई शोधकर्ताओं ने बैश पर कठोर नज़र डाली और अधिक से अधिक (शोषण करने के लिए कठिन) कमजोरियों को ढूंढा जा रहा है। यदि आप सुरक्षा के बारे में अत्यधिक चिंतित हैं (क्योंकि हो सकता है कि आप ओएस एक्स सर्वर को सार्वजनिक रूप से उपलब्ध वेब साइट की मेजबानी के लिए चला रहे हों) तो आप चाहते हैं कि वे कमजोरियों और पैच के साथ बने रहें (क्योंकि वे खुद को कोसने से बचते हैं)। अन्यथा, इसके बारे में चिंता न करें।

भविष्य में कुछ समय के लिए किसी अन्य अपडेट को जारी करने के लिए ऐप्पल की तलाश करें जब धूल आगे की कमज़ोरियों का पता लगा ले।


बैश 3.2, पैच 52, 53, और 54 (जो बैश 4.3 पैच 25, 26 और 27 के अनुरूप हैं) के लिए बैश के पैच का एक आधिकारिक सेट उपलब्ध है जो CVE-2014-6271 और CVE-2014 -7169 दोनों को ठीक करता है, साथ ही नीचे 'गेम ओवर' प्रदर्शित किया गया है। यह मेरे ( @alblue ) द्वारा परीक्षण किया गया है और पोस्ट को तदनुसार अपडेट किया गया है (और फिर अतिरिक्त अपडेट किए गए थे: पोस्ट के लिए संशोधन 41 देखें जो पैच 54 पर रुकता है)।

बैश के खिलाफ कई अतिरिक्त कमजोरियां बताई गई हैं। मिशल ज़ाल्वेस्की की पोस्ट के अनुसार यदि आपके पास पैच 54 (और संभवतः एप्पल के आधिकारिक पैच) "इन व्यक्तिगत बगों की स्थिति के बारे में ध्यान देने का कोई मतलब नहीं है, क्योंकि उन्हें अब सुरक्षा जोखिम नहीं उठाना चाहिए:"

  • CVE-2014-6271 - स्टीफन द्वारा पाया गया मूल RCE। अन्य संस्करणों के लिए bash43-025 और इसी सेप 24 प्रविष्टियों द्वारा निर्धारित।

  • CVE-2014-7169 - फ़ाइल निर्माण / टोकन खपत बग तावीज़ द्वारा पाया गया। Bash43-026 और सह द्वारा निर्धारित (26 सितंबर)

  • CVE-2014-7186 - फ्लोरियन और टॉड द्वारा पाया गया संभवतः 10 सेकंड के लिए यहां कोई-सेक-रिस्क-डॉक्स क्रैश। Bash43-028 और सह द्वारा निर्धारित (1 अक्टूबर)।

  • सीवीई-2014-7187 - एक गैर-दुर्घटनाग्रस्त, शायद फ्लोरियन द्वारा बंद-एक-जोखिम-रहित। Bash43-028 और सह द्वारा निर्धारित (1 अक्टूबर)।

  • CVE-2014-6277 - अनइंस्टॉलिज्ड मैमोरी इश्यू, लगभग निश्चित रूप से मिशाल ज़ाल्स्की द्वारा पाया गया RCE। अभी तक कोई विशिष्ट पैच नहीं।

  • CVE-2014-6278 - Michal Zalewski द्वारा पाया गया कमांड इंजेक्शन RCE। अभी तक कोई विशिष्ट पैच नहीं।

यह बहुत भ्रामक हो जाता है। सौभाग्य से, चेत रमी, आधिकारिक बैश अनुचर ने पैच मैपिंग के लिए एक CVE पोस्ट किया । उनके पोस्ट में बैश 4.3 के लिए पैचेज का उल्लेख है, मैंने (@OldPro) ने उन्हें बैश 3.2 के लिए पैच का अनुवाद किया है, जो कि OS X पर लागू होता है।

 bash32-052      CVE-2014-6271                           2014-09-24
 bash32-053      CVE-2014-7169                           2014-09-26
 bash32-054      exported function namespace change      2014-09-27 ("Game Over")
 bash32-055      CVE-2014-7186/CVE-2014-7187             2014-10-01
 bash32-056      CVE-2014-6277                           2014-10-02
 bash32-057      CVE-2014-6278                           2014-10-05

एक समय और अधिक विस्तार के लिए डेविड ए व्हीलर की पोस्ट देखें ।

@alblue ने पैच 55 के माध्यम से बिल्ड निर्देशों को पोस्ट किया। I (@OldPro) ने निर्देशों में पैच 56 और 57 को जोड़ा, लेकिन इसका परीक्षण नहीं किया है।

मूल भेद्यता के लिए परीक्षण

आप यह निर्धारित कर सकते हैं कि क्या आप इस परीक्षण को अंजाम देकर CVE-2014-6271 में मूल समस्या के प्रति संवेदनशील हैं :

$ env x='() { :;}; echo vulnerable' bash -c 'echo hello'
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
hello

उपरोक्त आउटपुट एक गैर-असुरक्षित bashसंस्करण का एक उदाहरण है । यदि आप vulnerableउस कमांड के आउटपुट में शब्द देखते हैं, तो आपकी bashस्थिति कमजोर है और आपको अपडेट करना चाहिए। नीचे OS X 10.8.5 से एक कमजोर संस्करण है:

बास टर्मिनल का स्क्रीनशॉट 10.8.5 में भेद्यता दिखा रहा है

नई भेद्यता के लिए परीक्षण

मूल पोस्ट और बैश 3.2.52 (1) के लिए एक अद्यतन किया गया है जो अभी भी भेद्यता की भिन्नता के प्रति संवेदनशील है, जिसे CVE-2014-7169 में परिभाषित किया गया है

$ rm -f echo
$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST

उपरोक्त आउटपुट एक कमजोर bashसंस्करण का एक उदाहरण है । यदि आपको उस कमांड के आउटपुट में कोई तारीख दिखाई देती है तो आपकी bashस्थिति कमजोर है।

"गेम ओवर" को रोकने के लिए ऑटो-आयातित कार्यों को अक्षम करना

शोधकर्ताओं ने इसे भेद्यता के रूप में वर्गीकृत किए बिना नोट किया, कि कोई स्क्रिप्ट ऑटो-इम्पोर्टेड का उपयोग करके एक सब-टाइप में फ़ंक्शन को हाईजैक कर सकती है:

$ env ls="() { echo 'Game Over'; }" bash -c ls
Game over

एक प्रभावित सिस्टम पर उपरोक्त कोड Game Overउस निर्देशिका सूची के बजाय प्रदर्शित होगा जिसकी आप अपेक्षा करेंगे ls। जाहिर है, echo 'Game Over'किसी भी नापाक कोड द्वारा प्रतिस्थापित किया जा सकता है जो आप चाहते हैं। यह "गेम ओवर" बग के रूप में जाना जाता है।

पैच 54 की उपलब्धता से पहले, NetBSD और FreeBSD दोनों ने डिफ़ॉल्ट रूप से ऑटो-इंपोर्टिंग बैश फ़ंक्शन को अक्षम कर दिया, आंशिक रूप से "गेम ओवर" को रोकने के लिए, लेकिन मुख्य रूप से पार्सर में कोई और त्रुटियां शामिल करने के लिए (जैसे CVE-2014-7169 ) निरंतर खोजा जा रहा है, और एक नई कमांड लाइन को जोड़ा गया है--import-functionsपुराने डिफ़ॉल्ट व्यवहार को फिर से सक्षम करने के लिए। मैं (@alblue) ने दूसरों के लिए एक पैच (3.2.53 के खिलाफ) का उपयोग करने के लिए तैयार किया है यदि वे इस व्यवहार को भी अपनाना चाहते हैं और इसे नीचे शामिल किया है। डिफ़ॉल्ट रूप से यह पैच नीचे दी गई स्क्रिप्ट में सक्षम नहीं है। I (@OldPro) का मानना ​​है कि यह पैच अब आवश्यक नहीं है या एक अच्छा विचार है, क्योंकि यह पीछे की संगतता को तोड़ता है और इससे बचाव करने वाली कमजोरियों को पैच 54 और पहले के पैच द्वारा बहुत अच्छी तरह से संबोधित किया जाता है, और इस अनौपचारिक पैच को सक्षम करने से भविष्य के पैच को लागू होने से रोकता है। ।

(प्रश्न संपादकों पर ध्यान दें; कृपया इसे डिफ़ॉल्ट रूप से सक्षम न करें, क्योंकि यह एक अनौपचारिक पैच है।)

a0c5c4d66742fddd0a35001cb91798a5fbf8a2f5 import_functions.patch

export ADD_IMPORT_FUNCTIONS_PATCH=YESबिल्ड को चलाने से पहले पैच को चलाकर सक्षम किया जा सकता है । ध्यान दें कि इस पैच को सक्षम करने से पैच 54 और भविष्य के किसी पैच को अक्षम कर दिया जाएगा क्योंकि भविष्य के पैच को अनौपचारिक पैच के साथ संगत होने की गारंटी नहीं दी जा सकती है।

Apple पैच में गेम ओवर भेद्यता है, जैसे

जैसा कि @ake_____ ने ट्विटर पर बताया है कि आधिकारिक एप्पल पैच अभी भी पर्यावरणीय निष्पादन के लिए कमजोर है:

$ env '__BASH_FUNC<ls>()'="() { echo Game Over; }" bash -c ls
Game Over

उपयोगकर्ताओं को यह स्वयं तय करना चाहिए कि यह कितना महत्वपूर्ण है। मुझे (@OldPro) लगता है कि यह चिंता की कोई बात नहीं है क्योंकि इस व्यवहार के लिए कोई ज्ञात कारनाम नहीं है (इसे सीवीई पहचानकर्ता भी नहीं दिया गया था) क्योंकि सामान्य रूप से अनपेक्षित दूरस्थ हमलावरों में एक पर्यावरण चर का नाम निर्धारित नहीं किया जा सकता है और विशेषाधिकारों के साथ हमलावर नहीं कर सकते हैं। इसका उपयोग वे विशेषाधिकार प्राप्त करने के लिए कर सकते हैं जो उनके पास पहले से नहीं हैं (कम से कम एक अतिरिक्त भेद्यता का शोषण किए बिना नहीं)।

थोड़ी पृष्ठभूमि प्रदान करने के लिए, बैश आपको फ़ंक्शंस को परिभाषित करने की अनुमति देता है, और इसके अलावा आप कमांड के माध्यम से उन फ़ंक्शंस को निर्यात करने की अनुमति देता है export -f। यह फ़ंक्शन नाम के समान मान के साथ फ़ंक्शन के साथ एक पर्यावरण चर बनाकर कार्यान्वित किया जाता था। इसलिए

$ ls () { echo 'Game Over'; }
$ export -f ls
$ echo $ls
Game Over

ऐसा इसलिए हुआ क्योंकि export -f lsनाम का एक पर्यावरण चर बनाया गया था ls। "गेम ओवर" भेद्यता यह थी कि आप सीधे फ़ंक्शन को परिभाषित किए बिना इस पर्यावरण चर को बना सकते थे, जिसका मतलब था कि यदि आप सही चर नाम को इंजेक्ट कर सकते हैं तो आप एक कमांड को हाईजैक कर सकते हैं। Apple ने इसे सही नाम के साथ एक वैरिएबल बनाने के लिए कठिन बनाने की कोशिश की। आधिकारिक बैश पैच 54 वास्तव में चर नाम का उपयोग करके सही नाम के साथ एक चर बनाना असंभव बनाता है, %जिसमें एक वर्ण है जिसे एक चर नाम की अनुमति नहीं है, प्रभावी रूप से निर्यात की गई फ़ंक्शन परिभाषाओं को एक अलग, आरक्षित नामस्थान में डालते हैं।

यदि उपरोक्त में से कोई भी आपके लिए समझ में नहीं आता है, तो इसके बारे में चिंता न करें। आप अभी के लिए Apple पैच के साथ ठीक हैं।

सिस्टम बायनेरिज़

बाश v3.2.51 के साथ OS X 10.9.5 (फिलहाल नवीनतम स्थिर रिलीज) जहाज:

$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

आप इस प्रकार से बैश को प्राप्त कर सकते हैं और पुनः प्राप्त कर सकते हैं , बशर्ते कि आपने Xcode स्थापित किया हो (और xcodebuildलाइसेंस स्वीकार करने से पहले कम से कम एक बार चला हो):

$ # If you want to disable auto-imported functions, uncomment the following
$ # export ADD_IMPORT_FUNCTIONS_PATCH=YES
$ mkdir bash-fix
$ cd bash-fix
$ curl https://opensource.apple.com/tarballs/bash/bash-92.tar.gz | tar zxf -
$ cd bash-92/bash-3.2
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 | patch -p0    
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-053 | patch -p0  
$ # See note above about ADD_IMPORT_FUNCTIONS_PATCH
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] && curl http://alblue.bandlem.com/import_functions.patch | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-054 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-055 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-056 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-057 | patch -p0
$ cd ..
$ # Note: DO NOT ADD SUDO TO XCODEBUILD HERE
$ xcodebuild
$ build/Release/bash --version # GNU bash, version 3.2.57-release
$ build/Release/sh --version   # GNU bash, version 3.2.57-release
$ sudo cp /bin/bash /bin/bash.old
$ sudo cp /bin/sh /bin/sh.old
$ sudo cp build/Release/bash /bin
$ sudo cp build/Release/sh /bin

(नोट: आप उपरोक्त कोड ब्लॉक को कॉपी-और-पेस्ट करके, टर्मिनल में जाकर और फिर रन करके चला सकते हैं pbpaste | cut -c 2- | sh। इंटरनेट से रैंडम स्क्रिप्ट को चलाते समय हमेशा ध्यान रखें ...)

इसके बाद, बैश संस्करण v3.2.57 होना चाहिए:

$ bash --version
GNU bash, version 3.2.57-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

सुरक्षा के लिए, और परीक्षण के बाद, मैं सुझाव देता हूं कि आप chmod -xयह सुनिश्चित करने के लिए पुराने संस्करणों का उपयोग न करें या उन्हें बैकअप साइट पर स्थानांतरित न करें।

$ sudo chmod a-x /bin/bash.old /bin/sh.old

अन्य उत्तरों में MacPorts या Homebrew का उपयोग करने वालों के लिए समाधान हैं; ये समस्या को ठीक नहीं करते, वे बस बैश के अतिरिक्त संस्करण स्थापित करते हैं। कृपया उन उत्तरों को देखें यदि आप उन्हें विशेष रूप से अपग्रेड करना चाहते हैं।

धन्यवाद

चेत के लिए धन्यवाद, जो बैश की देखभाल करता है, और इन पैच को उपलब्ध करा रहा है। बाकी सभी को धन्यवाद जिन्होंने इस पर टिप्पणी की और समय के साथ इसमें सुधार किया।

अब Apple ने असली फिक्स जारी किया है, हालांकि यह अभी भी उपयोगी हो सकता है। क्योंकि उन्होंने केवल लायन और अप के लिए एक फिक्स जारी किया था, और आधिकारिक पैच GNU बैश, संस्करण 3.2.53 (1) -release (x86_64-apple-darwin13) प्रदान करता है, हालांकि, गेम ओवर बग अभी भी कुछ हद तक कमजोर है। इस बिंदु पर, 3.2.57 के खिलाफ बैश के अपने स्वयं के संस्करण का पुनर्निर्माण शायद एप्पल के पैच पर निर्भर होने से अधिक सुरक्षित है, जब तक कि आप इसे गलत न करें।


18

macports

यह आपको एक बाश संस्करण 4.3.28 (1) मिलता है जिसने दोनों भेद्यताओं (CVE-2014-6271 और CVE-2014-7169) के साथ-साथ कुछ बाद में खोजे गए लोगों को पैच किया। यह उपयोगी है यदि आपने संस्करण 4 सुविधाओं को प्राप्त करने के लिए Macports bash का उपयोग करने के लिए गोले बदल दिए हैं।

यह पहली पंक्ति के रूप में #!/bin/shया मानक ओएस लिपियों के मुद्दे को हल नहीं करेगा #!/bin/bash। इस तरह का मुद्दा यह है कि मैकपोर्ट्स कार्यक्रमों के लिए Apple के सप्लाई किए गए संस्करणों का उपयोग नहीं करने की कोशिश करता है क्योंकि मैकपोर्ट्स को जल्दी अद्यतन किया जाता है जैसे कि इसमें बैश का एक नया संस्करण है)

आप Homebrew उत्तर में टर्मिनल का उपयोग कर सकते हैं

Macports स्थापित करने के लिए इन निर्देशों का पालन करें जो कि हैं
। 1. Xcode और Xcode कमांड लाइन टूल इंस्टॉल करें
। टर्मिनल में Xcode लाइसेंस के लिए सहमत हों: sudo xcodebuild -license
3. OS X के अपने संस्करण के लिए MacPorts pkg डाउनलोड करें: लिंक पेज
4 पर हैं। Pkg चलाएं

जब आपके पास macports स्थापित होता है तो आपको नवीनतम संस्करणों की आवश्यकता होती है, यह रनिंग द्वारा किया जाता है

sudo port selfupdate

और recompile या द्वारा नवीनतम बायनेरिज़ प्राप्त करें

sudo port upgrade outdated

5
चूंकि यह मौजूदा बायनेरिज़ में सुरक्षा भेद्यता को ठीक करने के बारे में है, और यह कमजोर बायनेरिज़ को प्रतिस्थापित / ठीक नहीं करता है, मैं यह देखने में विफल रहता हूं कि यह समस्या को कैसे हल करता है।
अल्बल्यू

यह macports संस्करण को लोमड़ी की तरह करता है - और वास्तव में IanC की टिप्पणी के अनुरोध में था
मार्क

हाँ। हमें bashआमतौर पर ओएस एक्स पर आने वाले सभी स्थानों के लिए फिक्स को सूचीबद्ध करना चाहिए - इसलिए सिस्टम फिक्स, होमब्रे और मैकपोर्ट्स फिक्स। संभवतः फ़िंक भी। अगर यह @ AlBlue के उत्तर को संपादित करने के रूप में बनाया गया था, तो मैं व्यक्तिगत रूप से इसे पसंद करूंगा। तो यह सब एक है, सबसे सही, उत्तर।
इयान सी

2
@ आईएनएसी को अलग-अलग होना चाहिए क्योंकि उत्तर अलग-अलग होते हैं और एक बड़ा हो सकता है; चेक नहीं किया जाना चाहिए - जैसे कि मुझे यह कहते हुए देखें कि यह Apple के बैश को ठीक नहीं करता है और होमब्रीव बैश की प्रतिलिपि OSX पर कॉपी करता है। वास्तव में वे अलग-अलग प्रश्न हैं
मार्क

@ AlBlue के उत्तर के लिए मेरा संपादन देखें। मैं असहमत हूं ये अलग होना चाहिए।
इयान सी

17

आधिकारिक Apple OS X bash अपडेट 1.0 के बारे में ध्यान दें: यह सॉफ़्टवेयर अपडेट केवल आधिकारिक Apple bash संस्करण को 3.2.53 पर लाता है। 3.2.54 पैच संशोधन निम्नलिखित परिवर्तन प्रदान करता है:

यह पैच शेल वेरिएबल्स के साथ टकराव से बचने और केवल पर्यावरण वेरिएबल की सामग्री पर निर्भर करता है कि शेल फ़ंक्शन के रूप में इसकी व्याख्या करने के लिए या न करने के लिए निर्यात किए गए फ़ंक्शंस के लिए एन्कोडिंग बैश का उपयोग करता है।

उन उपयोगकर्ताओं के लिए जिन्होंने पहले से ही 3.2.54 बायनेरिज़ के साथ सिस्टम को पैच कर दिया है, आप या तो अपने संकलित बायनेरिज़ को ऐप्पल पैच से बदल सकते हैं या आप चीजों को छोड़ सकते हैं जैसे वे हैं, लेकिन यह बीमार है। हालाँकि Apple ने अपनी बाइनरी वर्जनिंग को 3.2.53 पर छोड़ दिया, लेकिन Apple पैच में नीचे के शोषण परीक्षण के लिए फिक्स हैं:

env X='() { (a)=>\' sh -c "echo date"; cat echo

इसका अर्थ है कि Apple के आधिकारिक 3.2.53 बाइनरी में वैनिला GNU 3.2.54 बाइनरी के बराबर सुरक्षा है। भ्रम का एक दुर्भाग्यपूर्ण बिंदु, लेकिन यह वही है जो यह है। एप्पल का फिक्स आधा बेक नहीं है। यह समस्या के लिए एक पूर्ण तय प्रतीत होता है। जैसे, वेनिला को संकलित करने के लिए bashऔर shGNU स्रोत से नीचे के रोडमैप को एक ऐतिहासिक विरूपण साक्ष्य माना जाना चाहिए और संभवतः भविष्य में पैच कैसे करना चाहिए, इसके लिए एक टेम्पलेट के रूप में परामर्श किया जाना चाहिए।

नोट: वेनिला ग्नू स्रोत के साथ, shविशेषाधिकार वृद्धि की समस्याएं हैं जो विभिन्न इंस्टॉलर, जैसे, एडोब फ्लैश में विफलताओं का कारण बनती हैं। मैं दृढ़ता से एप्पल-पैचेड बायनेरिज़ के साथ चिपके रहने की सलाह देता हूं। इस पैच स्कीम के बारे में विचार करें कि इसे अपदस्थ और बीमार की सलाह दी जाए।

एक नया GNU बैश 3.2.55 पैच है जो निम्नलिखित फिक्स का वर्णन करता है:

बग-विवरण:

Parse.y में दो स्थानीय बफर ओवरफ्लो हैं जो शेल को डंप करने का कारण बन सकते हैं जब एक ही कमांड या कई नेस्टेड लूप से जुड़े कई दस्तावेज़ यहाँ दिए गए हों।

हम यह निर्धारित करने के लिए कोमल पाठक तक छोड़ देते हैं कि आधिकारिक एप्पल-पैचेड बायनेरिज़ के साथ बैठें या नए संभावित कारनामों से निपटने के लिए अपना रोल करें। व्यक्तिगत रूप से, मैं एप्पल बायनेरिज़ के साथ चिपका रहूंगा।


इस पोस्ट में विवरण संकलित करने के लिए कैसे और एक वेनिला स्थापित bashऔर shओएस एक्स पर मैं का उपयोग कर एप्पल विशेष स्रोत मुझे सही पैच संशोधन के साथ नहीं छोड़ा था ब्यौरा उदाहरण निम्नलिखित के रूप में इस मार्ग चुना है। YMMV। हालाँकि, यह वेनिला इंस्टॉलेशन, OS X बायनेरिज़ की जगह पर लक्षित है, जैसे कि जब Apple अंततः एक सुरक्षा अद्यतन जारी करता है, तो इन वैनिला प्रतिस्थापन को उनके उचित Apple समकक्षों द्वारा usurped किया जाएगा।

मेरा आधार विन्यास है:

OS X Lion 10.7.5 और Xcode 4.6.3 सभी कमांड-लाइन उपयोगिताओं के साथ स्थापित किया गया।

इसे ठीक करने के लिए मेरे कदम थे:

3.2.48 के लिए बेस बैश सोर्स कोड डाउनलोड करें:

https://ftp.gnu.org/gnu/bash/bash-3.2.48.tar.gz

Bash3.2.49, .50, .51, .52, .53, .54 और .55 पैच से डाउनलोड करें।

https://ftp.gnu.org/gnu/bash/bash-3.2-patches/

मैंने उन्हें $ filename.patch, जैसे, bash3.2.50.patch के रूप में सहेजा।

सीडी अपने डाउनलोड निर्देशिका और…

मुख्य स्रोत शाखा को अनपैक करें:

tar xzvf bash-3.2.48.tar.gz

cd bash-3.2.48

यह मानते हुए कि आपने पहले डाउनलोड की गई अपनी डाउनलोड की गई फ़ाइलों का नाम बदल दिया है,

cp ../*.patch .

फिर …

for file in *.patch ; do
  patch -p0 < $file
done

यह विभिन्न फ़ाइलों के सफल पैच दिखाना चाहिए। यदि नहीं, तो कुछ अन्वेषण और जांच करने के लिए तैयार रहें।

आगे:

sudo cp /bin/bash /bin/bash_old
sudo cp /bin/sh /bin/sh_old
sudo chmod -x /bin/bash_old
sudo chmod -x /bin/sh_old

यह मूल रूप से आपके पुराने, कमजोर बैश और शेल्स का समर्थन करता है और उनके निष्पादन योग्य विशेषाधिकार को हटा देता है। यह आपको आवश्यक के रूप में आदेशों को पुनर्स्थापित करने की क्षमता देता है, लेकिन इस बीच नुकसान करने की उनकी क्षमता को हटा देता है।

आगे:

./configure --prefix=/ ; make ; sudo make install

इसे नए बैश बाइनरी को / बिन में संकलित, संकलित और संस्थापित करना चाहिए। ऐसा होने के बाद, टर्मिनल से बाहर निकलें और फिर से खोलें।

आपको खुश और मुस्कुराते हुए सभी चीजें चाहिए bash --versionऔर अब 3.2.55 देख सकते हैं, जैसे:

Gaia:Downloads trane$ bash --version
GNU bash, version 3.2.55(1)-release (i386-apple-darwin11.4.2)
Copyright (C) 2007 Free Software Foundation, Inc.

ऊपर दिए गए कमांड में सटीक आउटपुट आपके ओएस एक्स के संस्करण के आधार पर अलग-अलग होगा।

आपको अपनी भेद्यता का परीक्षण करने में सक्षम होना चाहिए bashऔर यह पता लगाना चाहिए कि यह ठीक है।

नोट: हमने अभी तक केवल बैश तय किया है, लेकिन /bin/shनिष्पादन योग्य अभी भी अपनी कमजोर स्थिति में है। bashऊपर shसे नकल करना चीजों को करने की एक लिनक्स शैली है। OS X के shकार्यान्वयन में कुछ अंतर हैं bash, हालाँकि, आप फिर से संकलक को बाहर निकालना चाहेंगे। OS X में कैसे bashऔर क्या shअंतर है, इसके बारे में और जानकारी यहाँ दी जा सकती है:

https://apple.stackexchange.com/a/89327/91441

अपनी डाउनलोड निर्देशिका में करें:

make clean

अपने पसंदीदा संपादक में, फ़ाइल खोलें Makefile.inऔर लाइन 99 पर स्क्रॉल करें। हम प्रोग्राम लाइन को बदलने जा रहे हैं, ताकि हमारे द्वारा बाइनरी आउटपुट shकी bashतरह हो:

Program = sh$(EXEEXT)

इसे सहेजें और फिर

./configure --prefix=/ --enable-xpg-echo-default --enable-strict-posix-default
make ; sudo make install

अब आप shलगभग Apple का निर्माण कर चुके होंगे।

एक अंतिम नोट: कुछ (सभी?) सिस्टम पर, Apple आमतौर पर bashbugनिष्पादन योग्य को जगह देता है /usr/bin। हमारे संकलन ने इसे लागू कर दिया है /bin। तो, यहाँ अंतिम चरण:

sudo mv /usr/bin/bashbug /usr/bin/bashbug_old
sudo chmod -x /usr/bin/bashbug_old
sudo mv /bin/bashbug /usr/bin/bashbug

1
श्वेत या कुछ भी नहीं, लेकिन जब सवाल "मैं कैसे recompile bash करना है" और मेरा जवाब है "उस प्रश्न के उत्तर के लिए निम्न लिंक पर क्लिक करें, ऐसा लगता है कि सारांश आवश्यकताएं खड़ी हैं।
क्रेन फ्रैंक्स

2
समझ गया: बैश के साथ शामिल रीडलाइन लाइब्रेरी 10.6 के साथ संगत नहीं है। इसके बजाय GNU रीडलाइन स्थापित करें और फिर इसका उपयोग करने के लिए बैश मेकफाइल को हैक करें। रीडलाइन स्थापित करें: ftp.cwru.edu/pub/bash/readline-6.3.tar.gz बैश में, कॉन्फ़िगर करने के बाद, मेकफाइल में, सेट करें READLINE_LIB = /usr/local/lib/libreadline.aऔर एक साफ संकलन करें। फिर पट्टी करें और नए बैश बाइनरी को कॉपी करें /bin/bashऔर/bin/sh
सेठ नोबल

2
परिशिष्ट: बैश मेकफाइल में, इसे सेट करना भी आवश्यक है HISTORY_LIB = /usr/local/lib/libhistory.a। अन्यथा बैश गतिशील रूप से / usr / libhistory के स्थानीय संस्करण से जुड़ा होगा।
सेठ नोबल

1
ध्यान दें कि Apple ओपनसोर्स पेज से डाउनलोड किए जाने वाले संस्करण में OSX पर काम करने के लिए कस्टम परिवर्तन हैं। मैं वैनिला अपस्ट्रीम बैश का उपयोग करने की अनुशंसा नहीं करूंगा अन्यथा आप जैसे-जैसे-जैसे प्रतिस्थापित नहीं कर रहे हैं।
अल्बल्यू

1
Apple सिस्टम पर खुले स्रोत के बर्तन को अनुकूलित करने के लिए कई बदलाव करता है। उस ने कहा, मैं यह नहीं देख सकता कि एक वेनिला bashकिसी भी तरह से खुद का व्यवहार करने में विफल हो जाएगी क्योंकि कर्नेल अलग है। किसी भी मामले में, मैं अपने समाधान को अस्थायी मानता हूं; आखिरकार, Apple को समस्या को हल करने के लिए लगभग मिल जाएगा और मेरी संकलित बायनेरिज़ को बदल दिया जाएगा (जो /binपहली जगह में संकलित करने का मेरा मुख्य कारण है।
क्रेन फ्रैंक्स

15

स्रोत से संकलन के साथ संघर्ष कर रहे किसी के लिए, 29 सितंबर तक, ऐप्पल ने मैक ओएस एक्स 10.9.5, 10.8.5 के साथ-साथ 10.7.5 के लिए आधिकारिक तौर पर पैच जारी किए हैं:


1
धन्यवाद! यह कई / अधिकांश के लिए recompiling की तुलना में आसान हो सकता है।
अल्बल्यू

@AlBlue सहमत हुए। इसके अलावा यह पूरी तरह से साफ नहीं है जबकि इसमें पैचिंग है - जैसा कि कुछ ने बताया है - यह कुछ भी नहीं से कहीं बेहतर है। और घबराहट में कुछ नौसिखिया संकलन कोड की तुलना में कहीं अधिक सुरक्षित।
जेकलॉल्ड

2
हमेशा की तरह, सॉफ़्टवेयर अपडेट प्रसार विलंब पूर्ण प्रभाव में है। मुझे आश्चर्य है कि पैकेज दिखाने में कितना समय लगेगा। यह देखना ताज़ा है कि Apple ने इस मुद्दे पर बहुत जल्दी प्रतिक्रिया दी!
क्रेन फ्रैंक्स

2
@ ट्रैनफ्रैंक्स "हमेशा की तरह, सॉफ़्टवेयर अपडेट प्रचार देरी पूरे प्रभाव में है।" मुझे वास्तव में समझ में नहीं आता है कि एक संगठन कैसे है और U2 के पूर्ण एल्बम को सभी iOS उपयोगकर्ताओं के लिए धक्का दे सकता है जो किसी भी तरह 4MB से कम सुरक्षा अद्यतन पर चोक कर सकते हैं।
जेकगॉल्ड

@ जेकगोल्ड: हेह। हाँ, यह एक खिसियाहट है। मैंने इस लायन सिस्टम पर सिर्फ सॉफ्टवेयर अपडेट की जाँच की है और यह दावा करता है कि सिस्टम अप-टू-डेट है। यहाँ एक और माउंटेन लायन प्रणाली के साथ।
क्रेन फ्रैंक्स

5

इस भेद्यता के लिए सबसे पहले, पैचिंग बैश और श आपके मैक पर कुछ स्क्रिप्ट को तोड़ने की संभावना है। आपको वास्तव में ऐसा करने की आवश्यकता नहीं है जब तक आप अपने मैक से सीधे सार्वजनिक इंटरनेट पर वेब सेवाओं की पेशकश नहीं कर रहे हैं। इसलिए यदि यह वास्तव में आवश्यक नहीं है, तब तक प्रतीक्षा करें जब तक कि Apple से आधिकारिक सुरक्षा अद्यतन न हो।

चेतावनी दी जा रही है, यहां कुछ निर्देश दिए गए हैं कि कैसे इस अपडेट को Brew on Mavericks 10.9 पर किया जाए।

पहले पुष्टि करें कि आप एक पुराने बैश का उपयोग कर रहे हैं:

$ which bash
/bin/bash
$ /bin/bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

सबसे वर्तमान बैश 4.3.25 है

यदि आपके पास Xcode स्थापित नहीं है, तो आपको Xcode कमांड लाइन टूल की आवश्यकता होगी, जिसे द्वारा स्थापित किया जा सकता है

$ xcode-select --install

या डेवलपर पोर्टल से

काढ़ा स्थापित करने के लिए ( http://brew.sh ):

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

फिर करो:

$ brew doctor

समस्या होने पर किसी भी निर्देश का पालन करें। कई सामान्य समस्याओं का समाधान यहां किया जाता है

फिर संकुल की नवीनतम सूची में काढ़ा अपडेट करें:

$ brew update

नवीनतम बैश पाने के लिए 4.3.25:

$ brew install bash

यह बैश में स्थापित करता है /usr/local/Cellar/bash/4.3.25/bin/bash

पुराना bashऔर shअभी भी मौजूद है /bin, इसलिए स्थापित करने के बाद आप पुराने निष्पादनयोग्य को एक नई फ़ाइल में बदल देंगे।

$ sudo mv /bin/bash /bin/bash_old
$ sudo mv /bin/sh /bin/sh_old

यदि आप बहुत अधिक पागल हैं, तो आप निष्पादित अनुमतियों को हटा सकते हैं bash_old

$ sudo chmod a-x /bin/bash_old /bin/sh_old

फिर नए बैश 4.3.25 का एक प्रतीकात्मक लिंक बनाएं जो कि काढ़ा स्थापित करता है।

$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/bash
$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/sh

रिबूट और यह पूरा हो गया है।

एक चेतावनी - यह कुछ मौजूदा शेल स्क्रिप्ट्स को तोड़ सकता है जो बैश 3.2 या मैक shके लिनक्स पर मौजूद मतभेदों पर भरोसा कर सकता है sh। इसी धागे में @TraneFranks द्वारा एक उत्तर से, स्रोतों से बैश और श को बदलने के लिए बहुत अधिक परिष्कृत उत्तर है।


4
3.2.51 से 3.2.52 तक पैचिंग करने से 4.3.anything को अपग्रेड करने की तुलना में कम नुकसान हो सकता है।
एलब्लू

मैं चेतावनी देता हूं कि यह कुछ स्क्रिप्ट को तोड़ सकता है, लेकिन 4.3.25 है जो ब्रू वर्तमान के रूप में स्थापित होता है - मैं एक ऐसा संस्करण पेश करने की कोशिश कर रहा हूं जो आसान है (एर) जो इसे खरोंच से कर रहा है। और आप हमेशा पुराने निष्पादनों को वापस नाम देकर पुनर्स्थापित कर सकते हैं।
क्रिस्टोफर एलन

2
यह बग एक दुर्भावनापूर्ण डीएचसीपी सर्वर (जैसे वाईफाई हॉटस्पॉट) द्वारा शोषक है और आपके कंप्यूटर को पूरी तरह से खोल सकता है, इसलिए यह एएसएपी को ठीक करने के लायक है। अन्य उत्तरों की जगह बदलने के लिए बेहतर निर्देश हैं /bin/bashऔर /bin/shइससे ब्रू के नवीनतम बैश में अपग्रेड होने की तुलना में कम समस्याएं पैदा होंगी।
ओल्ड प्रो

मैक डीएचसीपी हमले के लिए असुरक्षित नहीं हो सकता है।
क्रिस्टोफर एलन

10
DCHP सर्वर हमला केवल तभी संभव है जब आपका DHCP क्लाइंट बैश स्क्रिप्ट का उपयोग करता है, जो OSX कार्यान्वयन नहीं करता है।
अल्बल्यू

5

ओएस एक्स 10.6.8 - हिम तेंदुआ

@AlBlue का पद बहुत पूर्ण है। हालाँकि, मेरे OS X 10.6.8 सर्वर पर उसका फिक्स काम नहीं करेगा। Apple के पास 10.6.8 के लिए कोई फिक्स नहीं है और @AlBlue द्वारा समझाया गया कदम Xcode 3.2.6 (जो कि स्नो लेपर्ड के लिए नवीनतम संस्करण है) के साथ काम नहीं करता है। मैं एक त्रुटि प्राप्त करता हूं:

** BUILD FAILED **

The following build commands failed:
sh:
    CodeSign /Users/bas/bash-fix/bash-92/build/Release/sh
bash:
    CodeSign /Users/bas/bash-fix/bash-92/build/Release/bash
(2 failures)

इस कारण से मैं brew.sh का उपयोग कर रहा हूं । जब आप OS X 10.6.8 स्नो लेपर्ड के लिए बेहतर समाधान करते हैं, तो कृपया अपने विचार बताएं। @Jerome की टिप्पणी को भी देखें, तो उन्होंने @ AlBlue के समाधान का उपयोग करके OS X 10.6.8 स्नो लेपर्ड पर एक सफल पैच लगाया था। वैसे भी:

निम्नलिखित ऑनलाइनर के साथ पहले काढ़ा स्थापित करें:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

अपडेट करें brew

brew update

अब बस नवीनतम संस्करण स्थापित करें bashऔर वर्तमान को बदल दें:

brew install bash
sudo sh -c 'echo "/usr/local/bin/bash" >> /etc/shells'
chsh -s /usr/local/bin/bash
sudo mv /bin/bash /bin/bash-backup
sudo ln -s /usr/local/bin/bash /bin/bash

आप Command (complete path)अपनी प्राथमिकताओं में टर्मिनल के लिए डिफ़ॉल्ट लॉगिन शेल ' ' सेट कर सकते हैं ( Command,) यहां छवि विवरण दर्ज करें


नोट: टिप्पणियों में कुछ उपयोगकर्ताओं को यह तरीका उचित नहीं लगता है। लेकिन मेरे लिए यह ओएस एक्स 10.6.8 स्नो लेपर्ड पर बीएएसएच को अपग्रेड करने के लिए एकमात्र समझदार तरीका है।


1
कुछ स्क्रिप्ट भी bash 3 पर निर्भर करती हैं और bash 4 के साथ काम नहीं करती हैं (macports ने bash 4.3.25 तय किया है, जो मुझे लगता है कि होम-ब्रुअर्स के लिए अपडेट किया गया है
Mark

2
आप भी अपडेट नहीं कर रहे हैं sh- आपको वह भी करने की आवश्यकता है। /bin/sh! = /bin/bash/bin/shजब आप सिस्टम कमांड चलाते हैं तो कई उपकरण खोल दिए जाते हैं। system()उदाहरण के लिए, रूबी की कॉल का उपयोग /bin/shतब किया जाता है जब आपके पास शेल विस्तार वर्ण होता है जिसे स्ट्रिंग में विस्तारित करने की आवश्यकता होती है। आप अपने सिस्टम बायनेरिज़ IMO को अपडेट करने के लिए Homebrew का उपयोग करके एक हार खेल खेल रहे हैं। आपको सिस्टम बायनेरीज़ का उचित अपडेट bash करने के अलावा होमब्रेव को अपडेट करना चाहिए ।
इयान सी

1
यह ध्यान रखें कि OSX 10.8 और 10.9 बैश 3.2 का उपयोग करते हैं, इसलिए प्रत्यक्ष स्थिरता के लिए मैं संस्करण के रूप में 3.2 के साथ गया। यह भी पूर्व संस्करण के लिए ऐप्पल के आधिकारिक निर्माण पर आधारित था, जिसमें विस्तारित विशेषता जागरूकता आदि जैसे एक्स्ट्रा कलाकार शामिल हो सकते हैं
अलबेल्यू

1
मैं सभी उदाहरणों पर खुद 3.2.6 चला रहा हूं। मैं समझता हूँ कि निर्माण विफल रहता है जब चल रहा है xcodebuild? यदि हां, तो मुझे ऐसा अनुभव नहीं था। मेरे पास आपको एक तरफ देने के लिए कुछ ठोस सुझाव हैं: जांचें कि क्या आपके पास कई बैश बिल्ड हैं, सफाई (काढ़ा अनइंस्टॉल) पर विचार करें और संभवतः फिर से xcode स्थापित करें ... फिर पैच प्रक्रिया नए सिरे से शुरू करें।
जेरोम

1
मेरे पास स्नो लेपर्ड पर हैंड-बिल्ट स्टॉक बैश-4.3 के साथ गंभीर जॉब कंट्रोल के मुद्दे हैं (यदि मैं एमएसीएस शुरू करता हूं और फिर इसे निलंबित करता हूं, तो मैं इसे 'एफजी' के साथ फिर से शुरू नहीं कर सकता)। मैंने तब से Openource.apple.com/release/mac-os-x-1068 से बैश के लिए स्नो लेपर्ड स्रोत डाउनलोड किया है , ftp.gnu.org/gnu/bash/bash-3.2-patches से पैच अप्लाई किया है , और फिर से बनाया है बहुत बेहतर प्रभाव।
मोर्मगिल

-6

आप यहां दिए गए निर्देशों का पालन कर सकते हैं: https://github.com/tjluoma/bash-fix मूल रूप से, टर्मिनल में निम्नलिखित कार्य करें:

curl -s https://raw.githubusercontent.com/tjluoma/bash-fix/master/bash-fix.sh | zsh -f

5
यादृच्छिक गिटबुब खातों से यादृच्छिक शेल स्क्रिप्ट निष्पादित करना यह नहीं है कि आप किसी भी मशीन पर अधिक सुरक्षित स्थिति में कैसे पहुंचें। आप अंतिम बिंदु पर भरोसा करना चाहते हैं।
इयान सी

मुझे यहां इयान से सहमत होना होगा। अविश्वसनीय सी स्क्रिप्ट के माध्यम से कुछ नाटकीय क्षति का परिचय देना वास्तव में आसान है, जैसे कि इन सीवीई का वर्णन करने वाली समस्याएं।
क्रेन फ्रैंक्स

FUD के इस प्रसार से पूरी तरह असहमत हैं। उन्हें निष्पादित करने से पहले सभी शेल स्क्रिप्ट पढ़ें, और केवल https: // से।
dhchdhd 11
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.