371 votes

Comment recompiler Bash pour éviter Shellshock (l'exploit à distance CVE-2014-6271 et CVE-2014-7169) ?

Étant donné que Bash 3.2 (la version fournie par OS X) est vulnérable à l'attaque de la exploit d'exécution à distance connu sous le nom de "Shell Shock" ( CVE-2014-6271 y CVE-2014-7169 ) comment puis-je reconstruire Bash et sécuriser mon système avant un correctif officiel d'Apple ?

MISE À JOUR : Notez qu'Apple a maintenant publié le correctif officiel. Voir ci-dessous pour les détails.

5 votes

Apple a publié un correctif : support.apple.com/kb/DL1769

1 votes

Le correctif OS X bash Update 1.0 mentionné ci-dessus est spécifique à OS X 10.9.5 ou plus - Voici tous les correctifs : OS X 10.7.5 (Lion), OS X 10.8.5 (Mountain Lion), OS X 10.9.5 ( Mavericks ).

0 votes

Oui, j'avais ajouté les liens il y a 9 heures mais ils ont été supprimés par erreur. apple.stackexchange.com/revisions/146849/10

18voto

yoliho Points 340

Macports

Vous obtenez ainsi une version de bash 4.3.28(1) qui corrige les deux vulnérabilités (CVE-2014-6271 et CVE-2014-7169) ainsi que d'autres découvertes ultérieurement. Ceci est utile si vous avez changé de shells pour utiliser Macports bash afin d'obtenir les fonctionnalités de la version 4.

Cela ne résoudra pas le problème des scripts standard de l'OS, car les ont #!/bin/sh o #!/bin/bash comme première ligne. Ce genre de problème est la raison pour laquelle Macports essaie de ne pas utiliser les versions des programmes fournies par Apple, car Macports a tendance à être mis à jour plus rapidement (par exemple, il a une version plus récente de bash).

Vous pouvez faire en sorte que le terminal utilise ceci comme dans la réponse Homebrew

Pour installer macports, suivez les instructions suivantes ces instructions qui sont
1. Installez Xcode et les outils de ligne de commande Xcode
2. Acceptez la licence Xcode dans le Terminal : sudo xcodebuild -license
3. Téléchargez MacPorts pkg pour votre version d'OS X : les liens sont sur la page
4. Exécutez le programme pkg

Lorsque vous avez installé macports, vous avez besoin des dernières versions, ce qui est fait en exécutant

sudo port selfupdate

et recompiler ou obtenir les derniers binaires par

sudo port upgrade outdated

5 votes

Puisqu'il s'agit de corriger une faille de sécurité dans des binaires existants, et que cela ne remplace pas/corrige les binaires vulnérables, je ne vois pas comment cela résout le problème.

0 votes

Il renvoie la version macports - et était vraiment en réponse au commentaire de IanC.

0 votes

Oui. Nous devrions lister les correctifs pour tous les endroits bash vient généralement de OS X -- donc le correctif système, le correctif Homebrew et le correctif MacPorts. Eventuellement Fink aussi. Je préfèrerais personnellement que cela soit fait comme une modification de la réponse de @AlBlue. Ainsi, il s'agit d'une seule et même réponse, la plus correcte possible.

16voto

Trane Francks Points 2305

NOTE concernant la mise à jour officielle de Apple OS X bash 1.0 : Cette mise à jour logicielle porte uniquement la version officielle de Apple bash à 3.2.53. La révision du patch 3.2.54 offre le changement suivant :

Ce correctif change l'encodage utilisé par bash pour les fonctions exportées en fonctions exportées pour éviter les conflits avec les variables de l'interpréteur de variable d'environnement pour déterminer s'il faut ou non l'interpréter comme l'interpréter comme une fonction shell.

Pour les utilisateurs qui ont déjà corrigé le système avec les binaires 3.2.54, vous pouvez soit remplacer vos binaires compilés par le patch d'Apple, soit laisser les choses en l'état, mais c'est déconseillé. Bien qu'Apple ait laissé la version de ses binaires à 3.2.53, le patch d'Apple contient le correctif pour le test d'exploitation ci-dessous :

env X='() { (a)=>\' sh -c "echo date"; cat echo

Cela signifie que le binaire officiel 3.2.53 d'Apple contient une sécurité équivalente à celle du binaire vanille GNU 3.2.54. Un point de confusion regrettable, mais c'est ce que c'est. Le correctif d'Apple n'est pas à moitié conçu. Il semble qu'il s'agisse d'une correction complète du problème. En tant que tel, la feuille de route ci-dessous pour compiler vanilla bash y sh à partir des sources GNU devrait être considéré comme un artefact historique et éventuellement consulté comme un modèle pour la façon de faire des correctifs à l'avenir si cela s'avère nécessaire.

NOTE : Avec la source GNU vanille, sh a des problèmes d'élévation de privilèges qui provoquent des échecs dans divers installateurs, par exemple Adobe Flash. Je recommande fortement de s'en tenir aux binaires corrigés par Apple. Considérez que ce système de correctif est déprécié et peu judicieux.

Il existe un nouveau correctif GNU bash 3.2.55 qui décrit la correction suivante :

Description du bogue :

Il y a deux débordements de tampon locaux dans parse.y qui peuvent amener l'interpréteur de commandes l'interpréteur de commande à vider le noyau lorsqu'il reçoit de nombreux documents ici attachés à une seule commande ou à de nombreuses boucles imbriquées. ou de nombreuses boucles imbriquées.

Nous laissons au lecteur le soin de déterminer s'il doit se contenter des binaires officiels corrigés par Apple ou créer les siens pour faire face aux nouveaux exploits possibles. Personnellement, Je vais m'en tenir aux binaires d'Apple.


Ce post détaille la façon de compiler et d'installer une version de vanilla bash y sh sur OS X. J'ai choisi cette voie car suivre les exemples détaillant l'utilisation des sources spécifiques à Apple ne m'a pas permis d'obtenir la révision correcte du patch. YMMV. Cette installation vanille est, cependant, destinée à remplacer les binaires OS X de telle sorte que lorsque Apple publiera finalement une mise à jour de sécurité, ces remplacements vanille seront usurpés par leurs équivalents Apple appropriés.

Ma configuration de base est la suivante :

OS X Lion 10.7.5 et Xcode 4.6.3 avec tous les utilitaires de ligne de commande installés.

Les mesures que j'ai prises pour résoudre ce problème étaient les suivantes :

Téléchargez le code source de la base bash pour 3.2.48 depuis :

https://ftp.gnu.org/gnu/bash/bash-3.2.48.tar.gz

Téléchargez les correctifs bash3.2.49, .50, .51, .52, .53, .54 et .55 à partir de :

https://ftp.gnu.org/gnu/bash/bash-3.2-patches/

Je les ai sauvegardés sous le nom de $filename.patch, par exemple, bash3.2.50.patch.

dans votre répertoire de téléchargement et

Décompresser la branche source principale :

tar xzvf bash-3.2.48.tar.gz

cd bash-3.2.48

En supposant que vous avez renommé vos fichiers patch téléchargés comme décrit précédemment,

cp ../*.patch .

Alors

for file in *.patch ; do
  patch -p0 < $file
done

Cela devrait montrer les correctifs réussis de divers fichiers. Si ce n'est pas le cas, préparez-vous à faire un peu d'exploration et de recherche.

Suivant :

sudo cp /bin/bash /bin/bash_old
sudo cp /bin/sh /bin/sh_old
sudo chmod -x /bin/bash_old
sudo chmod -x /bin/sh_old

Cela revient à sauvegarder vos anciens shells bash et sh vulnérables et à supprimer leur privilège d'exécution. Cela vous donne la possibilité de restaurer les commandes si nécessaire, mais supprime leur capacité à faire des dégâts entre-temps.

Suivant :

./configure --prefix=/ ; make ; sudo make install

Ceci devrait correctement configurer, compiler et installer le nouveau binaire bash dans /bin. Une fois que c'est fait, quittez le Terminal et ouvrez-le à nouveau.

Vous devriez, toutes choses heureuses et souriantes, être capable de bash --version et voir maintenant 3.2.55, par exemple :

Gaia:Downloads trane$ bash --version
GNU bash, version 3.2.55(1)-release (i386-apple-darwin11.4.2)
Copyright (C) 2007 Free Software Foundation, Inc.

Le résultat exact de la commande ci-dessus sera différent selon votre version d'OS X.

Vous devriez également être capable de tester votre vulnérabilité contre bash et constater que tout va bien.

REMARQUE : Nous n'avons corrigé que bash jusqu'à présent, mais le fichier /bin/sh L'exécutable est toujours dans son état vulnérable. En copiant simplement bash au sommet de sh est un style Linux de faire les choses. Celui d'OS X sh présente quelques différences par rapport à l'implémentation bash Cependant, vous devrez à nouveau faire appel au compilateur. De plus amples informations sur la façon dont bash y sh différent dans OS X peut être trouvé ici :

https://apple.stackexchange.com/a/89327/91441

Dans votre répertoire de téléchargement, faites :

make clean

Dans votre éditeur préféré, ouvrez le fichier Makefile.in et faites défiler jusqu'à la ligne 99. Nous allons changer la ligne du programme pour que le binaire que nous sortons soit sh au lieu de bash comme ça :

Program = sh$(EXEEXT)

Sauvegardez-le et ensuite

./configure --prefix=/ --enable-xpg-echo-default --enable-strict-posix-default
make ; sudo make install

Maintenant, vous aurez construit sh presque exactement comme Apple le ferait.

Une dernière remarque : sur certains (tous ?) systèmes, Apple semble généralement placer l'adresse de l'utilisateur dans le dossier de l'utilisateur. bashbug exécutable dans /usr/bin . Notre compilation l'aura mis dans /bin . Donc, les dernières étapes ici :

sudo mv /usr/bin/bashbug /usr/bin/bashbug_old
sudo chmod -x /usr/bin/bashbug_old
sudo mv /bin/bashbug /usr/bin/bashbug

0 votes

Les réponses doivent être autonomes ; les liens sont acceptés mais vous devez également résumer le contenu.

1 votes

Je ne veux pas me plaindre, mais lorsque la question est "comment puis-je recompiler bash" et que ma réponse est "cliquez sur le lien suivant pour obtenir la réponse à cette question", il semble que les exigences du résumé restent inchangées.

0 votes

Pour information, sous 10.6.8 avec Xcode 3.2.6, la configuration s'achève sans qu'aucun logiciel manquant ne soit signalé, mais la compilation génère des avertissements dans l'un des fichiers corrigés (variables.c) et échoue ensuite avec une tonne d'erreurs de liaison impliquant des problèmes de sécurité. _rl_ des symboles.

15voto

Giacomo1968 Points 5021

Pour tous ceux qui ont des difficultés à compiler à partir des sources, Apple a officiellement publié, le 29 septembre, des correctifs pour Mac OS X 10.9.5, 10.8.5 et 10.7.5 :

1 votes

Merci ! Cela peut être plus facile que de recompiler pour beaucoup / la plupart.

0 votes

@AlBlue D'accord. De plus, bien qu'il ne soit pas complètement propre dans son Parcheando-comme certains l'ont souligné-c'est bien mieux que rien. Et bien plus sûr qu'un novice qui compile le code source dans la panique.

2 votes

Comme d'habitude, le délai de propagation des mises à jour logicielles est effectif. Je me demande combien de temps les paquets vont mettre à apparaître. C'est rafraîchissant de voir qu'Apple a répondu assez rapidement à ce problème !

5voto

CousinCocaine Points 9430

OS X 10.6.8 - Snow Leopard

Le poste de @AlBlue est très complet. Cependant, sur mon serveur OS X 10.6.8, sa solution ne fonctionne pas. Apple n'a pas de solution pour 10.6.8 et les étapes expliquées par @AlBlue ne fonctionnent pas avec Xcode 3.2.6 (qui est la dernière version pour Snow Leopard). Je reçois une erreur :

** BUILD FAILED **

The following build commands failed:
sh:
    CodeSign /Users/bas/bash-fix/bash-92/build/Release/sh
bash:
    CodeSign /Users/bas/bash-fix/bash-92/build/Release/bash
(2 failures)

Pour cette raison, j'utilise brew.sh . Merci de nous faire part de vos réflexions si vous avez une meilleure solution pour OS X 10.6.8 Snow Leopard. Voir aussi le commentaire de @Jerome, il a réussi à appliquer un patch sur OS X 10.6.8 Snow Leopard en utilisant la solution de @AlBlue. En tout cas :

Installez d'abord brew avec l'oneliner suivant :

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Mise à jour brew

brew update

Maintenant, il suffit d'installer la dernière version de bash et remplacer l'actuel :

brew install bash
sudo sh -c 'echo "/usr/local/bin/bash" >> /etc/shells'
chsh -s /usr/local/bin/bash
sudo mv /bin/bash /bin/bash-backup
sudo ln -s /usr/local/bin/bash /bin/bash

Vous pouvez définir le shell de connexion par défaut ' Command (complete path) pour l'application Terminal.app dans ses préférences ( Command, ) enter image description here


note : Dans les commentaires, certains utilisateurs pensent que cette méthode n'est pas appropriée. Mais pour moi, c'est la seule méthode compréhensible pour mettre à jour BASH sur OS X 10.6.8 Snow Leopard.

0 votes

Cependant, cela ne changera pas la version de bash qui est utilisée lorsque vous démarrez le terminal ou démarrée par tout autre script . Les script ont tendance à avoir #!/bin/sh ou bash en haut, donc ignorez PATH.

1 votes

Aussi certains scripts reposent sur bash 3 et ne fonctionnent pas avec bash 4 (macports a corrigé bash 4.3.25 que je suppose que home-brew a mis à jour vers

0 votes

Le PO n'a pas demandé de version spécifique 3 ou 4. C'est juste une autre façon de le faire.

5voto

Christopher Allen Points 355

Tout d'abord, Parcheando bash et sh pour cette vulnérabilité est susceptible de casser certains Parcheando sur votre Mac. Vous n'avez vraiment pas besoin de faire cela, sauf si vous offrez des services web à l'internet public directement depuis votre Mac. Donc si ce n'est vraiment pas nécessaire, attendez qu'il y ait une mise à jour de sécurité officielle d'Apple.

Étant prévenu, voici quelques instructions sur la façon d'effectuer cette mise à jour en utilisant Brew sur Mavericks 10.9.

Tout d'abord, confirmez que vous utilisez un bash obsolète :

$ which bash
/bin/bash
$ /bin/bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

La version la plus courante de bash est 4.3.25

Si Xcode n'est pas installé sur votre ordinateur, vous aurez besoin des outils de ligne de commande Xcode, qui peuvent être installés de la manière suivante

$ xcode-select --install

Ou de la portail des développeurs .

Pour installer Brew ( http://brew.sh ) :

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Alors, faites-le :

$ brew doctor

Suivez les instructions en cas de problème. Nombreux problèmes courants sont abordés ici .

Ensuite, mettez à jour brew avec la dernière liste de paquets :

$ brew update

Pour obtenir la dernière version de bash 4.3.25 :

$ brew install bash

Cela installe bash dans /usr/local/Cellar/bash/4.3.25/bin/bash

L'ancien bash y sh existe toujours à /bin Après l'installation, vous devrez donc renommer les anciens exécutables dans un nouveau fichier.

$ sudo mv /bin/bash /bin/bash_old
$ sudo mv /bin/sh /bin/sh_old

Si vous êtes très paranoïaque, vous pouvez supprimer les droits d'exécution sur le fichier bash_old

$ sudo chmod a-x /bin/bash_old /bin/sh_old

Ensuite, créez un lien symbolique vers le nouveau bash 4.3.25 que brew a installé.

$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/bash
$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/sh

Redémarrez et c'est terminé.

Un avertissement - cela peut casser certains scripts existants qui pourraient dépendre de bash 3.2 ou des différences que le Mac sh a sur le linux sh . Il existe une réponse beaucoup plus sophistiquée pour remplacer bash et sh à partir des sources, à partir d'une réponse de @TraneFranks dans ce même fil.

4 votes

Parcheando de la 3.2.51 à la 3.2.52 va causer beaucoup moins de dégâts que la mise à jour vers la 4.3.n'importe quoi.

0 votes

Je préviens que cela peut casser certains scripts, mais 4.3.25 est ce que Brew installe comme courant - j'essaie d'offrir une version qui est plus facile à installer que de le faire à partir de zéro. Et vous pouvez toujours restaurer en renommant les anciens exécutables.

2 votes

Ce bogue est exploitable par un serveur DHCP malveillant (par exemple, un hotspot WiFi) et peut complètement détruire votre ordinateur, il vaut donc la peine de le corriger dès que possible. D'autres réponses ont de meilleures instructions pour le remplacement /bin/bash y /bin/sh qui causera probablement moins de problèmes que la mise à jour vers le dernier bash de Brew.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X