Bash Bug / Shellshock Bug

24.09.2014 tarihinde tüm Unix ve Linux tabanlı işletim sistemlerinde etkili olabilecek ‘ Bash Bug ’ ya da ‘ Shellshock Bug ’ isimli bir açık yayınlandı. CVE (Common Vulnerabilities and Exposures) standardı tarafından CVE-2014-6271 başlığı altında duyurulan bu açık, yayınlandığı andan itibaren başta Unix ve Linux tabanlı işletim sistemi geliştirici firma ve topluluklar ile bilgi güvenliği uzmanları olmak üzere, tüm teknoloji sevenlerin dikkatini çekti. İlk yorumlar Heartbleed Bug (bakınız: http://www.lostar.com/2014/04/heartbleed-bug-arastirma-raporu.html) kadar büyük bir açık olabileceği yönündeydi ancak şu an ki durum belki daha da tehlikeli bir açık ile karşı karşıya olabileceğimizi göstermekte.

Stephane Chazelas tarafından bulunan bu zafiyetin bu kadar tehlikeli görülmesinin nedeni, zafiyetin ihtiyaç duyduğu yazılımın yaygınlığı, zafiyetin sömürebilirliğinin kolay olması ve zafiyetin etkisinin çok yüksek olmasından kaynaklanmaktadır.

Bash Bug / Shellshock Bug, özel hazırlanmış değerlere sahip ortam değişkenlerini kullanarak, CentOS, Ubuntu, Redhat, Mac OS gibi tüm Unix-Linux tabanlı işletim sistemlerinin hemen hemen hepsinde standart olarak yüklü gelen Bash yazılımı üzerinde komut çalıştırılmasına neden olmaktadır. Bu yolla işletim sistemi ele geçirilebilmektedir. Bash (Bourne-Again Shell) yazılımının bu kadar yaygın olmasının nedeni, Unix-Linux tabanlı işletim sistemleri için bir kabuk ya da başka bir deyişle komut dili yorumlayıcısı olmasıdır; bu nedenle çoğu Unix-Linux dağıtımında standart olarak bulunmaktadır.

Bu zafiyetin aktif olarak ilk aşamada kullanılabileceği alanlar aşağıda listelenmiştir:

  • Apache sunucularında genellikle Bash aracılığı ile çalışan ‘mod_cgi’ ve ‘mod_cgid’ scriptleri.
  • Sistem konfigürasyonu için Shell scriptleri kullanan DHCP Client’lar.
  • Shell script ve ortam değişkenleri kullanabilecek çeşitli Deamon ve SUID (‘set user ID upon execution’ ya da ‘set group ID upon execution’) haklarına sahip uygulamalar.
  • Shell aracılıyla çalıştırılabilen ve diğer uygulamalarla Bash katmanı aracılığı ile etkileşen tüm uygulamalar.

Unix-Linux tabanlı işletim sistemlerinde bu zafiyeti test etmenin yolu aşağıdaki gibidir:

İşletim sisteminde komut satırı içerisinden

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

Yazıldığından ekrana aşağıdaki bir çıktı veriyorsa sistem belirtilen güvenlik zafiyetine sahip ve gerekli güncelleştirmeler yapılmamış demektir.

vulnerablethis is a test

Gerekli güncellemeler yapıldıktan sonra aynı satırların komut satırına yazılması halinde aşağıdaki gibi çıktı verilmektedir.

bash: warning: x: ignoring function definition attemptbash: error importing function definition for `x’this is a test

Bash Bug / Shellshock Bug’ının bulunduğu platform ve bu platformlara göre uygulanması gereken çözüm öneriler ve kaynak linklerinin 25.09.2014 tarihine göre güncel durumları aşağıdaki tabloda belirtilmiştir:

PlatformDüzeltildiği paketReferanslar
Red Hat Enterprise Linux 7bash-4.2.45-5.el7_0.2Red Hat Enterprise Linux
Red Hat Enterprise Linux 6bash-4.1.2-15.el6_5.1Red Hat Enterprise Linux
bash-4.1.2-15.el6_5.1.sjis.1Red Hat Enterprise Linux
bash-4.1.2-9.el6_2.1Red Hat Enterprise Linux 6.2 AUS
bash-4.1.2-15.el6_4.1Red Hat Enterprise Linux 6.4 EUS
Red Hat Enterprise Linux 5bash-3.2-33.el5.1Red Hat Enterprise Linux
bash-3.2-33.el5_11.1.sjis.1Red Hat Enterprise Linux
bash-3.2-24.el5_6.1Red Hat Enterprise Linux 5.6 LL
bash-3.2-32.el5_9.2Red Hat Enterprise Linux 5.9 EUS
Red Hat Enterprise Linux 4bash-3.0-27.el4.2Red Hat Enterprise Linux 4 ELS
Novell LE 11 SP2 DEBUGINFObash-debuginfo >= 3.2-147.14.20.1bash-debugsource >= 3.2-147.14.20.1Builds
SAT Patch Nr: 9736
Novell SUSE Linux Enterprise Server 11 SP2 LTSSbash >= 3.2-147.14.20.1bash-doc >= 3.2-147.14.20.1libreadline5 >= 5.2-147.14.20.1   readline-doc >= 5.2-147.14.20.1Builds
SAT Patch Nr: 9736
Novell SUSE Linux Enterprise Server 11 SP2 LTSSbash >= 3.2-147.14.20.1bash-doc >= 3.2-147.14.20.1libreadline5 >= 5.2-147.14.20.1   libreadline5-32bit >= 5.2-147.14.20.1 readline-doc >= 5.2-147.14.20.1Builds
SAT Patch Nr: 9736
Novell SLE 11 SP1 DEBUGINFObash-debuginfo >= 3.2-147.14.20.1bash-debugsource >= 3.2-147.14.20.1Builds
SAT Patch Nr: 9738
Novell SUSE Linux Enterprise Server 11 SP1 LTSSbash >= 3.2-147.14.20.1bash-doc >= 3.2-147.14.20.1libreadline5 >= 5.2-147.14.20.1   readline-doc >= 5.2-147.14.20.1Builds
SAT Patch Nr: 9738
Novell SUSE Linux Enterprise Server 11 SP1 LTSSbash >= 3.2-147.14.20.1bash-doc >= 3.2-147.14.20.1libreadline5 >= 5.2-147.14.20.1   libreadline5-32bit >= 5.2-147.14.20.1 readline-doc >= 5.2-147.14.20.1Builds
SAT Patch Nr: 9738
Novell SUSE Linux Enterprise Server 10 SP4 LTSS for x86bash >= 3.1-24.32.1readline >= 5.1-24.32.1readline-devel >= 5.1-24.32.1Builds
ZYPP Patch Nr: 8950
Novell SUSE Linux Enterprise Server 10 SP4 LTSS for AMD64 and Intel EM64T
Novell SUSE Linux Enterprise Server 10 SP4 LTSS for IBM zSeries 64bit
bash >= 3.1-24.32.1readline >= 5.1-24.32.1readline-32bit >= 5.1-24.32.1   readline-devel >= 5.1-24.32.1 readline-devel-32bit >= 5.1-24.32.1Builds
ZYPP Patch Nr: 8950
Novell SLE 11 SP3 DEBUGINFObash-debuginfo >= 3.2-147.20.1bash-debuginfo-x86 >= 3.2-147.20.1bash-debugsource >= 3.2-147.20.1Builds
SAT Patch Nr: 9740
Novell SLE 11 SP3 DEBUGINFObash-debuginfo >= 3.2-147.20.1bash-debugsource >= 3.2-147.20.1Builds
SAT Patch Nr: 9740
Novell SUSE Linux Enterprise Software Development Kit 11 SP3libreadline5 >= 5.2-147.20.1readline-devel >= 5.2-147.20.1Builds
SAT Patch Nr: 9740
Novell SUSE Linux Enterprise Software Development Kit 11 SP3readline-devel >= 5.2-147.20.1Builds
SAT Patch Nr: 9740
Novell SUSE Linux Enterprise Software Development Kit 11 SP3readline-devel >= 5.2-147.20.1readline-devel-32bit >= 5.2-147.20.1Builds
SAT Patch Nr: 9740
Novell SUSE Linux Enterprise Software Development Kit 11 SP3libreadline5 >= 5.2-147.20.1readline-devel >= 5.2-147.20.1readline-devel-32bit >= 5.2-147.20.1Builds
SAT Patch Nr: 9740
Novell SUSE Linux Enterprise Desktop 11 SP3
Novell SUSE Linux Enterprise Server 11 SP3
Novell SUSE Linux Enterprise Server 11 SP3 for VMware
bash >= 3.2-147.20.1bash-doc >= 3.2-147.20.1libreadline5 >= 5.2-147.20.1   readline-doc >= 5.2-147.20.1Builds
SAT Patch Nr: 9740
Novell SUSE Linux Enterprise Server 11 SP3bash >= 3.2-147.20.1bash-doc >= 3.2-147.20.1bash-x86 >= 3.2-147.20.1   libreadline5 >= 5.2-147.20.1 libreadline5-x86 >= 5.2-147.20.1 readline-doc >= 5.2-147.20.1Builds
SAT Patch Nr: 9740
Novell SUSE Linux Enterprise Desktop 11 SP3
Novell SUSE Linux Enterprise Server 11 SP3
Novell SUSE Linux Enterprise Server 11 SP3 for VMware
bash >= 3.2-147.20.1bash-doc >= 3.2-147.20.1libreadline5 >= 5.2-147.20.1   libreadline5-32bit >= 5.2-147.20.1 readline-doc >= 5.2-147.20.1Builds
SAT Patch Nr: 9740
Novell SUSE Linux Enterprise Server 11 SP1bash-debuginfo >= 3.2-147.14.20.1bash-debuginfo-32bit >= 3.2-147.14.20.1Builds
SAT Patch Nr: 9737
Novell SUSE Linux Enterprise Server 10 SP3 LTSS for x86bash >= 3.1-24.32.1readline >= 5.1-24.32.1readline-devel >= 5.1-24.32.1Builds
ZYPP Patch Nr: 8951
Novell SUSE Linux Enterprise Server 10 SP3 LTSS for AMD64 and Intel EM64T
Novell SUSE Linux Enterprise Server 10 SP3 LTSS for IBM zSeries 64bit
bash >= 3.1-24.32.1readline >= 5.1-24.32.1readline-32bit >= 5.1-24.32.1   readline-devel >= 5.1-24.32.1 readline-devel-32bit >= 5.1-24.32.1Builds
ZYPP Patch Nr: 8951
Debian squeezevulnerable 
Debian squeeze (lts)4.1-3+deb6u1 
Debian wheezyvulnerable 
Debian wheezy (security)4.2+dfsg-0.1+deb7u1 
Debian jessievulnerable 
Debian sid4.3-9.1 
Ubuntu 14.04 LTSbash 4.3-7ubuntu1.1Source Package
Ubuntu 12.04 LTSbash 4.2-2ubuntu2.2Source Package
Ubuntu 10.04 LTSbash 4.1-2ubuntu3.1Source Package

Update işlemlerinin çeşitli platformlarda nasıl yapılabileceği ve zafiyetten diğer korunma yöntemleri aşağıdaki gibidir:

  • Ubuntu:

Ubuntu Masaüstü versiyonları üzerinde güncelleştirme günlük olarak kullanıcıya bildirilse de “ALT+F2” tuş kombinasyonu ve sonrasında “update-manager” yazılarak “Update Manager” uygulaması açılabilir ve mevcut güncellemelerin yüklenmesi sağlanabilir.

Server’lar üzerinde ise, “pdate-notifier-common” paketi yüklü ise gerekli bildiri ve yönlendirmeler konsol üzerinden bildirilse de, konsoldan

sudo apt-get update

Yazıp güncelleştirme bilgisini alarak,

sudo apt-get dist-upgrade

Komutu ile gerekli yamaların yüklenmesi sağlanmalıdır.

Unutulmamalıdır ki güncelleştirme işlemi sırasında servisler yeniden başlatılabilir.

  • Debian:

Debian sistemleri üzerinde çoğunluğu için gerekli yamalar çıkmış bulunmaktadır. Mevcut sürüme göre yama durumu kontrol edilmeli, mevcut bir güncelleştirme var ise; konsoldan

sudo apt-get update && sudo apt-get upgrade

Komutu ile mevcut güncelleştirme listesini alarak tüm güncelleştirmelerin kurulumunu sağlayabilirsiniz.

Debian üzerinde sadece bir paketin güncellenmesi istenildiğinde aşağıdaki komut yapısı kullanılmalıdır.

sudo apt-get update && sudo apt-get install –only-upgrade bash

Yapılan güncelleştirmelerin etkili olabilmesi için ilişki servisler ya da işletim sistemi yeniden başlatılmalıdır.

  • RedHat:

RedHat’in mevcut zafiyet için yayınladığı güncelleştirmeler bulunmaktadır. Bu güncelleştirmeleri gerek grafik ara yüzünden, gerekse komut satırı üzerinden yapmak mümkündür.

Grafik ara yüzünden mevcut paketleri güncelleştirmek için “System -> Administration -> Software Update” adımları, daha önceki sürümler için “Applications -> System Tools -> Software Updater” adımları izlenmeli ve gerekli güncellemeler yüklenmelidir.

Red Hat Enterprise Linux 5 ve daha öncesi sürümler için komut satırından güncelleştirmeleri almak için;

yum update

Sadece bir pakete ait güncelleştirmeleri almak için;

yum update bash

Komutları kullanılmalıdır.

Red Hat Enterprise Linux 4 ve daha öncesi sürümler için komut satırından güncelleştirmeleri almak için;

up2date

Sadece bir pakete ait güncelleştirmeleri almak için;

up2date bash

Komutları kullanılmalıdır.

Güncelleştirmelerin hemen uygulanamayacağı durumda olan sistemler için RedHat’in yayınladığı bash_ld_preload.c isimli dosyanın indirilip derlendikten sonra eskisi ile değiştirilmesi gerekmektedir.

Gerekli işlemleri gerçekleştirmek için aşağıdaki adımlar izlenmelidir:

İndirilen dosya derlenmeli,

gcc bash_ld_preload.c -fPIC -shared -Wl,-soname,bash_ld_preload.so.1 -o bash_ld_preload.so

Derlenen dosya /lib klasörüne kopyalanmalıdır.

cp bash_ld_preload.so /lib/

Yapılan çalışmanın tüm sistemi etkileyecek şekilde uygulanması istendiğinde aşağıdaki satır /etc/ld.so.preload içerisine eklenmelidir.

/lib/bash_ld_preload.so

Derlenen dosyanın kopyalanmasının ardından ilişkili servisler yeniden başlatılmalı ya da sistem yeniden başlatılmalıdır.

Ayrıca aşağıda listelenmiş olan mod_security kuralları ile içerisinde Bash tarafından yorumlanan, fonksiyon gibi tanımlamalar bulunan HTTP isteklerini geri çevrilebilir. Bu sayede CGI gibi uygulamalara karşı yapılabilecek atakların bloklanması sağlanabilir.

İstek BaşlıklarıSecRule REQUEST_HEADERS “^\(\) {” “phase:1,deny,id:1000000,t:urlDecode,status:400,log,msg:’CVE-2014-6271 – Bash Attack'”
SERVER_PROTOCOL değerleriSecRule REQUEST_LINE “\(\) {” “phase:1,deny,id:1000001,status:400,log,msg:’CVE-2014-6271 – Bash Attack'”
GET/POST isimleriSecRule ARGS_NAMES “^\(\) {” “phase:2,deny,id:1000002,t:urlDecode,t:urlDecodeUni,status:400,log,msg:’CVE-2014-6271 – Bash Attack'”
GET/POST değerleriSecRule ARGS “^\(\) {” “phase:2,deny,id:1000003,t:urlDecode,t:urlDecodeUni,status:400,log,msg:’CVE-2014-6271 – Bash Attack'”
Yüklemelerdeki dosya isimleriSecRule  FILES_NAMES “^\(\) {”  “phase:2,deny,id:1000004,t:urlDecode,t:urlDecodeUni,status:400,log,msg:’CVE-2014-6271  – Bash Attack'”