Bagaimana cara saya mengkompilasi ulang Bash untuk menghindari Shellshock (eksploitasi jarak jauh CVE-2014-6271 dan CVE-2014-7169)?


Mengingat bahwa Bash 3.2 (versi yang dikirim oleh OS X) rentan terhadap eksploitasi eksekusi jarak jauh yang dikenal sebagai "Shell Shock" ( CVE-2014-6271 dan CVE-2014-7169 ) bagaimana cara membangun kembali Bash dan mengamankan sistem saya sebelum tambalan resmi Apple?

UPDATE: Perhatikan bahwa Apple sekarang telah merilis tambalan resmi. Lihat di bawah untuk detailnya.


5
Apple telah merilis sebuah perbaikan: support.apple.com/kb/DL1769
AT

1
Patch Pembaruan 1.0 OS X bash yang disebutkan di atas khusus untuk OS X 10.9.5 atau lebih baru - Berikut semuanya: OS X 10.7.5 (Lion), OS X 10.8.5 (Mountain Lion), OS X 10.9.5 ( Mavericks).
l'L'l

Ya, saya memiliki tautan yang ditambahkan 9 jam yang lalu tetapi tautannya salah dihapus. apple.stackexchange.com/revisions/146849/10
AlBlue

membuat gist gist.github.com/dnozay/395dcdef05c6b4b1836a yang memiliki sebagian besar langkah dan sudah memiliki tambalan yang disertakan (dan harus bekerja pada OSX 10.6).
dnozay

@nozay, Terima kasih atas intinya! Harap perbarui untuk menyertakan tambalan 55 dan 56 (sudah keluar) dan 57 (segera keluar).
Old Pro

Jawaban:


Status

Apple telah merilis perbaikan keamanan Bash untuk Shellshock dan kerentanan terkait sebagai " OS X bash Update 1.0 ". Mereka dapat diinstal melalui pembaruan sistem normal untuk orang yang menggunakan OS X Mountain Lion v10.8.5 atau OS X Mavericks v10.9.5 (mereka termasuk dalam Pembaruan Keamanan 2014-005 ) dan juga dapat diinstal secara manual. Perbaikan Apple resmi juga tersedia untuk OS X Lion v10.7.5 dan OS X Lion Server v10.7.5 tetapi hanya tersedia melalui unduhan manual. Perbaikan keamanan tersedia melalui berbagai URL berdasarkan versi sistem operasi:

(Jika tambalan baru dirilis, taruh di sini tapi tolong simpan tambalan yang ada ini juga untuk referensi.)

Patch Apple menangani Shellshock dan beberapa kerentanan lainnya dan baik untuk kebanyakan orang. tl; dr orang dapat berhenti membaca di sini.

NAMUN, perhatian yang ditarik ke bash oleh bug Shellshock telah menyebabkan banyak peneliti memperhatikan bash dan semakin banyak kerentanan (sulit dieksploitasi) terus ditemukan. Jika Anda sangat khawatir tentang keamanan (karena mungkin Anda menjalankan OS X Server untuk meng-host situs web yang tersedia untuk umum) maka Anda mungkin ingin (mencoba untuk) mengikuti kerentanan dan tambalan saat mereka terus bergulir dengan menyusun bash sendiri. Kalau tidak, jangan khawatir tentang itu.

Cari Apple untuk merilis pembaruan lain untuk bersenang-senang di masa depan ketika debu mulai menemukan kerentanan lebih lanjut.


Seperangkat tambalan resmi dari bash sendiri untuk bash 3.2, tambalan 52, 53, dan 54 (yang terkait dengan patch Bash 4.3 25, 26, dan 27) tersedia yang memperbaiki CVE-2014-6271 dan CVE-2014-7169, serta 'Game over' yang ditampilkan di bawah ini. Ini telah diuji oleh saya ( @alblue ) dan pos telah diperbarui sesuai (dan kemudian pembaruan tambahan dibuat: lihat revisi 41 untuk posting yang berhenti di patch 54).

Banyak kerentanan tambahan telah dilaporkan terhadap bash. Menurut posting Michal Zalewski jika Anda memiliki patch 54 (dan mungkin patch resmi Apple) "tidak ada gunanya terobsesi tentang status bug individu ini, karena mereka seharusnya tidak lagi menimbulkan risiko keamanan:"

  • CVE-2014-6271 - RCE asli ditemukan oleh Stephane. Diperbaiki oleh bash43-025 dan entri 24 Sep yang sesuai untuk versi lain.

  • CVE-2014-7169 - bug pembuatan file / token yang ditemukan oleh Tavis. Diperbaiki oleh bash43-026 & co (26 Sep)

  • CVE-2014-7186 - mungkin 10+ kecelakaan di sini-tanpa risiko yang ditemukan oleh Florian dan Todd. Diperbaiki oleh bash43-028 & co (1 Oktober).

  • CVE-2014-7187 - off-by-one yang tidak menabrak, mungkin tanpa risiko ditemukan oleh Florian. Diperbaiki oleh bash43-028 & co (1 Oktober).

  • CVE-2014-6277 - masalah memori tidak diinisialisasi, hampir pasti RCE ditemukan oleh Michal Zalewski. Belum ada tambalan spesifik.

  • CVE-2014-6278 - perintah injeksi RCE ditemukan oleh Michal Zalewski. Belum ada tambalan spesifik.

Itu jadi sangat membingungkan. Untungnya Chet Ramey, pengelola bash resmi, memasang CVE untuk memetakan pemetaan . Posnya merujuk ke tambalan untuk bash 4.3, I (@OldPro) telah menerjemahkannya ke tambalan untuk bash 3.2, yang merupakan apa yang berlaku untuk OS X. Juga, karena posting ini ia telah merilis tambalan 57, jadi saya menambahkannya di bawah:

 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

Lihat posting David A. Wheeler untuk garis waktu dan detail yang lebih besar.

@alblue memposting instruksi pembangunan melalui patch 55. I (@OldPro) menambahkan patch 56 dan 57 pada instruksi tetapi belum mengujinya.

Menguji Kerentanan asli

Anda dapat menentukan apakah Anda rentan terhadap masalah asli di CVE-2014-6271 dengan menjalankan tes ini:

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

Output di atas adalah contoh dari versi yang tidak rentan bash. Jika Anda melihat kata vulnerabledalam output dari perintah itu, Anda bashrentan dan Anda harus memperbarui. Di bawah ini adalah versi yang rentan dari OS X 10.8.5:

Cuplikan layar terminal bash menunjukkan kerentanan di 10.8.5

Menguji Kerentanan baru

Telah ada pembaruan untuk posting asli dan Bash 3.2.52 (1) masih rentan terhadap variasi kerentanan, didefinisikan dalam 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

Output di atas adalah contoh dari bashversi yang rentan . Jika Anda melihat tanggal di output dari perintah itu, Anda bashrentan.

Menonaktifkan fungsi yang diimpor otomatis untuk mencegah "Game Over"

Peneliti mencatat, tanpa mengklasifikasikannya sebagai kerentanan, bahwa skrip dapat membajak suatu fungsi dalam subkulit menggunakan fungsi yang diimpor otomatis:

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

Kode di atas pada sistem yang terpengaruh akan menampilkan Game Overalih-alih daftar direktori yang Anda harapkan ls. Jelas, echo 'Game Over'bisa diganti dengan kode jahat yang Anda inginkan. Ini menjadi dikenal sebagai bug "Game Over".

Sebelum ketersediaan patch 54, baik NetBSD dan FreeBSD menonaktifkan fungsi bash auto-importing secara default, sebagian untuk mencegah "Game Over" tetapi terutama untuk mengandung kesalahan lebih lanjut dalam parser (seperti CVE-2014-7169 ) karena mereka adalah terus ditemukan, dan menambahkan bendera baris perintah baru--import-functionsuntuk mengaktifkan kembali perilaku default lama. Saya (@blue) telah menyiapkan tambalan (terhadap 3.2.53) untuk digunakan orang lain jika mereka juga ingin mengadopsi perilaku ini dan memasukkannya di bawah. Secara default tambalan ini tidak diaktifkan di skrip build di bawah ini. Saya (@ OldPro) percaya bahwa tambalan ini tidak lagi diperlukan atau merupakan ide yang baik, karena ia merusak kompatibilitas ke belakang dan kerentanan yang dilindunginya ditangani dengan sangat baik oleh tambalan 54 dan tambalan sebelumnya, dan memungkinkan tambalan tidak resmi ini mencegah tambalan di masa depan tidak diterapkan. .

(Catatan untuk mempertanyakan editor; harap jangan aktifkan ini secara default, karena ini merupakan patch tidak resmi.)

a0c5c4d66742fddd0a35001cb91798a5fbf8a2f5 import_functions.patch

Patch dapat diaktifkan dengan menjalankan export ADD_IMPORT_FUNCTIONS_PATCH=YESsebelum menjalankan build. Perhatikan bahwa mengaktifkan tambalan ini akan menonaktifkan tambalan 54 dan tambalan di masa depan karena tambalan di masa depan tidak dapat dijamin kompatibel dengan tambalan tidak resmi.

Apple Patch memiliki kerentanan Game Over, semacam

Seperti yang ditunjukkan oleh @ake_____ di twitter tambalan resmi Apple masih rentan terhadap penghancuran lingkungan yang dapat dieksekusi:

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

Pengguna harus memutuskan sendiri seberapa penting hal ini. Saya (@ OldPro) berpikir itu tidak perlu dikhawatirkan karena tidak ada eksploit yang diketahui untuk perilaku ini (bahkan tidak diberi pengenal CVE) karena pada umumnya penyerang jarak jauh yang tidak memiliki hak tidak dapat menetapkan nama variabel lingkungan dan penyerang dengan hak istimewa tidak dapat gunakan ini untuk mendapatkan hak istimewa yang belum mereka miliki (setidaknya tidak tanpa mengeksploitasi kerentanan tambahan).

Untuk memberikan sedikit latar belakang, bash memungkinkan Anda untuk mendefinisikan fungsi, dan selanjutnya memungkinkan Anda untuk mengekspor fungsi tersebut ke subkulit melalui export -fperintah. Ini dulu diimplementasikan dengan membuat variabel lingkungan dengan nama yang sama dengan fungsi dengan nilainya diatur ke definisi fungsi. Begitu

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

Ini terjadi karena export -f lsmenciptakan variabel lingkungan bernama ls. Kerentanan "Game Over" adalah Anda dapat secara langsung membuat variabel lingkungan ini tanpa harus terlebih dahulu mendefinisikan fungsi, yang berarti jika Anda bisa menyuntikkan nama variabel yang tepat, Anda dapat membajak sebuah perintah. Apple mencoba untuk memperbaikinya dengan membuatnya sulit untuk membuat variabel dengan nama yang tepat. Patch bash resmi (54) sebenarnya membuat tidak mungkin untuk membuat variabel dengan nama yang tepat dengan menggunakan nama variabel yang menyertakan %karakter yang tidak diizinkan dalam nama variabel, secara efektif menempatkan definisi fungsi yang diekspor di ruang nama yang berbeda, disediakan.

Jika tidak ada satu pun di atas yang masuk akal bagi Anda, jangan khawatir tentang hal itu. Anda baik-baik saja dengan patch Apple untuk saat ini.

Binari Sistem

OS X 10.9.5 (rilis stabil terbaru saat ini) dikirimkan bersama 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.

Anda dapat memperoleh dan mengkompilasi ulang Bash sebagai berikut , asalkan Anda telah menginstal Xcode (dan telah menjalankan xcodebuildsetidaknya satu kali sebelumnya untuk menerima lisensi):

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

(Catatan: Anda dapat menjalankan ini dengan menyalin dan menempelkan blok kode di atas, masuk ke Terminal dan kemudian menjalankan pbpaste | cut -c 2- | sh. Selalu berhati-hati saat menjalankan skrip acak dari internet ...)

Setelah ini, versi Bash harus v3.2.57:

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

Untuk keamanan, dan setelah pengujian, saya sarankan agar Anda chmod -xmenggunakan versi lama untuk memastikan mereka tidak digunakan kembali, atau memindahkannya ke situs cadangan.

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

Jawaban lain memiliki solusi untuk mereka yang menggunakan MacPorts atau Homebrew; ini tidak memperbaiki masalah, mereka hanya menginstal versi Bash tambahan. Silakan lihat jawaban-jawaban itu jika Anda ingin memutakhirkannya secara khusus.

Terima kasih

Terima kasih kepada Chet, yang menjaga bash, dan telah membuat tambalan ini tersedia. Terima kasih kepada semua orang yang telah mengomentari ini dan memperbaikinya seiring waktu.

Sekarang Apple telah merilis perbaikan nyata, meskipun ini mungkin masih berguna. Karena mereka hanya merilis perbaikan untuk Lion and up, dan tambalan resmi menyediakan GNU bash, versi 3.2.53 (1) -release (x86_64-apple-darwin13), namun, Game over bug masih agak rentan. Pada titik ini, membangun kembali versi Bash Anda sendiri terhadap 3.2.57 mungkin lebih aman daripada mengandalkan tambalan Apple, kecuali jika Anda salah melakukannya.


Macports

Ini memberi Anda versi bash 4.3.28 (1) yang menambal kedua kerentanan (CVE-2014-6271 dan CVE-2014-7169) serta beberapa yang kemudian ditemukan. Ini berguna jika Anda telah mengganti cangkang untuk menggunakan Macports bash untuk mendapatkan fitur versi 4.

Ini tidak akan menyelesaikan masalah skrip OS standar seperti yang dimiliki #!/bin/shatau #!/bin/bashsebagai baris pertama. Masalah seperti ini adalah mengapa Macports mencoba untuk tidak menggunakan versi program yang disediakan Apple karena Macports cenderung diperbarui lebih cepat misalnya memiliki versi bash yang lebih baru)

Anda dapat menggunakan terminal ini seperti dalam jawaban Homebrew

Untuk menginstal macports ikuti petunjuk ini yaitu
1. Instal Xcode dan Alat Baris Perintah Xcode
2. Setuju untuk lisensi Xcode di Terminal: sudo xcodebuild -license
3. Unduh MacPorts pkg untuk versi OS X Anda: tautan ada di halaman
4. Jalankan pkg

Ketika Anda telah menginstal macports Anda perlu ke versi terbaru, ini dilakukan dengan menjalankan

sudo port selfupdate

dan kompilasi ulang atau dapatkan binari terbaru oleh

sudo port upgrade outdated

5
Karena ini adalah tentang memperbaiki kerentanan keamanan dalam binari yang ada, dan ini tidak menggantikan / memperbaiki binari yang rentan, saya gagal melihat bagaimana ini menyelesaikan masalah.
AlBlue

Itu rubah versi macports - dan benar-benar meminta komentar IanC
Mark

Iya. Kita harus membuat daftar perbaikan untuk semua tempat yang bashbiasanya berasal dari OS X - jadi perbaikan sistem, perbaikan Homebrew dan MacPorts. Mungkin Fink juga. Saya pribadi lebih suka jika ini dibuat sebagai edit untuk jawaban @ AlBlue. Jadi itu semua satu, paling benar, jawabannya.
Ian C.

2
@InaC ini harus terpisah karena jawabannya berbeda dan satu besar tidak dapat diperiksa - mis. Lihat saya mengatakan ini tidak memperbaiki bash Apple dan jawaban buatan rumahan menyalin bash Homebrew melalui OSX. Akibatnya mereka adalah pertanyaan yang terpisah
Mark

Lihat hasil edit saya untuk jawaban @ AlBlue. Saya tidak setuju ini harus terpisah.
Ian C.

CATATAN mengenai Pembaruan Resmi Apple OS X 1.0: Pembaruan perangkat lunak ini hanya membawa versi resmi Apple bash ke 3.2.53. Revisi patch 3.2.54 menawarkan perubahan berikut:

Patch ini mengubah penggunaan pengkodean bash untuk fungsi yang diekspor untuk menghindari bentrokan dengan variabel shell dan untuk menghindari hanya bergantung pada konten variabel lingkungan untuk menentukan apakah akan menafsirkannya sebagai fungsi shell atau tidak.

Untuk pengguna yang telah menambal sistem dengan 3.2.54 binari, Anda dapat mengganti binari yang dikompilasi dengan patch Apple atau Anda dapat membiarkan hal-hal apa adanya tetapi tidak disarankan. Meskipun Apple meninggalkan versi biner mereka di 3.2.53, Apple patch DOES berisi perbaikan untuk tes exploit di bawah ini:

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

Ini berarti bahwa biner resmi Apple 3.2.53 berisi keamanan yang setara dengan biner GNU 3.2.54 vanilla. Suatu titik kebingungan yang tidak menguntungkan, tetapi memang demikianlah adanya. Perbaikan Apple tidak setengah matang. Tampaknya menjadi perbaikan lengkap untuk masalah ini. Dengan demikian, peta jalan di bawah ini untuk mengkompilasi vanila bashdan shdari sumber GNU harus dianggap sebagai artefak bersejarah dan mungkin dikonsultasikan sebagai templat untuk cara melakukan tambalan di masa depan jika diperlukan.

CATATAN: Dengan sumber GNU vanilla, shmemiliki masalah elevasi hak istimewa yang menyebabkan kegagalan di berbagai installer, misalnya, Adobe Flash. Saya sangat merekomendasikan untuk tetap menggunakan binari Apple-patched. Pertimbangkan skema tambalan ini sudah usang dan keliru.

Ada tambalan GNU bash 3.2.55 baru yang menjelaskan perbaikan berikut:

Bug-Deskripsi:

Ada dua buffer overflows lokal di parse.y yang dapat menyebabkan shell untuk membuang core ketika diberikan banyak di sini-dokumen yang dilampirkan ke perintah tunggal atau banyak loop bersarang.

Kami serahkan kepada pembaca yang lembut untuk menentukan apakah akan duduk dengan binari resmi Apple yang ditambal atau menggulung milik Anda untuk menangani kemungkinan eksploitasi baru. Secara pribadi, saya akan tetap menggunakan binari Apple.


Posting ini merinci cara mengkompilasi dan menginstal vanila bashdan shpada OS X. Saya memilih rute ini sebagai contoh berikut merinci menggunakan sumber khusus Apple tidak meninggalkan saya dengan revisi patch yang benar. YMMV. Instalasi vanilla ini, bagaimanapun, ditargetkan untuk menggantikan binari OS X sehingga ketika Apple akhirnya merilis pembaruan keamanan, penggantian vanilla ini akan diambil alih oleh rekan-rekan Apple mereka yang tepat.

Konfigurasi basis saya adalah:

OS X Lion 10.7.5 dan Xcode 4.6.3 dengan semua utilitas baris perintah terpasang.

Langkah saya untuk memperbaikinya adalah:

Unduh kode sumber bash dasar untuk 3.2.48 dari:

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

Unduh patch bash3.2.49, .50, .51, .52, .53, .54 dan .55 dari:

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

Saya menyimpannya sebagai $ filename.patch, misalnya, bash3.2.50.patch.

CD ke direktori unduhan Anda dan ...

Buka paket cabang sumber utama:

tar xzvf bash-3.2.48.tar.gz

cd bash-3.2.48

Dengan asumsi bahwa Anda telah mengganti nama file tambalan yang diunduh seperti dijelaskan sebelumnya,

cp ../*.patch .

Kemudian …

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

Ini harus menunjukkan tambalan yang sukses dari berbagai file. Jika tidak, bersiaplah untuk melakukan eksplorasi dan investigasi.

Lanjut:

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

Itu pada dasarnya mendukung bash dan sh shell lama dan rentan Anda serta menghapus hak istimewa yang dapat dieksekusi. Itu memberi Anda kapasitas untuk mengembalikan perintah yang diperlukan, tetapi menghilangkan kemampuan mereka untuk melakukan kerusakan sementara itu.

Lanjut:

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

Ini harus mengkonfigurasi, mengkompilasi dan menginstal binash bash baru ke / bin dengan benar. Setelah selesai, keluar dari Terminal dan buka kembali.

Anda harus, semua hal bahagia dan tersenyum, dapat bash --versiondan sekarang melihat 3.2.55, misalnya:

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.

Output tepat dalam perintah di atas akan berbeda tergantung pada versi OS X Anda.

Anda juga harus dapat menguji kerentanan Anda bashdan menemukan bahwa itu baik-baik saja.

CATATAN: Kami hanya memperbaiki bash sejauh ini, tetapi /bin/shexecutable masih dalam kondisi rentan. Hanya menyalin bashdi atas shadalah gaya Linux dalam melakukan sesuatu. shImplementasi OS X memiliki beberapa perbedaan bash, jadi Anda harus menyeret keluar lagi kompiler. Informasi lebih lanjut tentang bagaimana bashdan shperbedaan dalam OS X dapat ditemukan di sini:

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

Di direktori unduhan Anda lakukan:

make clean

Di editor favorit Anda, buka file Makefile.indan gulir ke baris 99. Kita akan mengubah baris Program sehingga biner yang kita hasilkan shbukannya bashseperti:

Program = sh$(EXEEXT)

Simpan itu lalu

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

Sekarang Anda akan membangun shhampir persis seperti Apple.

Satu catatan terakhir: Pada beberapa (semua?) Sistem, Apple biasanya menempatkan bashbugexecutable /usr/bin. Kompilasi kami akan memasukkannya ke dalam /bin. Jadi, langkah terakhir di sini:

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

1
Bukan untuk merengek atau apa pun, tetapi ketika pertanyaannya adalah "bagaimana cara saya mengkompilasi ulang bash" dan jawaban saya adalah "klik tautan berikut untuk menjawab pertanyaan itu, tampaknya persyaratan ringkasan berlaku.
Trane Francks

2
Mengerti: perpustakaan readline yang disertakan dengan bash tidak kompatibel dengan 10.6. Instal GNU readline sebagai gantinya dan hack hack bash makefile untuk menggunakannya. Instal readline: ftp.cwru.edu/pub/bash/readline-6.3.tar.gz Di bash, setelah melakukan configure, di Makefile, atur READLINE_LIB = /usr/local/lib/libreadline.adan lakukan kompilasi bersih. Kemudian cabut dan salin biner bash baru di atas /bin/bashdan/bin/sh
Seth Noble

2
Tambahan: Di Makefile bash, perlu juga diatur HISTORY_LIB = /usr/local/lib/libhistory.a. Jika tidak, bash akan ditautkan secara dinamis ke versi libhistory / usr / local.
Seth Noble

1
Perhatikan bahwa versi yang dapat diunduh dari halaman opensource Apple memiliki perubahan khusus untuk membuatnya berfungsi pada OSX. Saya tidak akan merekomendasikan menggunakan vanilla hash bash karena jika tidak, Anda tidak akan mengganti like-for-like.
AlBlue

1
Apple membuat banyak perubahan untuk mengoptimalkan utilitas open source pada sistem. Yang mengatakan, saya tidak bisa melihat di mana vanilla bashentah bagaimana gagal berperilaku sendiri hanya karena kernelnya berbeda. Bagaimanapun, saya menganggap solusi saya bersifat sementara; akhirnya, Apple akan memperbaiki masalah dan biner yang saya susun akan diganti (yang merupakan alasan utama saya untuk mengompilasi /bindi tempat pertama.
Trane Francks

Bagi siapa pun yang kesulitan mengkompilasi dari sumber, pada tanggal 29 September, Apple telah secara resmi merilis patch untuk Mac OS X 10.9.5, 10.8.5 dan 10.7.5:


1
Terima kasih! Ini mungkin lebih mudah daripada mengkompilasi ulang untuk banyak / sebagian besar.
AlBlue

@AlBlue Setuju. Juga sementara tidak sepenuhnya bersih di dalamnya patching - seperti yang telah ditunjukkan beberapa orang - ini jauh lebih baik daripada tidak sama sekali. Dan jauh lebih aman daripada beberapa kompilasi kode sumber pemula dalam panik.
JakeGould

2
Seperti biasa, penundaan propagasi Pembaruan Perangkat Lunak berlaku penuh. Saya ingin tahu berapa lama paket akan muncul. Sangat menyegarkan melihat bahwa Apple merespons dengan cepat masalah ini!
Trane Francks

2
@TraneFrancks “Seperti biasa, penundaan propagasi Pembaruan Perangkat Lunak dalam efek penuh.” Saya benar-benar tidak mengerti bagaimana organisasi itu dan mendorong album lengkap U2 ke semua pengguna iOS entah bagaimana dapat tersedak pembaruan keamanan kurang dari 4MB.
JakeGould

@JakeGould: Heh. Ya, itu cekikikan. Saya baru saja memeriksa Pembaruan Perangkat Lunak pada sistem Lion ini dan mengklaim sistemnya mutakhir. Sama dengan sistem Mountain Lion lain di sini.
Trane Francks

Pertama, menambal bash dan sh untuk kerentanan ini kemungkinan akan mematahkan beberapa skrip di Mac Anda. Anda benar-benar tidak perlu melakukan ini kecuali Anda menawarkan layanan web ke internet publik langsung dari Mac Anda. Jadi jika itu benar-benar tidak perlu, tunggu sampai ada pembaruan keamanan resmi dari Apple.

Diperingatkan, berikut adalah beberapa petunjuk tentang cara melakukan pembaruan ini menggunakan Brew on Mavericks 10.9.

Pertama konfirmasikan bahwa Anda menggunakan bash kedaluwarsa:

$ 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 terbaru adalah 4.3.25

Jika Anda belum menginstal Xcode, Anda memerlukan alat-alat baris perintah Xcode, yang dapat diinstal oleh

$ xcode-select --install

Atau dari portal pengembang .

Untuk menginstal Brew ( http://brew.sh ):

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

Lalu lakukan:

$ brew doctor

Ikuti instruksi apa pun jika ada masalah. Banyak masalah umum dibahas di sini .

Kemudian perbarui minuman ke daftar paket terbaru:

$ brew update

Untuk mendapatkan bash 4.3.25 terbaru:

$ brew install bash

Ini menginstal bash ke /usr/local/Cellar/bash/4.3.25/bin/bash

Yang lama bashdan shmasih ada di /bin, jadi setelah menginstal Anda akan mengubah nama executable lama ke file baru.

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

Jika Anda sangat paranoid, Anda dapat menghapus izin eksekusi di bash_old

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

Kemudian buat tautan simbolis ke bash 4.3.25 baru yang dibuat bir.

$ 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

Mulai ulang dan selesai.

Peringatan - ini dapat memecah beberapa skrip shell yang ada yang mungkin bergantung pada bash 3.2 atau perbedaan yang dimiliki Mac shatas linux sh. Ada jawaban yang jauh lebih canggih untuk mengganti bash dan sh dari sumber, dari jawaban oleh @TraneFranks di utas yang sama ini.


4
Menambal dari 3.2.51 ke 3.2.52 akan menyebabkan kerusakan jauh lebih sedikit daripada meningkatkan ke 4.3. anything.
AlBlue

Saya memperingatkan bahwa itu mungkin memecahkan beberapa skrip, tetapi 4.3.25 adalah apa yang diinstal oleh Brew saat ini - Saya mencoba menawarkan versi yang mudah untuk menginstalnya dari awal. Dan Anda selalu dapat memulihkan dengan mengganti nama executable lama kembali.
Christopher Allen

2
Bug ini dapat dieksploitasi oleh server DHCP jahat (mis. WiFi hotspot) dan dapat sepenuhnya merusak komputer Anda, jadi ada baiknya memperbaiki ASAP. Jawaban lain memiliki instruksi yang lebih baik untuk mengganti /bin/bashdan /bin/shyang kemungkinan akan menyebabkan lebih sedikit masalah daripada memutakhirkan ke pesta terbaru Brew.
Old Pro

Mac mungkin tidak rentan terhadap serangan DHCP.
Christopher Allen

10
Serangan server DCHP hanya mungkin jika klien DHCP Anda menggunakan skrip Bash, yang tidak diimplementasikan oleh OSX.
AlBlue

OS X 10.6.8 - Snow Leopard

Posting @AlBlue sangat lengkap. Namun, pada server OS X 10.6.8 saya perbaikannya tidak akan berfungsi. Apple tidak memiliki fix untuk 10.6.8 dan langkah-langkah yang dijelaskan oleh @AlBlue tidak bekerja dengan Xcode 3.2.6 (yang merupakan versi terbaru untuk Snow Leopard). Saya menerima kesalahan:

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

Untuk alasan ini saya menggunakan brew.sh . Silakan komentar pikiran Anda ketika Anda memiliki solusi yang lebih baik untuk OS X 10.6.8 Snow Leopard. Lihat juga komentar @Jerome, ia memiliki patch yang sukses di OS X 10.6.8 Snow Leopard menggunakan solusi @ AlBlue. Bagaimanapun:

Instal brew terlebih dahulu dengan oneliner berikut:

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

Memperbarui brew

brew update

Sekarang cukup instal versi terbaru bashdan ganti yang sekarang:

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

Anda dapat mengatur shell login default ' Command (complete path)' untuk Terminal.app di preferensi ( Command,) masukkan deskripsi gambar di sini


Catatan: Dalam komentar beberapa pengguna tidak menganggap metode ini tepat. Tetapi bagi saya ini adalah satu-satunya metode yang dapat dipahami untuk meningkatkan BASH pada OS X 10.6.8 Snow Leopard.


1
juga beberapa skrip mengandalkan bash 3 dan tidak berfungsi dengan bash 4 (macports telah memperbaiki bash 4.3.25 yang saya asumsikan buatan rumahan telah diperbarui ke
Mark

2
Anda tidak memperbarui shjuga - Anda perlu melakukannya juga. /bin/sh! = /bin/bash. Banyak alat keluar /bin/shketika Anda menjalankan perintah sistem. system()Panggilan Ruby , misalnya, digunakan /bin/shketika Anda memiliki karakter ekspansi shell yang perlu diperluas dalam string. Anda memainkan permainan yang kalah menggunakan Homebrew untuk memperbarui binari sistem Anda IMO. Anda harus memperbarui Homebrew bash selain melakukan pembaruan yang tepat dari sistem binari.
Ian C.

1
Ingatlah bahwa OSX 10.8 dan 10.9 menggunakan Bash 3.2, jadi untuk konsistensi langsung saya menggunakan 3.2 sebagai versi. Ini juga didasarkan pada bangunan resmi Apple untuk versi sebelumnya, yang dapat mencakup tambahan seperti kesadaran atribut yang diperluas, dll.
AlBlue

1
Saya menjalankan 3.2.6 sendiri di semua instance. Saya mengerti build gagal ketika berjalan xcodebuild? Jika demikian, saya tidak mengalaminya. Saya punya beberapa saran yang solid untuk Anda sisihkan: periksa apakah Anda memiliki banyak bash build, pertimbangkan untuk membersihkan (brew uninstall) dan mungkin menginstal ulang xcode ... kemudian mulai proses patch lagi.
Jerome

1
Saya memiliki masalah kontrol pekerjaan yang serius dengan bash-4.3 stock buatan tangan di Snow Leopard (Jika saya memulai emacs dan kemudian menangguhkannya, saya tidak dapat melanjutkannya dengan 'fg'). Sejak itu saya mengunduh sumber Snow Leopard untuk bash dari opensource.apple.com/release/mac-os-x-1068 , menerapkan tambalan dari ftp.gnu.org/gnu/bash/bash-3.2-patches , dan dibangun kembali untuk efek yang jauh lebih baik.
mormegil

Anda dapat mengikuti instruksi di sini: https://github.com/tjluoma/bash-fix Pada dasarnya, lakukan hal berikut di Terminal:

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

5
Menjalankan skrip shell acak dari akun github acak bukanlah cara Anda mendapatkan situasi yang lebih aman di mesin apa pun. Anda ingin mempercayai titik akhir.
Ian C.

Saya harus setuju dengan Ian di sini. Sangat mudah untuk memperkenalkan beberapa kerusakan dramatis melalui skrip shell yang tidak dipercaya, seperti masalah yang dijelaskan oleh CVE ini.
Trane Francks

Sangat tidak setuju dengan penyebaran FUD ini. BACA semua skrip shell sebelum menjalankannya, dan hanya dari https: //.
dhchdhd
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.