Récemment, il y a eu des nouvelles concernant "CVE-2014-6271" (voir SN-2362-1 ), qui est 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é.
Bash est le shell interactif par défaut sous Ubuntu. Lorsque vous vous connectez au terminal (via l'émulateur de terminal, sur un tty ou sur ssh), vous tapez généralement des commandes que bash
lira et exécutera. Même si vous n'utilisez pas du tout le terminal, vous avez toujours Bash.
Sur Ubuntu, /bin/sh
n'est pas bash (c'est un tiret). Seule bash est affectée par cette vulnérabilité.
Bash et le système d’exploitation suivent un ensemble de variables d’environnement décrivant l’utilisateur actuellement connecté, où rechercher les 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:
ForceCommand
est un vecteur d'attaque. Les comptes dont Shell n'est pas bash ne sont pas affectés.Une fois qu'ils ont défini cette variable, la prochaine fois que bash
s'ouvre pour la raison any, le code de votre attaquant sera exécuté. Ceci est particulièrement inquiétant avec Sudo -s
, car il génère bash en tant que super-utilisateur (une règle d'utilisateur administratif qui contrôle tout le contrôle des données et des 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 apparaîtront d'eux-mêmes dans le cadre de leur fonctionnement. Même dans ce cas, vous êtes vulnérable. Cependant, le /bin/sh
d'Ubuntu n'étant pas bash, seuls les programmes qui appellent 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.
Utilisez dpkg pour vérifier la version de votre paquet installé:
dpkg -s bash | grep Version
Cela recherchera des informations sur votre paquet bash
et filtrera la sortie pour ne vous montrer que la version. Les versions corrigées sont 4.3-7ubuntu1.4
, 4.2-2ubuntu2.5
et 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.
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 SN 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 qui inclut 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 possible.
J'ai volé ça hors de plus 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 des correctifs/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!
AVERTISSEMENT: make install installera bash dans /usr/local/bin
, donc /bin/bash
n'est pas modifié et peut être appelé à partir de curl !!
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 êtes sur 12.04 LTS, votre sortie devrait être:
Version: 4.2-2ubuntu2.5
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é le correctif 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"
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 binaire bash
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 source bash
; et un sous-répertoire appelé debian
.
J'ai apporté les modifications suivantes pour éviter les dépendances sur texlive
: in 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 répertoire bash-4.2/
, procédez comme suit:
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 la commande dpkg-buildpackage -us -uc
ou debuild
. Remarque - l'un ou l'autre va décompresser le code source du fichier Zip - annulant ainsi les correctifs que vous avez pu avoir! Néanmoins, exécutez l’une de ces méthodes une fois pour que la source soit décompressée et générée (notez que debuild
peut toujours échouer à la fin en raison de texlive, mais il devrait décompresser et générer le source).
Ensuite, appliquez les patchs; notez que vous devriez utiliser -p1
ici, car vous vous trouvez actuellement dans le répertoire bash-4.2/
:
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