Mon bash est-il vulnérable?
Cette commande simple est un test suffisant pour voir si votre version de bash est vulnérable:
x = '() {:; }; echo VULNERABLE 'bash -c:
Il n'est pas nécessaire d'imprimer du texte supplémentaire pour signifier que la commande a effectivement été exécutée, car les versions corrigées de bash rapporteront un avertissement lorsqu'une variable à son démarrage l'environnement contient du code d'exploitation pour la vulnérabilité corrigée.
Sur un système vulnérable:
$ x = '() {:;}; echo VULNERABLE 'bash -c: VULNERABLE
Sur un système patché:
$ x =' () {:;}; echo VULNERABLE 'bash -c: bash: warning: x: ignorant la définition de la fonction trybash: erreur lors de l'importation de la définition de la fonction pour `x'
Pour une explication détaillée de ce que cela fait et fait pas de test, et pourquoi, voir "Autres bogues d'analyse de fonction" ci-dessous.
Mon système est-il vulnérable?
Si votre bash n'est pas vulnérable, votre système n'est pas n'est pas vulnérable.
Si votre bash est vulnérable, alors votre système est vulnérable dans la mesure où il utilise des vecteurs d'attaque bash along tels que des scripts CGI, des clients DHCP et des comptes SSH restreints. Vérifiez si / bin / sh
est bash ou un autre shell. La vulnérabilité est dans une fonctionnalité spécifique à bash et les autres shells tels que dash et ksh ne sont pas affectés. Vous pouvez tester le shell par défaut en exécutant le même test que ci-dessus avec sh
au lieu de bash
:
x = '() {: ;}; echo VULNERABLE 'sh -c:
- Si vous voyez un message d'erreur, cela signifie que votre système a un patch corrigé et n'est pas vulnérable.
- Si vous voir
VULNERABLE
, alors le shell par défaut de votre système est bash et tous les vecteurs d'attaque sont un problème. - Si vous ne voyez aucune sortie, alors le shell par défaut de votre système n'est pas bash, et seulement des parties de votre système qui utilisent bash sont vulnérables. Recherchez:
- Scripts exécutés par bash (commençant par
#! / Bin / bash
, et non par #! / Bin / sh
) depuis CGI ou par un Client DHCP.
- Comptes SSH restreints dont le shell est bash.
Fonctionnement de ce test
Il exécute la commande bash -c:
avec le texte littéral () {:;}; echo VULNERABLE
défini comme la valeur de la variable d'environnement x
.
-
L'intégré :
fonctionne aucune action; il est utilisé ici lorsqu'une commande non vide est requise.
-
bash -c:
crée une instance de bash qui exécute :
et quitte.
Même cela est suffisant pour permettre le déclenchement de la vulnérabilité. Même si bash est appelé pour exécuter une seule commande (et que cette commande est un no-op), il lit toujours son environnement et interprète chaque variable dont le contenu commence par () {
comme une fonction (à moins ceux dont les noms sont des noms de fonction valides) et l'exécute pour que la fonction soit définie.
L'intention derrière ce comportement de bash est d'exécuter uniquement une définition de fonction, ce qui rend une fonction disponible pour une utilisation mais ne le fait pas ne pas exécuter le code à l'intérieur.
-
() {:;}
est la définition d'une fonction qui n'effectue aucune action lorsqu'elle est appelée. Un espace est requis après {
pour que {
soit analysé comme un jeton distinct. Un ;
ou newline est requis avant }
pour qu'il soit accepté comme syntaxe correcte.
Voir 3.3 Fonctions Shell dans le Manuel de référence Bash pour plus d'informations sur la syntaxe de définition des fonctions shell dans bash. Mais notez que la syntaxe utilisée (et reconnue) par bash comme une fonction shell exportée valide dont il doit exécuter la définition est plus restrictive:
- Elle doit commencer par la chaîne exacte
() {
, avec exactement un espace entre )
et {
.
- Et si les fonctions shell ont parfois leur instruction composée entre
()
au lieu de {}
, elles sont toujours exportées dans la syntaxe {}
. Les variables dont le contenu commence par () (
au lieu de () {
ne testeront ni ne déclenchent la vulnérabilité.
-
bash devrait arrêter d'exécuter le code après la fermeture }
. Mais (à moins d'être corrigé) ce n'est pas le cas! C'est le mauvais comportement qui constitue la CVE -2014-6271 ("Shellshock").
;
termine l'instruction qui définit la fonction, permettant au texte suivant d'être lu et exécuté comme une commande séparée. Et le texte après ;
n'a pas à être une autre définition de fonction - il peut être n'importe quoi.
-
Dans ce test, la commande après ;
est echo VULNERABLE
. L'espace avant echo
ne fait rien et est présent uniquement pour la lisibilité. code> echo écrit du texte dans la sortie standard. Le comportement complet de echo
est en fait quelque peu compliqué, mais c'est sans importance ici: echo VULNERABLE
est simple . Il affiche le texte VULNERABLE
.
Puisque echo VULNERABLE
n'est exécuté que si bash n'est pas corrigé et exécute le code après les définitions de fonction dans les variables d'environnement, ceci (et de nombreux autres tests similaires) est un test efficace pour savoir si le bash
installé est vulnérable à CVE-2014-6271.
Autres bogues d'analyse des fonctions (et pourquoi ce test et ceux qui le ressemblent ne les vérifient pas)
Le correctif qui a été publié au moment de la rédaction de cet article, et les commandes décrites et expliquées ci-dessus pour vérifier la vulnérabilité, s'appliquent au bogue très grave connu sous le nom de CVE-2014-6271. Ni ce correctif ni les commandes décrites ci-dessus pour vérifier la vulnérabilité ne s'appliquent au bogue connexe CVE-2014-7169 (et ne doivent pas non plus être supposées s'appliquer à d'autres bogues qui n'ont pas encore été découverts ou divulgués).
Le bogue CVE-2014-6271 est né d'une combinaison de deux problèmes:
- bash accepte les définitions de fonctions dans des variables d'environnement arbitraires, et
- ce faisant, bash continue d'exécuter tout code qui existe après l'accolade fermante (
}
) d'une définition de fonction.
Au moment d'écrire ces lignes, le correctif existant pour CVE-2014-6271 qui a été publié (et déployé par de nombreux fournisseurs en aval) - c'est-à-dire le correctif que vous obtiendriez en mettant à jour votre système ou en appliquant le correctif existant manuellement - est un correctif pour 2 Mais en présence d ' autres erreurs dans le code de bash, 1 est potentiellement une source de nombreux bogues d'analyse supplémentaires. Et nous savons qu’au moins un autre bogue de ce type existe, en particulier CVE-2014-7169.
La commande présentée dans cette réponse teste si ou non, un bash installé est corrigé avec le correctif existant (c'est-à-dire le premier correctif officiel) pour CVE-2014-6271. Il teste la vulnérabilité à ce bogue d'analyse spécifique: "GNU Bash via 4.3 traite les chaînes de fin après les définitions de fonction dans les valeurs des variables d'environnement [...]"
Ce bogue spécifique est extrêmement sévère - et le correctif disponible le corrige - alors que CVE-2014-7169 semble être moins sévère mais reste certainement préoccupant.
Comme Stéphane Chazelas ( découvreur du bogue Shellshock) l'a récemment expliqué dans une réponse à Quand le shellshock (CVE -2014-6271) introduit un bug, et quel est le correctif qui le corrige complètement? sur Unix.SE:
Il y a un correctif qui empêche bash
d'interpréter autre chose que la définition de fonction qui s'y trouve ( https://lists.gnu.org/archive/html/bug-bash/2014-09/msg00081.html), et c'est celui qui a été appliqué dans toutes les mises à jour de sécurité des différentes distributions Linux.
Cependant, bash interprète toujours le code là-dedans et tout bogue dans l'interpréteur pourrait être exploité. Un de ces bogues a déjà été trouvé (CVE-2014-7169) bien que son impact soit beaucoup plus faible. Donc, il y aura bientôt un autre patch à venir.
Mais si c'est à ça que ressemble l'exploit ...
Certaines personnes , ici et ailleurs, ont demandé pourquoi x = '() {:;}; echo VULNERABLE 'bash -c:
l'impression de VULNERABLE
(ou similaire) doit être considérée comme alarmante. Et j'ai récemment vu une idée fausse circuler selon laquelle parce que vous devez déjà avoir un accès au shell interactif pour taper cette commande particulière et appuyer sur Entrée , Shellshock ne doit pas être une vulnérabilité sérieuse.
Bien que certains des sentiments que j'ai entendus exprimés - que nous ne devrions pas nous précipiter dans la panique, que les utilisateurs de bureau derrière les routeurs NAT ne devraient pas mettre leur vie en attente pour construire bash à partir du code source - sont tout à fait corrects, déroutants la vulnérabilité elle-même avec la possibilité de la tester en exécutant une commande spécifique (telle que la commande présentée ici) est une grave erreur.
La commande donnée dans cet article est une réponse à la question, "Y a-t-il une courte commande pour tester si mon serveur est sécurisé contre le bogue shellshock bash?" Ce n'est pas une réponse à "À quoi ressemble le shellshock lorsqu'il est utilisé contre moi par un vrai attaquant?" et ce n'est pas une réponse à la question "Que doit faire quelqu'un pour réussir à exploiter ce bogue?" (Et ce n'est pas non plus une réponse à "Est-ce que y a-t-il une commande simple pour déduire de tous les facteurs techniques et sociaux si je suis personnellement à haut risque? ")
Cette commande est un test, pour voir si bash exécutera du code écrit, d'une manière particulière, dans des variables d'environnement arbitraires. La vulnérabilité Shellshock n'est pas x = '() {:;}; echo VULNERABLE 'bash -c:
. Au lieu de cela, cette commande (et d'autres comme elle) est un diagnostic pour aider à déterminer si l'un d'entre eux est affecté par Shellshock.
- Shellshock a des conséquences très diverses, même s'il est vrai que le risque est presque certainement moindre pour les utilisateurs de bureau qui n'exécutent pas de serveurs réseau accessibles à distance. (Je ne pense pas que nous sachions combien de moins pour le moment.)
- En revanche, la commande
x = ' () {:;}; echo VULNERABLE 'bash -c:
est totalement sans conséquence sauf dans la mesure où il est utile pour tester Shellshock (en particulier, pour CVE-2014-6271).
Pour ceux qui le sont intéressé, voici quelques ressources avec des informations sur les raisons pour lesquelles ce bogue est considéré comme grave et pourquoi les variables d'environnement, en particulier sur les serveurs réseau, peuvent contenir des données non fiables capables d'exploiter le bogue et de causer des dommages:
Pour illustrer davantage la distinction conceptuelle ici, considérons deux hypothèses:
-
Imaginez si au lieu de suggérer x = '() {:;}; echo VULNERABLE 'bash -c:
comme test, j'avais suggéré bash --version
comme test. (Ce ne serait en fait pas particulièrement approprié, car les éditeurs de systèmes d'exploitation rétroportent fréquemment les correctifs de sécurité vers d'anciennes versions de logiciels. Les informations de version qu'un programme vous donne peuvent, sur certains systèmes, donner l'impression que le programme serait vulnérable, alors qu'en fait, il a été corrigé.)
Si des tests en exécutant bash --version
étaient suggérés, personne ne dirait: "Mais les attaquants ne peuvent pas rester assis devant mon ordinateur et taper bash --version
, donc je dois aller bien! " C'est la distinction entre un test et le problème testé.
-
Imaginez si un avis était émis suggérant que votre voiture pourrait avoir un problème de sécurité, comme une défaillance ou une explosion de l'airbag en flammes lors d'une collision, et que les démonstrations d'usine avaient été diffusées. Personne ne dirait: "Mais je ne conduirais jamais accidentellement ou ne remorquerais jamais ma voiture à 900 miles jusqu'à l'usine et la ferais charger avec un mannequin de collision coûteux et claquer dans un mur de béton. Alors ça doit aller!" C'est la distinction entre un test et le problème testé.