สถานะ
Apple ได้เผยแพร่การแก้ไขความปลอดภัย Bash สำหรับ Shellshock และช่องโหว่ที่เกี่ยวข้องในชื่อ " OS X bash Update 1.0 " สามารถติดตั้งผ่านการอัปเดตระบบปกติสำหรับผู้ที่ใช้ OS X Mountain Lion v10.8.5 หรือ OS X Mavericks v10.9.5 (รวมอยู่ในการอัปเดตความปลอดภัย 2014-005 ) และสามารถติดตั้งได้ด้วยตนเอง การแก้ไขอย่างเป็นทางการของ Apple นั้นยังมีให้สำหรับ OS X Lion v10.7.5 และ OS X Lion Server v10.7.5 แต่จะมีให้ผ่านการดาวน์โหลดด้วยตนเองเท่านั้น การแก้ไขความปลอดภัยมีให้ใช้งานผ่าน URL ที่ต่างกันตามเวอร์ชั่นของระบบปฏิบัติการ:
(หากมีการปล่อยแพทช์ใหม่ให้วางไว้ที่นี่ แต่โปรดเก็บสิ่งที่มีอยู่เหล่านี้ไว้เพื่ออ้างอิงด้วย)
Patch ของ Apple ดูแล Shellshock และช่องโหว่อื่น ๆ และเป็นสิ่งที่ดีสำหรับคนส่วนใหญ่ tl; dr คนหยุดอ่านที่นี่ได้
อย่างไรก็ตามการดึงความสนใจจากข้อผิดพลาดของ Shellshock ทำให้นักวิจัยหลายคนมองอย่างถี่ถ้วนเกี่ยวกับการทุบตีและพบช่องโหว่มากขึ้นเรื่อย ๆ (ยากที่จะใช้ประโยชน์) หากคุณกังวลอย่างมากเกี่ยวกับความปลอดภัย (เพราะบางทีคุณกำลังเรียกใช้ OS X Server เพื่อโฮสต์เว็บไซต์ที่เปิดเผยต่อสาธารณชน) จากนั้นคุณอาจต้องการ (ลอง) ติดตามช่องโหว่และแพทช์ตามที่พวกเขาทำการรวบรวมโดยการทุบตีตัวเอง มิฉะนั้นไม่ต้องกังวลกับมัน
ค้นหา Apple เพื่อปล่อยการอัปเดตอื่นเพื่อทุบตีบางครั้งในอนาคตเมื่อฝุ่นตกลงบนการค้นหาช่องโหว่เพิ่มเติม
ชุดอย่างเป็นทางการของแพทช์ทุบตีเองสำหรับทุบตี 3.2, แพทช์ 52, 53, และ 54 (ซึ่งสอดคล้องกับทุบตี 4.3 แพทช์ 25, 26 และ 27) มีให้บริการซึ่งแก้ไขทั้ง CVE-2014-6271 และ CVE-2014-7169, เช่นเดียวกับ 'Game over' ที่แสดงด้านล่าง สิ่งนี้ได้รับการทดสอบโดยฉัน ( @alblue ) และโพสต์ได้รับการอัปเดตตามนั้น (จากนั้นมีการอัปเดตเพิ่มเติม: ดูการแก้ไข 41สำหรับโพสต์ที่หยุดที่แพตช์ 54)
มีการรายงานช่องโหว่เพิ่มเติมหลายรายการจากการทุบตี จากการโพสต์ของ Michal Zalewski ถ้าคุณมี patch 54 (และน่าจะเป็นแพทช์อย่างเป็นทางการของ Apple) "ไม่มีจุดใดที่จะหมกมุ่นกับสถานะของตัวแมลงแต่ละตัวเหล่านี้เพราะพวกเขาไม่ควรเสี่ยงต่อความปลอดภัยอีกต่อไป"
CVE-2014-6271 - พบ RCE ดั้งเดิมโดย Stephane แก้ไขโดย bash43-025 และรายการ Sep 24 ที่สอดคล้องสำหรับเวอร์ชันอื่น
CVE-2014-7169 - ข้อผิดพลาดการสร้างไฟล์ / โทเค็นการบริโภคที่พบโดย Tavis แก้ไขโดย bash43-026 & co (26 ก.ย. )
CVE-2014-7186 - ความผิดพลาดที่ไม่น่าเป็นไปได้ 10+ ที่นี่-doc พบโดย Florian และ Todd แก้ไขโดย bash43-028 & co (1 ต.ค. )
CVE-2014-7187 - ไม่ล้มเหลวอาจไม่เสี่ยงต่อวินาทีที่พบโดย Florian แก้ไขโดย bash43-028 & co (1 ต.ค. )
CVE-2014-6277 - ปัญหาหน่วยความจำที่ไม่ได้เตรียมการเกือบจะแน่นอน RCE ที่พบโดย Michal Zalewski ยังไม่มีการแก้ไขที่เฉพาะเจาะจง
CVE-2014-6278 - คำสั่ง RCE ของการฉีดพบโดย Michal Zalewski ยังไม่มีการแก้ไขที่เฉพาะเจาะจง
มันค่อนข้างสับสน โชคดีเชษฐ์เมย์, ผู้ดูแลทุบตีอย่างเป็นทางการโพสต์CVE การแก้ไขการทำแผนที่ โพสต์ของเขาอ้างถึงแพตช์สำหรับ bash 4.3, I (@OldPro) ได้แปลพวกมันไปเป็น patch สำหรับ bash 3.2 ซึ่งเป็นสิ่งที่ใช้ได้กับ OS X นอกจากนี้เนื่องจากโพสต์นี้เขาเปิดตัวแพตช์ 57 ดังนั้นฉันจึงเพิ่มเติมว่า
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
ดูโพสต์ของ David A. Wheeler สำหรับไทม์ไลน์และรายละเอียดที่มากขึ้น
@alblue โพสต์คำแนะนำการสร้างผ่าน patch 55. ฉัน (@OldPro) เพิ่ม patch 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:
ทดสอบช่องโหว่ใหม่
มีการอัปเดตกับโพสต์ดั้งเดิมและ Bash 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
มีความเสี่ยง
ปิดการใช้งานฟังก์ชั่นที่นำเข้าอัตโนมัติเพื่อป้องกัน "Game Over"
นักวิจัยตั้งข้อสังเกตโดยไม่จำแนกว่ามันเป็นช่องโหว่ที่สคริปต์สามารถจี้ฟังก์ชั่นใน subshell โดยใช้ฟังก์ชั่นที่นำเข้าอัตโนมัติ:
$ env ls="() { echo 'Game Over'; }" bash -c ls
Game over
รหัสข้างต้นในระบบได้รับผลกระทบจะแสดงแทนของไดเรกทอรีรายชื่อที่คุณคาดหวังว่าจะได้รับจากGame Over
ls
เห็นได้ชัดว่าecho 'Game Over'
สามารถถูกแทนที่ด้วยรหัสชั่วร้ายที่คุณต้องการ สิ่งนี้กลายเป็นข้อผิดพลาด "Game Over"
ก่อนที่จะมีแพตช์ 54 ทั้งNetBSDและFreeBSDปิดใช้งานฟังก์ชั่นทุบตีการนำเข้าอัตโนมัติโดยค่าเริ่มต้นส่วนหนึ่งเพื่อป้องกัน "Game Over" แต่ส่วนใหญ่จะมีข้อผิดพลาดเพิ่มเติมใน parser (เช่นCVE-2014-7169 ) จะถูกค้นพบอย่างต่อเนื่องและเพิ่มแฟล็กบรรทัดคำสั่งใหม่--import-functions
เพื่อเปิดใช้งานการทำงานเริ่มต้นเก่าอีกครั้ง ฉัน (@alblue) ได้เตรียมแพทช์ (กับ 3.2.53) เพื่อให้ผู้อื่นใช้หากพวกเขาต้องการที่จะใช้พฤติกรรมนี้เช่นกันและได้รวมไว้ด้านล่าง โดยค่าเริ่มต้นโปรแกรมแก้ไขนี้จะไม่เปิดใช้งานในสคริปต์การสร้างด้านล่าง ฉัน (@OldPro) เชื่อว่าโปรแกรมแก้ไขนี้ไม่จำเป็นอีกต่อไปหรือเป็นความคิดที่ดีเพราะมันหยุดการทำงานร่วมกันได้ย้อนหลังและช่องโหว่ที่ป้องกันนั้นได้รับการแก้ไขอย่างดีจากโปรแกรมแก้ไข 54 และโปรแกรมปรับปรุงรุ่นก่อนหน้า .
(หมายเหตุถึงผู้แก้ไขคำถามโปรดอย่าเปิดใช้งานสิ่งนี้เป็นค่าเริ่มต้นเนื่องจากเป็นโปรแกรมแก้ไขอย่างไม่เป็นทางการ)
a0c5c4d66742fddd0a35001cb91798a5fbf8a2f5 import_functions.patch
แพทช์สามารถเปิดใช้งานได้โดยการรันexport ADD_IMPORT_FUNCTIONS_PATCH=YES
ก่อนรันบิลด์ โปรดทราบว่าการเปิดใช้งานโปรแกรมแก้ไขนี้จะปิดใช้งานโปรแกรมแก้ไข 54 และโปรแกรมแก้ไขในอนาคตใด ๆเนื่องจากโปรแกรมแก้ไขในอนาคตไม่สามารถรับประกันได้ว่าจะเข้ากันได้กับโปรแกรมแก้ไขที่ไม่เป็นทางการ
Apple Patch มีช่องโหว่ Game Over ประเภทของ
ตามที่กล่าวโดย@ake_____ บนทวิตเตอร์แพทช์อย่างเป็นทางการของ Apple ยังคงมีความเสี่ยงต่อสภาพแวดล้อมที่ปิดกั้นการปฏิบัติการได้:
$ env '__BASH_FUNC<ls>()'="() { echo Game Over; }" bash -c ls
Game Over
ผู้ใช้ควรตัดสินใจด้วยตนเองว่าเรื่องนี้สำคัญอย่างไร ฉัน (@OldPro) คิดว่ามันไม่มีอะไรต้องกังวลเพราะไม่มีการหาช่องโหว่สำหรับพฤติกรรมนี้ (มันไม่ได้รับตัวระบุ CVE) เพราะโดยทั่วไปแล้วผู้โจมตีระยะไกลที่ไม่ได้รับสิทธิไม่สามารถตั้งชื่อตัวแปรสภาพแวดล้อมได้ ใช้สิ่งนี้เพื่อรับสิทธิพิเศษที่พวกเขายังไม่มีอยู่ (อย่างน้อยก็ไม่ได้โดยไม่ทำการเจาะช่องโหว่เพิ่มเติม)
เพื่อให้พื้นหลังเล็ก ๆ น้อย ๆ ทุบตีช่วยให้คุณสามารถกำหนดฟังก์ชั่นและนอกจากนี้ยังช่วยให้คุณสามารถส่งออกฟังก์ชั่นเหล่านั้นไปยัง subshells ผ่านexport -f
คำสั่ง สิ่งนี้เคยถูกนำมาใช้โดยการสร้างตัวแปรสภาพแวดล้อมที่มีชื่อเดียวกันกับฟังก์ชั่นที่มีค่าตั้งเป็นนิยามของฟังก์ชัน ดังนั้น
$ ls () { echo 'Game Over'; }
$ export -f ls
$ echo $ls
Game Over
เรื่องนี้เกิดขึ้นเพราะสร้างตัวแปรสภาพแวดล้อมที่มีชื่อexport -f ls
ls
ช่องโหว่ "Game Over" คือคุณสามารถสร้างตัวแปรสภาพแวดล้อมนี้ได้โดยตรงโดยไม่จำเป็นต้องกำหนดฟังก์ชั่นก่อนซึ่งหมายความว่าหากคุณสามารถฉีดชื่อตัวแปรที่ถูกต้องคุณสามารถจี้คำสั่งได้ Apple พยายามแก้ไขปัญหานี้โดยทำให้ยากที่จะสร้างตัวแปรด้วยชื่อที่ถูกต้อง อย่างเป็นทางการ bash patch 54 ทำให้ไม่สามารถสร้างตัวแปรด้วยชื่อที่ถูกต้องได้โดยใช้ชื่อตัวแปรซึ่งรวมถึง%
ตัวอักษรที่ไม่ได้รับอนุญาตในชื่อตัวแปรทำให้การกำหนดฟังก์ชันที่ส่งออกในเนมสเปซที่แตกต่างกันมีประสิทธิภาพ
หากไม่มีสิ่งใดที่เหมาะสมกับคุณอย่ากังวลไป คุณพอใจกับ Patch ของ Apple ในตอนนี้
ระบบไบนารี
OS X 10.9.5 (การปล่อยเสถียรล่าสุดในขณะนี้) มาพร้อมกับ Bash v3.2.51:
$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
คุณสามารถรับและคอมไพล์ Bash ใหม่ดังต่อไปนี้โดยที่คุณได้ติดตั้ง 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
(หมายเหตุ: คุณสามารถเรียกใช้สิ่งนี้ได้โดยการคัดลอกและวางโค้ดบล็อกด้านบนเข้าไปใน Terminal แล้วเรียกpbpaste | cut -c 2- | sh
ใช้โปรดระมัดระวังเมื่อใช้สคริปต์แบบสุ่มจากอินเทอร์เน็ตแม้ว่า ... )
หลังจากนี้เวอร์ชั่น Bash ควรเป็น 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 สิ่งเหล่านี้ไม่ได้แก้ปัญหาพวกเขาเพียงแค่ติดตั้ง Bash รุ่นเพิ่มเติม โปรดดูคำตอบเหล่านั้นหากคุณต้องการอัพเกรดเฉพาะ
ขอบคุณ
ขอบคุณ Chet ที่ดูแลการทุบตีและทำให้แพทช์เหล่านี้พร้อมใช้งานแล้ว ขอบคุณทุกคนที่ให้ความเห็นเกี่ยวกับเรื่องนี้และปรับปรุงมันเมื่อเวลาผ่านไป
ตอนนี้ Apple ได้เปิดตัวการแก้ไขจริงแม้ว่าสิ่งนี้อาจจะมีประโยชน์ เนื่องจากพวกเขาปล่อยการแก้ไขสำหรับ Lion and up เท่านั้นและแพตช์อย่างเป็นทางการให้ GNU ทุบตีรุ่น 3.2.53 (1) - ปล่อย (x86_64-apple-darwin13) อย่างไรก็ตามเกม over bug ยังค่อนข้างเสี่ยงอยู่ ณ จุดนี้การสร้าง Bash ในแบบของคุณใหม่กับ 3.2.57 นั้นอาจปลอดภัยกว่าการใช้ Patch ของ Apple เว้นแต่ว่าคุณทำผิด