CVE-2014-6271 bash savunmasızlığı (Shellshock) nedir ve nasıl düzeltebilirim?

140

Son zamanlarda, "CVE-2014-6271" ile ilgili haberler yayınlanıyor (Bkz. USN-2362- 1 ), Bash'deki bir güvenlik açığıdır. Bundan etkilenip etkilenmediğimi nasıl anlarım, nasıl düzeltebilirim ve neden umurumda olsun ki?

Bu, kapsamı ve öneminden dolayı bu güvenlik açığına yönelik kanonik bir yanıt olarak tasarlanmıştır.

    
sordu hexafraction 24.09.2014 23:48

5 cevap

127

Bash nedir?

Bash, Ubuntu'daki varsayılan etkileşimli kabuktur. Terminal ile arayüz oluştururken (terminal emülatörü, tty veya ssh üzerinden), genellikle bash 'nin okuyacağı ve çalıştırdığı komutları yazarsınız. Terminali hiç kullanmasanız bile, hala Bash'iniz var.

Ubuntu'da, /bin/sh bash değil (tire). Bu güvenlik açığından yalnızca bash etkileniyor.

Kötülük beni nasıl etkiler?

Bash ve işletim sistemi, o anda oturum açmış olan kullanıcıyı tanımlayan bir ortam değişkenleri kümesini izler; burada sabit diskteki programları ve bu gibi diğer işlevleri arar. Belirli bir yapıya sahip bir ortam değişkenini işleyerek, bir saldırgan Bash başladığında bir dahaki kodu çalıştırabilir.

Saldırgan, bu ortam değişkenini birden çok şekilde ayarlayabilir:

  • SSH gibi bir hizmete, ssh üzerinden git gibi belirli bir kurulumla uzaktan bağlanın. Mitre'nin uyardığı gibi, sshd ForceCommand seçeneğinin kullanılması bir saldırı vektörüdür. Kabuğu bash olmayan hesaplar etkilenmez.
  • Çevre değişkenini ayarlamaya sizi kandırdım.
  • Başka bir programın, oluşturulan bir değere sahip olması için bir ortam değişkenini ayarlaması. Örneğin, belirli kullanıcı içeriğine sahip bir ortam değişkeni ayarlamanız gereken bir web sunucusu ve komut dosyanız olabilir. Bu betik kendi yaratımını yaratsa ve diğer ortam değişkenlerine dokunmasa bile, yeterlidir. Herhangi bir isimle ve hazırlanmış bir değerle tek bir ortam değişkeni, istismarın başarılı olması için yeterlidir .
  • Burada bahsetmediğim diğer yollar.

Bu değişkeni ayarladıktan sonra, bash bir dahaki sefer herhangi bir nedeni için açılır, saldırganın kodu çalıştırılır. Bu özellikle, sudo -s ile korkunçtur, çünkü süper kullanıcı (bilgisayar verileriniz ve programlarınız üzerinde dolu denetimi olan bir yönetimsel kullanıcı kuralı) olarak ortaya çıkar. Bash'ı standart kullanıcı olarak başlatsanız bile, kullanıcının dosyaları silinebilir.

Kendiniz dehşet kullanmasanız bile, birçok programın kendi operasyonlarının bir parçası olarak bash üreyeceğini unutmayın. Bu durumda bile savunmasızsınız. Ancak, Ubuntu'nun /bin/sh değeri bash değildir, bu nedenle yalnızca betik betikleme yapan ve varsayılan komut dosyası kabuklarını etkilemeyen programlar etkilenir.

Gönye'ye göre:

  

OpenSSH sshd'deki ForceCommand özelliği, Apache HTTP Sunucusundaki mod_cgi ve mod_cgid modülleri, belirtilmemiş DHCP istemcileri tarafından yürütülen komut dosyaları ve ortamın Bash uygulamasının ayrıcalık sınırı boyunca gerçekleştiği diğer durumlar içeren vektörler.

Ben savunmasız mıyım?

Kurulu paket sürümünüzü kontrol etmek için dpkg kullanın:

dpkg -s bash | grep Version

Bu, bash paketinizde bilgi arayacak ve çıkışı yalnızca size gösterecek şekilde filtreleyecektir. Sabit sürümler 4.3-7ubuntu1.4 , 4.2-2ubuntu2.5 ve 4.1-2ubuntu3.4 'dir.

Örneğin, şunu görüyorum:

wlan1-loopback% dpkg -s bash | grep Version
Version: 4.3-7ubuntu1.4

ve savunmasız olmadığımı belirleyebilir.

Nasıl güncellerim?

Standart güncelleme yöneticisi size bu güncellemeyi sunacaktır. Bu, hangi işletim sistemini kullandığınız veya ne kadar iyi bakıldığına bakılmaksızın, güvenlik güncellemelerinin önemli bir örneğidir.

USN Bülteni Ubuntu 14.04 Trusty Tahr, 12.04 Precise için yeni sürümlerin yayınlandığını belirtir. Pangolin ve 10.04 Lucid Lynx. Bu LTS sürümlerinden birinde değilseniz, ancak makul bir şekilde yeni sürüme sahipseniz, büyük olasılıkla yamalanmış bir paket bulabileceksiniz.

Önce şunu kontrol et

Eğer savunmasızsanız, en yeni paket listelerini almalısınız:

sudo apt-get update && sudo apt-get install bash

İlk komut, sabit sürümü içeren en yeni paket listesine sahip olduğunuzdan emin olur ve ikinci komut, bash'ın en yeni (sabit) sürümünü yükler.

Hata, yalnızca bash doğduğunda oynatılırken, mümkün olduğunda hemen yeniden başlatmanız iyi bir fikirdir.

    
verilen cevap hexafraction 24.09.2014 23:48
27

Bunu, Hacker News’de cft’den vazgeçin . Eğer benim gibi reposlarınızla (Odroid-XU) sorun yaşarsanız, bu, kaynaktan yama yapmak / kaynak yapmak istiyorsanız güzel bir şekilde çalışmalıdır.

TMPDIR=/tmp/bash-src
mkdir $TMPDIR
cd $TMPDIR
#download bash
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
#download all patches
for i in $(seq -f "%03g" 1 999); do 
  wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i
  if [[ $? -ne "0" ]]; then
    MAX=$(expr $i - 1)
    break;
  fi
done
tar zxf bash-4.3.tar.gz 
cd bash-4.3
#apply all patches
for i in $(seq -f "%03g" 1 $MAX);do
  echo apply patch bash43-$i
  patch -p0 < ../bash43-$i
done
#build and install
./configure && make
sudo make install
cd ../..
rm -r $TMPDIR

Çalıştırın:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

Ve eğer alırsanız:

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for 'x'
this is a test

O zaman hepiniz iyisiniz!

UYARI: make install, bash /usr/local/bin 'da yüklenecek, bu yüzden /bin/bash değiştirilmemiş ve curl çağrılabilir!

    
verilen cevap Bobby Saget 25.09.2014 04:30
9

Not: CVE-2014-7169 için Güvenlik Düzeltme Eki, standart bir güvenlik güncelleştirmesi olarak kullanıma sunulmuştur. Bu düzeltme ekini almak için ek ppa eklemeye gerek yoktur. Sadece aşağıdakilere ihtiyaç var.

sudo apt-get update

sudo apt-get upgrade

Başlığı doğru bir şekilde yatık olduğundan emin olmak için, aşağıdaki komutu çalıştırın

dpkg -s bash | grep Version

Eğer 14.04 LTS üzerindeyseniz, aşağıdakileri görmelisiniz:

Version: 4.3-7ubuntu1.4

Eğer 12.04 LTS üzerindeyseniz, çıktınız:

 Version: 4.2-2ubuntu2.5
    
verilen cevap branch.lizard 25.09.2014 20:30
1

Eğer 11.04'teyseniz: aşağıdaki adımları kullanın (benim için çalıştı)

cd ~/
mkdir bash
wget https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done

gerekli patche indirilmemişse ftp paketini kurun

apt-get install ftp
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz
cd bash-4.3
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done
./configure && make && make install
apt-get install build-essential
./configure && make && make install

Düzeltmenin uygulanıp uygulanmadığını görmek için:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
    
verilen cevap ldrrp 25.09.2014 19:13
0

Ben EOL (ve eski-releases.ubuntu.com kullanmak için /etc/apt/sources.list güncelledim) Natty 11.04 kullanıyorum, bu yüzden kaynak oluşturmak zorundayım. Bir .deb oluşturmak istedim, bu yüzden en azından paketin yönetimi "farkında" dir, bash sürümü varsayılan olanı değil. % 100 başarılı değilim - ancak, paket "daha yeni" olarak kaydedildi ve bash ikili değeri düzeldi, işte yaptığım şey buydu:

apt-get source bash
wget https://gist.githubusercontent.com/drj11/e85ca2d7503f28ebfde8/raw/31bd53ed2e47b220d3c728f5440758e0f76769de/gistfile1.c -O bash_CVE-2014-6271.patch
wget https://gist.githubusercontent.com/drj11/239e04c686f0886253fa/raw/046e697da6d4491c3b733b0207811c55ceb9d927/gistfile1.c -O bash_CVE-2014-6271_plus.patch
cd bash-4.2/

Şimdi, bash-4.2/ (alt) dizininde, bash-4.2.tar.xz kaynağına erişmek için paketin açılması gereken% co_de dosyası; ve bash adlı bir alt dizin.

Bağımlılıkları debian önlemek için aşağıdaki değişiklikleri yaptım: texlive :

Source: bash
...
Build-Depends: autoconf, autotools-dev, patch, bison, libncurses5-dev,
# texinfo, debhelper (>= 5), texi2html, locales, gettext, sharutils, time, xz-ut
ils
 debhelper (>= 5), locales, gettext, sharutils, time, xz-utils
# Build-Depends-Indep: texlive-latex-base, ghostscript
Build-Depends-Indep: ghostscript

... ve bash-4.2/debian/control :

binary-doc: bash-install #bash-doc-build
        dh_testdir
        dh_testroot
        mkdir -p $(d_doc)/usr/share/doc/$(p)
        dh_installdocs -p$(p_doc) 
ifeq ($(with_gfdl),yes)
        #cp -p build-bash/doc/bashref.pdf $(d_doc)/usr/share/doc/$(p)/.
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bashref.pdf /usr/share/doc/$(p_doc)/bashref.pdf
else
        rm -f $(d_doc)/usr/share/doc-base/bashref
endif
        rm -f $(d_doc)/usr/share/info/dir*
        #cp -p build-bash/doc/bash.html build-bash/doc/bash.pdf \
        #    $(d_doc)/usr/share/doc/$(p)/
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bash.html /usr/share/doc/$(p_doc)/bash.html \
        #    /usr/share/doc/$(p)/bash.pdf /usr/share/doc/$(p_doc)/bash.pdf
        dh_installchangelogs -p$(p_doc) bash/CWRU/changelog
        ...

Sürümü değiştirmek için bu bash-4.2/debian/rules dizininde şunu yapın:

bash-4.2$ dch --local patchCVE

... ve sorulduğunda notları notta doldurun. Bu, .deb (ve ilgili meta veri) 'nin (benim durumumda) bash-4.2/ olarak çağrılmasını sağlayacaktır.

Ardından, bash_4.2-0ubuntu3patchCVE1_i386.deb veya dpkg-buildpackage -us -uc komutuyla oluşturmayı deneyebilirsiniz. Not - bunlardan herhangi biri fermuarın kaynağını yeniden açar - böylece sahip olabileceğiniz herhangi bir yamayı geçersiz kılar! Yine de, kaynaklardan birinin paketten çıkarılmasını ve oluşturulmasını sağlamak için bunlardan birini çalıştırın (not debuild , texlive nedeniyle sonuçta hala başarısız olabilir, ancak paketi açıp kaynak oluşturmalıdır).

Ardından yamaları uygulayın; debuild özelliğini kullanmalısınız, çünkü şu anda -p1 dizinindesiniz:

bash-4.2$ patch -p1 < ../bash_CVE-2014-6271.patch 
bash-4.2$ patch -p1 < ../bash_CVE-2014-6271_plus.patch 

Ardından yama uygulamasını çalıştırarak yeniden oluşturun:

bash-4.2$ fakeroot debian/rules build 

Bu yürütülebilir dosyayı yeniden inşa eder; test etmek için:

bash-4.2$ env VAR='() { :;}; echo Bash is vulnerable!' ./build-bash/bash -c "echo Bash Test"

.deb dosyalarını oluşturmak için şunu çalıştırın:

bash-4.2$ fakeroot debian/rules binary

Bu, .deb dosyalarını ana dizine kaydeder; içeriğini listelemek için:

bash-4.2$ dpkg -c ../bash_4.2-0ubuntu3patchCVE1_i386.deb

.deb'yi yüklemek için:

bash-4.2$ sudo dpkg -i ../bash_4.2-0ubuntu3patchCVE1_i386.deb

Ancak, bazı nedenlerden dolayı, bu .deb bir tane (ikili) (ikili) içerir, bu yüzden ek olarak yapmak zorunda kaldım:

bash-4.2$ sudo cp bash-4.2/build-bash/bash /bin/

... ve bundan sonra, test benim için doğru şekilde geçmeye başladı:

$ env VAR='() { :;}; echo Bash is!' bash -c "echo Bash Test"
bash: warning: VAR: ignoring function definition attempt
bash: error importing function definition for 'VAR'
Bash Test
    
verilen cevap sdaau 28.09.2014 12:16

Etiketlerdeki diğer soruları oku