Làm cách nào để tôi biên dịch lại Bash để tránh Shellshock (khai thác từ xa CVE-2014-6271 và CVE-2014-7169)?


368

Cho rằng Bash 3.2 (phiên bản được vận hành bởi OS X) dễ bị khai thác thực thi từ xa được gọi là "Shell Shock" ( CVE-2014-6271CVE-2014-7169 ) làm cách nào để xây dựng lại Bash và bảo vệ hệ thống của tôi trước một Bản vá chính thức của Apple?

CẬP NHẬT: Lưu ý rằng Apple hiện đã phát hành bản vá chính thức. Xem bên dưới để biết chi tiết.


5
Apple đã phát hành bản sửa lỗi: support.apple.com/kb/DL1769
AT

1
Bản vá OS X bash Update 1.0 được đề cập ở trên dành riêng cho OS X 10.9.5 trở lên - Đây là tất cả chúng: OS X 10.7.5 (Lion), OS X 10.8.5 (Mountain Lion), OS X 10.9.5 ( Mavericks).
Tôi sẽ là

Có, tôi đã thêm các liên kết 9 giờ trước nhưng chúng đã bị xóa không chính xác. apple.stackexchange.com/revutions/146849/10
AlBlue

đã tạo ra một ý chính gist.github.com/dnozay/395dcdef05c6b4b1836a có hầu hết các bước và đã có các bản vá đi kèm (và nên hoạt động trên OSX 10.6).
dnozay

@dnozay Cảm ơn ý chính của bạn! Vui lòng cập nhật nó để bao gồm các bản vá 55 và 56 (đã ra) và 57 (sắp ra mắt).
Old Pro

Câu trả lời:


429

Trạng thái

Apple đã phát hành bản sửa lỗi bảo mật Bash cho Shellshock và các lỗ hổng liên quan là " OS X bash Update 1.0 ". Chúng có thể được cài đặt thông qua cập nhật hệ thống bình thường cho những người sử dụng OS X Mountain Lion v10.8.5 hoặc OS X Mavericks v10.9.5 (chúng được bao gồm trong Cập nhật bảo mật 2014-005 ) và cũng có thể được cài đặt thủ công. Các bản sửa lỗi chính thức của Apple cũng có sẵn cho OS X Lion v10.7.5 và OS X Lion Server v10.7.5 nhưng chúng chỉ có sẵn thông qua tải xuống thủ công. Các bản sửa lỗi bảo mật có sẵn thông qua các URL khác nhau dựa trên phiên bản hệ điều hành:

(Nếu bản vá mới được phát hành, hãy đặt chúng ở đây nhưng vui lòng giữ lại những bản vá hiện có để tham khảo.)

Bản vá của Apple chăm sóc Shellshock và một số lỗ hổng khác và tốt cho hầu hết mọi người. tl; dr mọi người có thể dừng đọc ở đây.

TUY NHIÊN, sự chú ý bị bash bởi lỗi Shellshock đã khiến nhiều nhà nghiên cứu khó tính với bash và ngày càng có nhiều lỗ hổng (khó khai thác) được tìm thấy. Nếu bạn rất quan tâm về bảo mật (vì có thể bạn đang chạy OS X Server để lưu trữ một trang web có sẵn công khai) thì bạn có thể muốn (cố gắng) theo kịp các lỗ hổng và các bản vá khi chúng tiếp tục phát triển bằng cách tự biên dịch bash. Nếu không, đừng lo lắng về nó.

Hãy tìm Apple để phát hành một bản cập nhật khác để bash một thời gian trong tương lai khi bụi quyết định tìm kiếm các lỗ hổng tiếp theo.


Một bộ bản vá bash chính thức cho bash 3.2, bản vá 52, 53 và 54 (tương ứng với bản vá Bash 4.3 25, 26 và 27) có sẵn để sửa cả CVE-2014-6271 và CVE-2014-7169, cũng như 'Trò chơi kết thúc' được hiển thị bên dưới. Điều này đã được tôi kiểm tra ( @alblue ) và bài đăng đã được cập nhật tương ứng (và sau đó cập nhật bổ sung đã được thực hiện: xem bản sửa đổi 41 cho bài đăng dừng ở bản vá 54).

Nhiều lỗ hổng bổ sung đã được báo cáo chống lại bash. Theo bài đăng của Michal Zalewski nếu bạn có bản vá 54 (và có lẽ là bản vá chính thức của Apple) "không có gì phải ám ảnh về tình trạng của các lỗi riêng lẻ này, vì chúng không còn gây ra rủi ro bảo mật:"

  • CVE-2014-6271 - RCE gốc được tìm thấy bởi Stephane. Đã sửa bởi bash43-025 và các mục nhập ngày 24 tháng 9 tương ứng cho các phiên bản khác.

  • CVE-2014-7169 - lỗi tạo tệp / tiêu thụ mã thông báo được tìm thấy bởi Tavis. Đã sửa bởi bash43-026 & co (ngày 26 tháng 9)

  • CVE-2014-7186 - một vụ tai nạn 10+ có lẽ không có rủi ro nào được tìm thấy bởi Florian và Todd. Đã sửa bởi bash43-028 & co (ngày 1 tháng 10).

  • CVE-2014-7187 - một chiếc máy bay không đụng hàng, có lẽ không có rủi ro nào được tìm thấy bởi Florian. Đã sửa bởi bash43-028 & co (ngày 1 tháng 10).

  • CVE-2014-6277 - vấn đề bộ nhớ chưa được khởi tạo, gần như chắc chắn RCE được tìm thấy bởi Michal Zalewski. Không có bản vá cụ thể nào.

  • CVE-2014-6278 - RCE tiêm lệnh được tìm thấy bởi Michal Zalewski. Không có bản vá cụ thể nào.

Nó khá khó hiểu. May mắn thay, Chet Ramey, người duy trì bash chính thức, đã đăng một CVE để vá bản đồ . Bài đăng của anh ấy đề cập đến các bản vá cho bash 4.3, tôi (@OldPro) đã dịch chúng thành các bản vá cho bash 3.2, đó là những gì có thể áp dụng cho OS X. Ngoài ra, vì bài đăng này anh ấy đã phát hành bản vá 57, vì vậy tôi đã thêm vào bên dưới:

 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

Xem bài đăng của David A. Wheeler để biết dòng thời gian và chi tiết hơn.

@alblue đã đăng hướng dẫn xây dựng thông qua bản vá 55. Tôi (@OldPro) đã thêm bản vá 56 và 57 vào hướng dẫn nhưng chưa thử nghiệm.

Kiểm tra tính dễ bị tổn thương ban đầu

Bạn có thể xác định xem bạn có dễ bị ảnh hưởng bởi vấn đề ban đầu trong CVE-2014-6271 hay không bằng cách thực hiện kiểm tra này:

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

Kết quả trên là một ví dụ về một tổ chức phi dễ bị tổn thương bashphiên bản. Nếu bạn thấy từ vulnerabletrong đầu ra của lệnh đó thì bạn bashdễ bị tổn thương và bạn nên cập nhật. Dưới đây là phiên bản dễ bị tấn công từ OS X 10.8.5:

Ảnh chụp màn hình của bash terminal hiển thị lỗ hổng trong 10.8.5

Kiểm tra lỗ hổng mới

Đã có một bản cập nhật cho bài viết gốc và Bash 3.2.52 (1) vẫn dễ bị tổn thương trước một biến thể của lỗ hổng, được xác định trong 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

Đầu ra trên là một ví dụ về bashphiên bản dễ bị tấn công . Nếu bạn thấy một ngày trong đầu ra của lệnh đó, bạn bashcó thể bị tổn thương.

Vô hiệu hóa các chức năng tự động nhập để ngăn "Trò chơi kết thúc"

Các nhà nghiên cứu lưu ý, mà không phân loại nó là một lỗ hổng, rằng một tập lệnh có thể chiếm quyền điều khiển một chức năng trong một lớp con bằng cách sử dụng các chức năng tự động nhập:

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

Đoạn mã trên trên một hệ thống bị ảnh hưởng sẽ hiển thị Game Overthay vì danh sách thư mục mà bạn mong đợi ls. Rõ ràng, echo 'Game Over'có thể được thay thế bằng bất kỳ mã bất chính nào bạn muốn. Điều này được biết đến như là lỗi "Game Over".

Trước khi có bản vá 54, cả hai chức năng bash tự động nhập NetBSDFreeBSD đều bị vô hiệu hóa, một phần để ngăn "Game Over" nhưng chủ yếu để chứa bất kỳ lỗi nào trong trình phân tích cú pháp (như CVE-2014-7169 ) như chúng tiếp tục được phát hiện và thêm một cờ dòng lệnh mới--import-functionsđể kích hoạt lại hành vi mặc định cũ. Tôi (@alblue) đã chuẩn bị một bản vá (so với 3.2.53) để người khác sử dụng nếu họ cũng muốn áp dụng hành vi này và đã bao gồm nó dưới đây. Theo mặc định, bản vá này không được kích hoạt trong tập lệnh xây dựng bên dưới. Tôi (@OldPro) tin rằng bản vá này không còn cần thiết hoặc là một ý tưởng hay, bởi vì nó phá vỡ tính tương thích ngược và các lỗ hổng mà nó bảo vệ chống lại được giải quyết rất tốt bằng các bản vá 54 và các bản vá trước đó và cho phép bản vá không chính thức này ngăn chặn các bản vá trong tương lai .

(Lưu ý đối với người chỉnh sửa câu hỏi; vui lòng không bật tính năng này theo mặc định, vì đây là bản vá không chính thức.)

a0c5c4d66742fddd0a35001cb91798a5fbf8a2f5 import_fifts.patch

Bản vá có thể được kích hoạt bằng cách chạy export ADD_IMPORT_FUNCTIONS_PATCH=YEStrước khi chạy bản dựng. Lưu ý rằng việc kích hoạt bản vá này sẽ vô hiệu hóa bản vá 54 và mọi bản vá trong tương lai vì các bản vá trong tương lai có thể được đảm bảo tương thích với bản vá không chính thức.

Apple Patch có lỗ hổng Game Over, loại

Như được chỉ ra bởi @ake___ trên twitter , bản vá chính thức của Apple vẫn dễ bị ảnh hưởng bởi môi trường thực thi:

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

Người dùng nên tự quyết định tầm quan trọng của việc này. Tôi (@OldPro) nghĩ rằng không có gì phải lo lắng vì không có khai thác cho hành vi này (nó thậm chí không được cung cấp định danh CVE) vì nói chung, những kẻ tấn công từ xa không có đặc quyền không thể đặt tên của biến môi trường và kẻ tấn công có đặc quyền sử dụng điều này để đạt được các đặc quyền mà họ chưa có (ít nhất là không khai thác một lỗ hổng bổ sung).

Để cung cấp một chút nền tảng, bash cho phép bạn xác định các hàm và hơn nữa cho phép bạn xuất các hàm đó sang các lớp con thông qua export -flệnh. Điều này được sử dụng để thực hiện bằng cách tạo một biến môi trường có cùng tên với hàm với giá trị được đặt thành định nghĩa hàm. Vì thế

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

Điều này xảy ra bởi vì export -f lsđã tạo ra một biến môi trường có tên ls. Lỗ hổng "Game Over" là bạn có thể trực tiếp tạo biến môi trường này mà không cần phải xác định hàm trước, điều đó có nghĩa là nếu bạn có thể nhập đúng tên biến bạn có thể chiếm quyền điều khiển. Apple đã cố gắng khắc phục điều này bằng cách khó tạo ra một biến có đúng tên. Bản vá bash 54 chính thức thực sự không thể tạo một biến có tên đúng bằng cách sử dụng các tên biến bao gồm %một ký tự không được phép trong một tên biến, đưa các định nghĩa hàm xuất khẩu vào một không gian tên dành riêng khác nhau.

Nếu không có điều nào ở trên có ý nghĩa với bạn, đừng lo lắng về điều đó. Bây giờ bạn vẫn ổn với bản vá Apple.

Hệ thống nhị phân

OS X 10.9.5 (bản phát hành ổn định mới nhất tại thời điểm hiện tại) được phát hành với 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.

Bạn có thể lấy và biên dịch lại Bash như sau , miễn là bạn đã cài đặt Xcode (và đã chạy xcodebuildít nhất một lần trước đó để chấp nhận giấy phép):

$ # 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

(Lưu ý: bạn có thể chạy mã này bằng cách sao chép và dán khối mã ở trên, vào Terminal rồi chạy pbpaste | cut -c 2- | sh. Luôn luôn cẩn thận khi chạy các tập lệnh ngẫu nhiên từ internet mặc dù ...)

Sau này, phiên bản Bash sẽ là v3.2.57:

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

Để bảo mật và sau khi thử nghiệm, tôi khuyên bạn chmod -xnên sử dụng các phiên bản cũ để đảm bảo chúng không được sử dụng lại hoặc chuyển chúng đến một trang web dự phòng.

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

Các câu trả lời khác có giải pháp cho những người sử dụng MacPorts hoặc Homebrew; Chúng không khắc phục được sự cố, chúng chỉ cài đặt các phiên bản bổ sung của Bash. Xin vui lòng xem những câu trả lời nếu bạn muốn nâng cấp cụ thể.

Cảm ơn

Cảm ơn Chet, người chăm sóc bash, và đã sẵn sàng cung cấp các bản vá này. Cảm ơn tất cả những người khác đã bình luận về điều này và cải thiện nó theo thời gian.

Bây giờ Apple đã phát hành bản sửa lỗi thực sự, mặc dù điều này vẫn có thể hữu ích. Bởi vì họ chỉ phát hành bản sửa lỗi cho Lion trở lên và bản vá chính thức cung cấp GNU bash, phiên bản 3.2.53 (1) -release (x86_64-apple-darwin13), tuy nhiên, lỗi Game over vẫn hơi dễ bị tổn thương. Tại thời điểm này, việc xây dựng lại phiên bản Bash của riêng bạn so với 3.2.57 có lẽ an toàn hơn so với dựa vào bản vá của Apple, trừ khi bạn làm sai.


18

Macports

Điều này giúp bạn có phiên bản bash 4.3.28 (1) vá cả hai lỗ hổng (CVE-2014-6271 và CVE-2014-7169) cũng như một số lỗi được phát hiện sau đó. Điều này rất hữu ích nếu bạn đã thay đổi shell để sử dụng Macports bash để có được các tính năng của phiên bản 4.

Nó sẽ không giải quyết vấn đề của các tập lệnh hệ điều hành tiêu chuẩn như là có #!/bin/shhoặc #!/bin/bashlà dòng đầu tiên. Loại vấn đề này là lý do tại sao Macports cố gắng không sử dụng các phiên bản chương trình do Apple cung cấp vì Macports có xu hướng được cập nhật nhanh hơn, ví dụ như nó có phiên bản bash mới hơn)

Bạn có thể làm cho thiết bị đầu cuối sử dụng điều này như trong câu trả lời của Homebrew

Để cài đặt macports, hãy làm theo các hướng dẫn sau
: 1. Cài đặt Xcode và Công cụ dòng lệnh Xcode
2. Đồng ý với giấy phép Xcode trong Terminal: sudo xcodebuild -license
3. Tải xuống MacPorts pkg cho phiên bản OS X: của bạn ở trên trang
4. Chạy pkg

Khi bạn đã cài đặt macports, bạn cần có phiên bản mới nhất, việc này được thực hiện bằng cách chạy

sudo port selfupdate

và biên dịch lại hoặc nhận các tệp nhị phân mới nhất bằng cách

sudo port upgrade outdated

5
Vì đây là về việc khắc phục lỗ hổng bảo mật trong các tệp nhị phân hiện có và điều này không thay thế / sửa các tệp nhị phân dễ bị tổn thương, tôi không thấy cách này giải quyết vấn đề.
AlBlue

Nó cáo phiên bản macports - và thực sự được yêu cầu bình luận của IanC
Đánh dấu

Đúng. Chúng ta nên liệt kê các bản sửa lỗi cho tất cả các vị trí bashthường xuất phát trên OS X - vì vậy bản sửa lỗi hệ thống, bản sửa lỗi Homebrew và MacPorts. Có thể Fink là tốt. Cá nhân tôi thích nó nếu điều này được thực hiện như là một chỉnh sửa cho câu trả lời của @ AlBlue. Vì vậy, đó là tất cả, một câu trả lời đúng nhất.
Ian C.

2
@InaC chúng nên được tách riêng vì các câu trả lời khác nhau và một câu trả lời lớn không thể được kiểm tra - ví dụ: xem tôi nói điều này không khắc phục lỗi bash của Apple và câu trả lời tại nhà sao chép Homebrew bash trên OSX. Trong thực tế, chúng là những câu hỏi riêng biệt
Đánh dấu

Xem chỉnh sửa của tôi để câu trả lời của @ AlBlue. Tôi không đồng ý những điều này nên được tách biệt.
Ian C.

17

LƯU Ý liên quan đến bản cập nhật chính thức Apple OS X bash Update 1.0: Bản cập nhật phần mềm này chỉ đưa phiên bản bash chính thức của Apple lên 3.2.53. Bản sửa đổi bản vá 3.2.54 cung cấp thay đổi sau:

Bản vá này thay đổi bash mã hóa sử dụng cho các hàm được xuất để tránh xung đột với các biến shell và để tránh chỉ phụ thuộc vào nội dung của biến môi trường để xác định xem có nên hiểu nó là hàm shell hay không.

Đối với người dùng đã vá hệ thống với các tệp nhị phân 3.2.54, bạn có thể thay thế các tệp nhị phân đã biên dịch của mình bằng bản vá Apple hoặc bạn có thể để mọi thứ như hiện tại nhưng không được khuyến khích. Mặc dù Apple đã để lại phiên bản nhị phân của họ ở mức 3.2.53, bản vá Apple DOES có bản sửa lỗi cho bài kiểm tra khai thác dưới đây:

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

Điều này có nghĩa là nhị phân 3.2.53 chính thức của Apple chứa bảo mật tương đương với nhị phân GNU 3.2.54 của vanilla. Một điểm đáng tiếc của sự nhầm lẫn, nhưng đó là những gì nó được. Sửa lỗi của Apple không phải là một nửa nướng. Nó dường như là một sửa chữa hoàn chỉnh cho vấn đề. Do đó, lộ trình dưới đây để biên dịch vanilla bashshtừ nguồn GNU nên được coi là một tạo tác lịch sử và có thể được tư vấn như một khuôn mẫu cho cách thực hiện các bản vá trong tương lai nếu cần.

LƯU Ý: Với nguồn GNU vanilla, shcó các vấn đề về độ cao đặc quyền gây ra lỗi trong các trình cài đặt khác nhau, ví dụ: Adobe Flash. Tôi thực sự khuyên bạn nên gắn bó với các tệp nhị phân được vá bởi Apple. Xem xét sơ đồ vá này là không tán thành và không khuyến khích.

Có một bản vá GNU bash 3.2.55 mới mô tả cách khắc phục sau:

Mô tả lỗi:

Có hai lỗi tràn bộ đệm cục bộ trong parse.y có thể khiến shell đổ lõi khi được cung cấp nhiều tài liệu ở đây được đính kèm với một lệnh hoặc nhiều vòng lặp lồng nhau.

Chúng tôi để lại cho người đọc nhẹ nhàng để xác định xem có nên ngồi với các tệp nhị phân được vá chính thức của Apple hay tự cuộn để xử lý các khai thác mới có thể. Cá nhân, tôi sẽ gắn bó với các nhị phân của Apple.


Bài đăng này chi tiết cách biên dịch và cài đặt vanilla bashshtrên OS X. Tôi đã chọn tuyến đường này như các ví dụ chi tiết sau khi sử dụng nguồn cụ thể của Apple không để lại cho tôi bản sửa đổi bản vá chính xác. YMMV. Tuy nhiên, bản cài đặt vanilla này được nhắm mục tiêu thay thế các nhị phân OS X để cuối cùng khi Apple phát hành bản cập nhật bảo mật, những thay thế vanilla này sẽ bị chiếm đoạt bởi các đối tác Apple thích hợp của họ.

Cấu hình cơ sở của tôi là:

OS X Lion 10.7.5 và Xcode 4.6.3 với tất cả các tiện ích dòng lệnh được cài đặt.

Các bước của tôi để khắc phục điều này là:

Tải xuống mã nguồn bash cơ sở cho 3.2.48 từ:

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

Tải xuống các bản vá bash3.2.49, .50, .51, .52, .53, .54 và .55 từ:

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

Tôi đã lưu chúng dưới dạng $ filename.patch, ví dụ: bash3.2.50.patch.

CD vào thư mục tải xuống của bạn và

Giải nén nhánh nguồn chính:

tar xzvf bash-3.2.48.tar.gz

cd bash-3.2.48

Giả sử bạn đã đổi tên các tệp vá đã tải xuống của mình như được mô tả trước đó,

cp ../*.patch .

Sau đó …

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

Điều này sẽ hiển thị các bản vá thành công của các tập tin khác nhau. Nếu không, hãy chuẩn bị để thực hiện một số thăm dò và điều tra.

Kế tiếp:

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

Điều đó về cơ bản đã sao lưu các bash và sh shell cũ, dễ bị tổn thương của bạn và loại bỏ đặc quyền thực thi của chúng. Điều đó cung cấp cho bạn khả năng khôi phục các lệnh khi cần thiết, nhưng loại bỏ khả năng gây sát thương của chúng trong thời gian đó.

Kế tiếp:

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

Điều này sẽ cấu hình, biên dịch và cài đặt chính xác nhị phân bash mới vào / bin. Sau khi xong, thoát Terminal và mở lại.

Bạn nên, tất cả những điều hạnh phúc và mỉm cười, có thể bash --versionvà bây giờ xem 3.2.55, ví dụ:

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.

Đầu ra chính xác trong lệnh trên sẽ khác nhau tùy thuộc vào phiên bản OS X của bạn.

Bạn cũng có thể kiểm tra lỗ hổng của mình bashvà thấy rằng nó vẫn ổn.

LƯU Ý: Cho đến nay chúng tôi chỉ sửa lỗi bash, nhưng /bin/shtệp thực thi vẫn ở trạng thái dễ bị tổn thương. Chỉ sao chép bashtrên đỉnh shlà một phong cách làm việc của Linux. Tuy nhiên, shviệc triển khai OS X có một số khác biệt bash, vì vậy bạn sẽ muốn kéo trình biên dịch lại. Thông tin thêm về cách thức bashvà sự shkhác biệt trong OS X có thể được tìm thấy ở đây:

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

Trong thư mục tải xuống của bạn làm:

make clean

Trong trình chỉnh sửa yêu thích của bạn, hãy mở tệp Makefile.invà cuộn đến dòng 99. Chúng tôi sẽ thay đổi dòng Chương trình để nhị phân chúng tôi xuất ra shthay vì bashnhư vậy:

Program = sh$(EXEEXT)

Lưu nó và sau đó

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

Bây giờ bạn sẽ xây dựng shgần như chính xác như Apple.

Một lưu ý cuối cùng: Trên một số hệ thống (tất cả?), Apple thường dường như đặt bashbugtệp thực thi vào /usr/bin. Biên dịch của chúng tôi sẽ đưa nó vào /bin. Vì vậy, các bước cuối cùng ở đây:

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

1
Không phải than vãn hay bất cứ điều gì, nhưng khi câu hỏi là "làm thế nào để tôi biên dịch lại bash" và câu trả lời của tôi là "nhấp vào liên kết sau đây để trả lời cho câu hỏi đó, có vẻ như các yêu cầu tóm tắt là
Trane Francks

2
Hiểu rồi: thư viện readline kèm theo bash không tương thích với 10.6. Thay vào đó hãy cài đặt GNU readline và sau đó hack bash makefile để sử dụng nó. Cài đặt readline: ftp.cwru.edu/pub/bash/readline-6.3.tar.gz Trong bash, sau khi thực hiện cấu hình, trong Makefile, thiết lập READLINE_LIB = /usr/local/lib/libreadline.avà thực hiện biên dịch sạch. Sau đó, tước và sao chép nhị phân bash mới trên đầu /bin/bash/bin/sh
Seth Noble

2
Phụ lục: Trong bash Makefile, cũng cần phải thiết lập HISTORY_LIB = /usr/local/lib/libhistory.a. Nếu không, bash sẽ được liên kết động với phiên bản / usr / local của libhistory.
Seth Noble

1
Lưu ý rằng phiên bản có thể tải xuống từ trang mã nguồn mở của Apple có các thay đổi tùy chỉnh để làm cho nó hoạt động trên OSX. Tôi không khuyên bạn nên sử dụng bash ngược dòng vanilla vì nếu không bạn sẽ không thay thế like-for-like.
AlBlue

1
Apple thực hiện nhiều thay đổi để tối ưu hóa các tiện ích nguồn mở trên hệ thống. Điều đó nói rằng, tôi không thể thấy nơi một vanilla bashbằng cách nào đó không thể tự hành xử chỉ vì hạt nhân khác nhau. Trong mọi trường hợp, tôi coi giải pháp của mình là tạm thời; cuối cùng, Apple sẽ khắc phục sự cố và các tệp nhị phân đã biên dịch của tôi sẽ được thay thế (đó là lý do chính của tôi để biên dịch /binngay từ đầu.
Trane Francks

15

Đối với bất kỳ ai đang vật lộn với việc biên dịch từ nguồn, kể từ ngày 29 tháng 9, Apple đã chính thức phát hành bản vá cho Mac OS X 10.9.5, 10.8.5 cũng như 10.7.5:


1
Cảm ơn! Điều này có thể dễ dàng hơn so với biên dịch lại cho nhiều / hầu hết.
AlBlue

@AlBlue Đồng ý. Ngoài ra, trong khi nó không hoàn toàn sạch sẽ trong bản vá lỗi vì một số người đã chỉ ra rằng điều này tốt hơn nhiều so với không có gì. Và an toàn hơn nhiều so với một số người mới biên dịch mã nguồn trong hoảng loạn.
JakeGould

2
Như thường lệ, độ trễ lan truyền Cập nhật phần mềm có hiệu lực đầy đủ. Tôi tự hỏi bao lâu các gói sẽ xuất hiện. Thật mới mẻ khi thấy rằng Apple đã phản ứng khá nhanh với vấn đề này!
Trane Francks

2
@TraneFrancks, Như thường lệ, độ trễ lan truyền của Cập nhật phần mềm có hiệu lực đầy đủ.
JakeGould

@JakeGould: Heh. Vâng, đó là một tiếng cười khúc khích. Tôi vừa kiểm tra Cập nhật phần mềm trên hệ thống Lion này và nó tuyên bố hệ thống này được cập nhật. Tương tự với một hệ thống Mountain Lion khác ở đây.
Trane Francks

5

Đầu tiên, vá bash và sh cho lỗ hổng này có khả năng phá vỡ một số tập lệnh trên máy Mac của bạn. Bạn thực sự không cần phải làm điều này trừ khi bạn đang cung cấp dịch vụ web cho internet công cộng trực tiếp từ máy Mac của bạn. Vì vậy, nếu nó thực sự không cần thiết, hãy đợi cho đến khi có bản cập nhật bảo mật chính thức từ Apple.

Được cảnh báo, đây là một số hướng dẫn về cách thực hiện bản cập nhật này bằng cách sử dụng Brew trên Mavericks 10.9.

Trước tiên hãy xác nhận rằng bạn đang sử dụng một bash lỗi thời:

$ 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.

Bash hiện tại nhất là 4.3.25

Nếu bạn chưa cài đặt Xcode, bạn sẽ cần các công cụ dòng lệnh Xcode, có thể được cài đặt bởi

$ xcode-select --install

Hoặc từ cổng thông tin dành cho nhà phát triển .

Để cài đặt Bia ( http://brew.sh ):

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

Sau đó làm:

$ brew doctor

Thực hiện theo bất kỳ hướng dẫn nếu có vấn đề. Nhiều vấn đề phổ biến được giải quyết ở đây .

Sau đó cập nhật brew vào danh sách gói mới nhất:

$ brew update

Để nhận được bash mới nhất 4.3.25:

$ brew install bash

Điều này cài đặt bash vào /usr/local/Cellar/bash/4.3.25/bin/bash

Cái cũ bashshvẫn còn tồn tại /bin, vì vậy sau khi cài đặt, bạn sẽ đổi tên các tệp thực thi cũ thành một tệp mới.

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

Nếu bạn rất hoang tưởng, bạn có thể xóa quyền thực thi trên bash_old

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

Sau đó tạo một liên kết tượng trưng cho bash 4.3.25 mới được cài đặt.

$ 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

Khởi động lại và nó đã hoàn thành.

Một cảnh báo - điều này có thể phá vỡ một số tập lệnh shell hiện có có thể dựa vào bash 3.2 hoặc sự khác biệt mà Mac shcó trên linux sh. Có một câu trả lời phức tạp hơn nhiều để thay thế bash và sh từ các nguồn, từ một câu trả lời của @TraneFranks trong cùng chủ đề này.


4
Việc vá lỗi từ 3.2.51 đến 3.2.52 sẽ gây ra thiệt hại ít hơn so với nâng cấp lên 4.3.
AlBlue

Tôi cảnh báo rằng nó có thể phá vỡ một số tập lệnh, nhưng 4.3.25 là những gì Brew cài đặt như hiện tại - Tôi đang cố gắng cung cấp một phiên bản dễ dàng (er) để cài đặt nó từ đầu. Và bạn luôn có thể khôi phục bằng cách đổi tên các tệp thực thi cũ trở lại.
Christopher Allen

2
Lỗi này có thể bị khai thác bởi một máy chủ DHCP độc hại (ví dụ: điểm truy cập WiFi) và hoàn toàn có thể làm hỏng máy tính của bạn, vì vậy nó đáng để sửa chữa càng sớm càng tốt. Các câu trả lời khác có hướng dẫn tốt hơn để thay thế /bin/bash/bin/shđiều đó có thể sẽ gây ra ít vấn đề hơn so với việc nâng cấp lên bash mới nhất của Brew.
Old Pro

Mac có thể không dễ bị tấn công DHCP.
Christopher Allen

10
Tấn công máy chủ DCHP chỉ có thể nếu máy khách DHCP của bạn sử dụng tập lệnh Bash, điều mà việc triển khai OSX không thực hiện được.
AlBlue

5

OS X 10.6.8 - Báo tuyết

Bài đăng của @AlBlue rất đầy đủ. Tuy nhiên, trên máy chủ OS X 10.6.8 của tôi, bản sửa lỗi của anh ta sẽ không hoạt động. Apple không có bản sửa lỗi cho 10.6.8 và các bước được giải thích bởi @AlBlue không hoạt động với Xcode 3.2.6 (đây là phiên bản mới nhất cho Snow Leopard). Tôi nhận được một lỗi:

** 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)

Vì lý do này, tôi đang sử dụng brew.sh . Hãy bình luận suy nghĩ của bạn khi bạn có giải pháp tốt hơn cho OS X 10.6.8 Snow Leopard. Xem thêm bình luận của @Jerome, anh ta đã có một bản vá thành công trên OS X 10.6.8 Snow Leopard bằng giải pháp @ AlBlue. Dù sao:

Đầu tiên cài đặt brew với oneliner sau:

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

Cập nhật brew

brew update

Bây giờ chỉ cần cài đặt phiên bản mới nhất bashvà thay thế phiên bản hiện tại:

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

Bạn có thể đặt vỏ đăng nhập mặc định ' Command (complete path)' cho Terminal.app trong tùy chọn của nó ( Command,) nhập mô tả hình ảnh ở đây


lưu ý: Trong các ý kiến ​​một số người dùng không nghĩ rằng phương pháp này là phù hợp. Nhưng đối với tôi đây là phương pháp dễ hiểu duy nhất để nâng cấp BASH trên OS X 10.6.8 Snow Leopard.


1
Ngoài ra, một số tập lệnh dựa vào bash 3 và không hoạt động với bash 4 (macports đã sửa lỗi bash 4.3.25 mà tôi cho rằng nhà sản xuất bia đã cập nhật lên
Đánh dấu

2
Bạn cũng không cập nhật sh- bạn cũng cần phải làm điều đó. /bin/sh! = /bin/bash. Nhiều công cụ trình bày /bin/shkhi bạn chạy các lệnh hệ thống. system()Ví dụ, cuộc gọi của Ruby sử dụng /bin/shkhi bạn có một ký tự mở rộng shell cần được mở rộng trong chuỗi. Bạn đang chơi một trò chơi thua bằng Homebrew để cập nhật hệ thống nhị phân IMO. Bạn nên cập nhật Homebrew bash ngoài việc cập nhật đúng các nhị phân hệ thống.
Ian C.

1
Hãy nhớ rằng OSX 10.8 và 10.9 sử dụng Bash 3.2, vì vậy để thống nhất trực tiếp, tôi đã sử dụng phiên bản 3.2. Điều này cũng dựa trên bản dựng chính thức của Apple cho phiên bản trước, có thể bao gồm các tính năng bổ sung như nhận thức thuộc tính mở rộng, v.v.
AlBlue

1
Tôi đang chạy 3.2.6 trên tất cả các trường hợp. Tôi hiểu việc xây dựng thất bại khi chạy xcodebuild? Nếu vậy, tôi đã không trải nghiệm điều đó. Tôi có một vài gợi ý chắc chắn để đưa bạn sang một bên: kiểm tra xem bạn có nhiều bản dựng bash không, xem xét việc dọn dẹp (gỡ cài đặt bia) và có thể cài đặt lại xcode ... sau đó bắt đầu quá trình vá lỗi một lần nữa.
Jerome

1
Tôi đã gặp vấn đề kiểm soát công việc nghiêm trọng với chứng khoán bash-4.3 được xây dựng bằng tay trên Snow Leopard (Nếu tôi bắt đầu sử dụng emacs và sau đó tạm dừng nó, tôi không thể tiếp tục với 'fg'). Kể từ khi tôi tải xuống nguồn Snow Leopard cho bash từ opensource.apple.com/release/mac-os-x-1068 , đã áp dụng các bản vá từ ftp.gnu.org/gnu/bash/bash-3.2-patches và được xây dựng lại hiệu quả tốt hơn nhiều.
mormegil

-6

Bạn có thể làm theo hướng dẫn tại đây: https://github.com/tjluoma/bash-fix Về cơ bản, hãy làm như sau trong Terminal:

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

5
Thực thi các tập lệnh shell ngẫu nhiên từ các tài khoản github ngẫu nhiên không phải là cách bạn có được tình huống an toàn hơn trên bất kỳ máy nào. Bạn muốn tin tưởng điểm cuối.
Ian C.

Tôi phải đồng ý với Ian ở đây. Thật dễ dàng để giới thiệu một số thiệt hại đáng kể thông qua các tập lệnh shell không đáng tin cậy, chẳng hạn như các vấn đề mà các CVE này mô tả.
Trane Francks

Rất không đồng ý với sự lan truyền này của FUD. ĐỌC tất cả các tập lệnh shell trước khi thực hiện chúng và chỉ từ https: //.
dhchdhd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.