Shellshock Bug – Bash selbst kompilieren

shellshock_logo Hier ein Beitrag, wie man sein Bash-Binary selber neu erstellt, um es gegen den Shellshock Bug abzusichern. In meinem Beispiel habe ich das für SLES10SP2 gebaut zu einem frühen Zeitpunkt, als es von Suse noch keine passenden Updates zur Verfügung gestellt wurden. Jetzt ist das zum Glück anders aber vielleicht hat der eine oder andere ein altes System, zum es keine Updates in rpm- oder pkg-Format gibt. Der Ablauf sollte dann ähnlich sein. Eventuell muss die passende Bash-Version genutzt werden. Bis zur Version 2.05b gibt es Patches auf dem Ftp-Server.

Vorausetzung

  • wget
  • curl
  • tar
  • make
  • gcc compiler
  • passende Bash-Quelldateien inkl. Patches von GNU.org
  • sollte beim Kompilieren eine Fehlermeldung auf das Fehlen von yacc hinweisen, dann einfach das Paket bison nachinstallieren

Ablauf

(1) Check ob die Sicherheitslücke existent ist – mit Sicherheit 🙂

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

(2) Welche Version von Bash ist installiert? Hier die Version 3.1

# rpm -qa|grep bash
bash-3.1-24.26.20
# bash --version
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux)
Copyright (C) 2005 Free Software Foundation, Inc.

(3) Die Quelldateien für die Bash-Version 3.1 herunterladen und in einen Arbeitsordner entpacken

# mkdir /opt/bash-fix && cd /opt/bash-fix
# wget https://ftp.gnu.org/pub/gnu/bash/bash-3.1.tar.gz
# tar -xvzf bash-3.1.tar.gz
# cd bash-3.1/

(4) Patches herunterladen und in den Quellcode verbauen. Hier sollte man vorher kurz prüfen, wie viele Patch-Dateien vorrätig sind. Bei 3.1 sind es zum Zeitpunkt der Artikelerstellung 23, bei Version 3.2 sogar 57 Patchdateien. Das kann man mit curl und patch manuell für jede Datei einzeln machen….

testserver:/opt/bash-fix/bash-3.1 # curl http://ftp.gnu.org/pub/gnu/bash/bash-3.1-patches/bash31-001 |patch -p0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2708  100  2708    0     0  11824      0 --:--:-- --:--:-- --:--:-- 2644k
patching file parse.y
patching file patchlevel.h

…oder mit zwei kleinen for-schleifen. Irgendwie war ich nicht im Stande, die Sache mit der führenden Null richtig zu verbauen, daher zwei Schleifen 🙁

for j in {1..9}; do curl http://ftp.gnu.org/gnu/bash/bash-3.1-patches/bash31-00$j| patch -p0; done
for j in {10..23}; do curl http://ftp.gnu.org/gnu/bash/bash-3.1-patches/bash31-0$j| patch -p0; done

Continue Reading