Qu'est-ce que la vulnérabilité CVE-2014-6271 bash (Shellshock) et comment la réparer?

141

Récemment, il y a eu des nouvelles concernant "CVE-2014-6271" (voir USN-2362-1 ), une vulnérabilité de Bash. Comment savoir si cela me concerne, comment puis-je régler le problème et pourquoi devrais-je m'en soucier?

Ceci est conçu comme une réponse canonique à cette vulnérabilité, en raison de sa portée et de sa gravité.

ζ--
la source
18
"Comment je le répare?" -> lancez simplement votre gestionnaire de mise à jour! Vraiment, Ubuntu publie des mises à jour de sécurité, il existe une équipe de sécurité dédiée. S'il vous plaît ne pas poster de réponses sur la construction de Bash à partir de la source! ; il est inutilement compliqué et difficile de maintenir votre système à l'avenir.
gertvdijk
5
De plus, le CVE supplémentaire pour le correctif incomplet. CVE-2014-7169
gertvdijk
18
S'il vous plaît , postez des réponses sur la construction à partir de la source. Qu'ils le fassent ou non, certaines personnes ont d'anciens serveurs Ubuntu et la construction à partir des sources peut être leur seule option.
GaryO
3
oups, désolé je viens de réaliser que je mets bash au lieu de dash dans le test. Qu'à cela ne tienne, c'est bien.
Matt H
4
Lire: oss-sec: Re: CVE-2014-6271: exécution de code à distance via bash . Le bug Bash n'a toujours pas été corrigé
blade19899

Réponses:

126

Qu'est ce que Bash?

Bash est le shell interactif par défaut d'Ubuntu. Lorsque vous vous connectez au terminal (via l'émulateur de terminal, sur un terminal ou sur ssh), vous tapez généralement des commandes qui bashliront et s'exécuteront. Même si vous n'utilisez pas du tout le terminal, vous avez toujours Bash.

Sur Ubuntu, ce /bin/shn'est pas bash (c'est tiret). Seule bash est affectée par cette vulnérabilité.

Comment l'exploit m'affecte-t-il?

Bash et le système d'exploitation suivent un ensemble de variables d'environnement qui décrivent l'utilisateur actuellement connecté, où rechercher des programmes sur le disque dur et d'autres fonctions similaires. En fabriquant une variable d’environnement avec une structure spécifique, un attaquant pourrait éventuellement exécuter du code au prochain démarrage de Bash.

L'attaquant peut définir cette variable d'environnement de plusieurs manières:

  • Connectez-vous à distance à un service tel que SSH avec une configuration spécifique telle que git over ssh. Comme Mitre le signale, l’utilisation de l’ ForceCommandoption sshd est un vecteur d’attaque. Les comptes dont le shell n'est pas bash ne sont pas affectés.
  • Vous incitant à définir la variable d'environnement.
  • Causer un autre programme pour définir une variable d'environnement pour avoir cette valeur spécialement construite. Par exemple, vous pouvez avoir un serveur Web et un script qui doivent définir une variable d'environnement avec un contenu utilisateur spécifique. Même si ce script crée le sien et ne touche pas d’autres variables d’environnement, cela suffit. Une seule variable d'environnement avec n'importe quel nom et une valeur spécialement construite suffit à l'exploit pour réussir .
  • Autres moyens que je n'ai pas mentionnés ici.

Une fois qu'ils ont défini cette variable, la prochaine fois que vous l' bashouvrez pour une raison quelconque , le code de votre attaquant sera exécuté. Cela est particulièrement inquiétant sudo -s, car il se produit en tant que super-utilisateur (une règle d'utilisateur administratif qui contrôle totalement les données et les programmes de votre ordinateur). Même si vous ne démarrez que bash en tant qu'utilisateur standard, les fichiers de cet utilisateur peuvent être supprimés.

Il est important de noter que même si vous n'utilisez pas bash vous-même, de nombreux programmes le feront tous seuls dans le cadre de leur fonctionnement. Même dans ce cas, vous êtes vulnérable. Cependant, Ubuntu /bin/shn’appartenant pas à bash, seuls les programmes appelant explicitement bash et non le shell de script par défaut sont concernés.

Selon Mitre:

vecteurs impliquant la fonctionnalité ForceCommand dans OpenSSH sshd, les modules mod_cgi et mod_cgid dans le serveur HTTP Apache, des scripts exécutés par des clients DHCP non spécifiés et d'autres situations dans lesquelles la définition de l'environnement se produit au-delà d'une limite de privilèges à partir de l'exécution Bash.

Suis-je vulnérable?

Utilisez dpkg pour vérifier la version de votre paquet installé:

dpkg -s bash | grep Version

Cela recherchera des informations sur votre bashpaquet et filtrera la sortie pour ne vous montrer que la version. Les versions fixes sont 4.3-7ubuntu1.4, 4.2-2ubuntu2.5et 4.1-2ubuntu3.4.

Par exemple, je vois:

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

et peut déterminer que je ne suis pas vulnérable.

Comment puis-je mettre à jour?

Le gestionnaire de mise à jour standard vous proposera cette mise à jour. Ceci est un excellent exemple de l'importance des mises à jour de sécurité, quel que soit le système d'exploitation utilisé ou la qualité de la maintenance.

Le USN Bulletin indique que de nouvelles versions ont été publiées pour Ubuntu 14.04 Trusty Tahr, 12.04 Precise Pangolin et 10.04 Lucid Lynx. Si vous ne possédez pas l'une de ces versions LTS, mais une version relativement récente, vous serez probablement en mesure de trouver un package corrigé.

Tout d'abord, vérifiez si vous

Si vous êtes vulnérable, vous devez d’abord récupérer les dernières listes de paquets:

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

La première commande vérifie que vous disposez de la liste de packages la plus récente comprenant la version corrigée, et la seconde commande installe la version la plus récente (corrigée) de bash.

Bien que le bogue ne semble entrer en jeu que lorsque bash est créé, il est toujours judicieux de redémarrer immédiatement si cela est réalisable.

ζ--
la source
20
Désolé, vous êtes vulnérable . Le correctif d'origine ne résout pas tout le problème. Voir cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169 AFAIAA, il n'y a actuellement aucun correctif disponible publiquement. Voir, par exemple, people.canonical.com/~ubuntu-security/cve/pkg/bash.html
Mormegil
4
@ hexafraction Où lisez-vous que 12.10 reçoit une mise à jour pour cela? Je ne pense pas, 12.10, 13.04, 13.10 sont vraiment en fin de vie ! De plus, les référentiels de backport ne sont pas utilisés pour les mises à jour de sécurité .
gertvdijk
2
@ hexafraction Non, ils ne le font pas! C’est l’intérêt d’être en fin de vie: plus aucun soutien.
gertvdijk
1
@ MichaelHärtl Si vous utilisez Ubuntu 12.10, vous pouvez télécharger la version 12.04 de bash depuis packages.ubuntu.com/precise/bash et l'installer manuellement.
David
2
Le correctif pour CVE-2014-7169 est disponible dans le gestionnaire de mise à jour (pour moi).
Calmarius
27

J'ai volé ça chez Hacker News . Si vous avez des problèmes avec votre mise en pension comme moi (Odroid-XU), cela devrait fonctionner si vous souhaitez appliquer un correctif / construire à partir des sources.

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

Puis lancez:

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

Et si vous obtenez:

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

Alors vous êtes tous bons!


ATTENTION: make install va installer bash /usr/local/bin, il /bin/bashn'est donc pas modifié et peut être appelé à partir de curl !!

Bobby Saget
la source
1
Voici comment compiler Bash 3.2 avec le correctif sur Debian Lenny: gist.github.com/mattwhite/86de50d30134129e44ef
Matt White
13
-1. Pas besoin de construire à partir des sources. Ubuntu a un correctif de sécurité dans les référentiels. Si vous avez des "problèmes avec votre rapport", corrigez-le à la place. Vous serez probablement vulnérable de nombreuses façons si vous ne recevez pas de mises à jour de sécurité!
gertvdijk
1
@ Matt White Merci! Tu m'as juste sauvé quelques heures :)
Florian Fida
5
@ FlorianFida C'est AskUbuntu! Tout le monde sur ce site est censé poster des réponses concernant l'utilisation d'Ubuntu.
gertvdijk
6
@ MichaelHärtl 12.10 est en fin de vie. Il ne reçoit plus aucune mise à jour de sécurité depuis déjà longtemps. Améliorer!!!
gertvdijk
9

Remarque: le correctif de sécurité pour CVE-2014-7169 a été publié en tant que mise à jour de sécurité standard. Il n’est pas nécessaire d’ajouter d’autres PPA pour recevoir ce correctif. Seul le suivant est nécessaire.

sudo apt-get update

sudo apt-get upgrade

Pour vous assurer que bash est corrigé correctement, exécutez la commande suivante

dpkg -s bash | grep Version

Si vous êtes sur 14.04 LTS, vous devriez voir un résultat de:

Version: 4.3-7ubuntu1.4

Si vous utilisez la version 12.04 LTS, votre sortie devrait être:

 Version: 4.2-2ubuntu2.5
branch.lizard
la source
1
C'était correct, mais un correctif officiel a été mis à disposition et la mise à jour de sécurité a été publiée. Par conséquent, ces étapes ne sont plus nécessaires.
Robie Basak
C'est correct. Je vais éditer le post ci-dessus. Je vous remercie.
branch.lizard
1

Si vous êtes sur 11.04: utilisez les étapes ci-dessous (cela a fonctionné pour moi)

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

si ce n'est pas téléchargé patch requis, installez le paquet ftp

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

Pour voir si le correctif a été appliqué:

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

J'utilise Natty 11.04, qui est EOL (et j'ai mis à jour /etc/apt/sources.list pour utiliser old-releases.ubuntu.com), je dois donc compiler à partir des sources. Je voulais construire un fichier .deb, donc au moins le paquet géré est "conscient" que la version bash n'est pas celle par défaut. Je ne réussis pas à 100% - cependant, le paquet est enregistré comme "plus récent" et le bashbinaire finit par être corrigé. Voici ce que j'ai fait:

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/

Maintenant, dans le (sous) répertoire bash-4.2/, il y a: un fichier bash-4.2.tar.xz, qui doit être décompressé pour accéder à la bashsource; et un sous-répertoire appelé debian.

J'ai apporté les modifications suivantes pour éviter les dépendances sur texlive: dans bash-4.2/debian/control:

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

... et dans bash-4.2/debian/rules:

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

Pour changer de version, dans ce bash-4.2/répertoire, faites:

bash-4.2$ dch --local patchCVE

... et remplissez les notes dans le journal des modifications lorsque cela vous est demandé. Cela garantira que le .deb (et les métadonnées associées) est appelé (dans mon cas) bash_4.2-0ubuntu3patchCVE1_i386.deb.

Ensuite, vous pouvez essayer de construire avec dpkg-buildpackage -us -ucou debuildcommande. Remarque - l'un ou l'autre va décompresser le code source à partir du zip - annulant ainsi les patchs que vous avez pu avoir! Néanmoins, exécutez l’une de celles-ci une fois pour que le source soit décompressé et construit (la note debuildpeut toujours échouer à la fin en raison de texlive, mais elle devrait décompresser et générer le source).

Ensuite, appliquez les patchs; notez que vous devriez utiliser -p1ici, car vous êtes actuellement dans le bash-4.2/répertoire:

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

Reconstruisez ensuite la version corrigée en lançant:

bash-4.2$ fakeroot debian/rules build 

Cela reconstruirait l'exécutable; pour le tester:

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

Pour construire les fichiers .deb, exécutez:

bash-4.2$ fakeroot debian/rules binary

Cela enregistrera les fichiers .deb dans le répertoire parent. pour lister leur contenu:

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

Pour installer le .deb:

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

Cependant, pour quelque raison que ce soit, ce .deb contient un binaire non corrigé (?!), Je devais donc aussi:

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

... et après cela, le test a commencé à passer correctement pour moi:

$ 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
Sdaau
la source
Question: La question initiale indique 1 vecteur d'attaque possible comme "scripts exécutés par des clients DHCP non spécifiés". Qu'est-ce que ça veut dire? Est-ce que cela signifie que le / sbin / dhclient <- d'Ubuntu est vulnérable?
Bran
Je pense que les clients non spécifiés signifient peut-être que Ubuntu a un / sbin / dhclient infecté, qui exécute ensuite des commandes menant au script bash qui lance shellshock. Est-ce ce que les clients DHCP sont vulnérables à shellshock? (J'espère que cela a du sens, voir mon message du 10 octobre ci-dessus)
Bran