Avec une version bash qui a été corrigée pour shellshock
$ bash --version GNU bash, version 3.2.52(1)-release (x86_64-apple-darwin12) Copyright (C) 2007 Free Software Foundation, Inc. $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test" bash: warning: x: ignoring function definition attempt bash: error importing function definition for `x' this is a test
un autre exploit similaire fonctionne toujours et a été atsortingbué à CVE-2014-7169
$ env X='() { (a)=>\' bash -c "echo date"; cat echo bash: X: line 1: syntax error near unexpected token `=' bash: X: line 1: `' bash: error importing function definition for `X' Thu Sep 25 12:47:22 EDT 2014 $ ls echo echo
Vous cherchez une ventilation de cela aussi.
CVE-2014-7169 est un bogue dans l’parsingur de bash. L’parsingur de Bash utilise une variable eol_ungetc_lookahead
pour annuler les caractères sur les lignes. Cette variable n’était pas correctement réinitialisée à partir de la fonction reset_parser
, appelée par exemple sur certaines erreurs de syntaxe. En utilisant ce bogue, il est possible d’injecter un caractère au début de la prochaine ligne d’entrée bash.
Le code de test force donc une erreur de syntaxe, en utilisant soit (a)=
ou la function aa
, ajoute le caractère de redirection à append à la ligne suivante >
, et ajoute une ligne continue \
, qui mène à la version du code de test:
() { (a)=>\ () { function a a>\
Lorsque bash est exécuté, il traite les variables de l’environnement, trouve que la variable X
est une fonction exscope et l’évalue pour importer la fonction. Mais l’évaluation échoue avec une erreur d’parsing, laissant le caractère >
dans la variable eol_ungetc_lookahead
. Ensuite, lors de l’parsing syntaxique de l’argument echo date
, il ajoute le caractère >
, conduisant à >echo date
, la date
exécution redirigée vers un fichier nommé echo
.
Le bogue ci-dessus est évidemment très différent du bogue original de shellshock. Il y a effectivement plusieurs problèmes:
() {
). CVE-2014-6271. () {
. CVE-2014-6271, CVE-2014-7169, tous les autres CVE dans lesquels un bogue est déclenché dans l’parsingur de bash. select
/ for
/ while
), avec des contrôles pour le débordement. Cette stack est toujours corrompue. CVE-2014-7187. eol_ungetc_lookahead
sur reset_parser
. BASH_FUNC_functionname%%
. Le gros problème est que chaque variable d’environnement peut être utilisée comme vecteur d’attaque. Généralement, les attaquants ne peuvent pas contrôler les variables d’environnement arbitraires, sinon il existe déjà d’autres attaques connues (pensez à LD_PRELOAD
, PATH
, IFS
, …).
sudo
n’est pas affecté car il dépouille les fonctions bash exscopes de l’environnement, comme mentionné par Gilles sur security.SE .
ssh
est affecté. Les installations sshd typiques permettent uniquement un ensemble limité de variables d’environnement à exporter comme configuré dans AcceptEnv dans sshd_config
, par exemple: LANG
et LC_*
. Même avec cette approche de liste blanche agressive, en shellshock, n’importe quelle variable pourrait être un vecteur d’attaque.
Non seulement chaque variable d’environnement était un vecteur d’attaque potentiel, mais elle exposait un parsingur de plus de 6000 lignes.
system
, popen
et autres sont potentiellement dangereux. Vous devez non seulement faire attention à leurs arguments: même lorsque les arguments sont fixés à la compilation, l’environnement est un vecteur d’attaque potentiel. Utilisez fork()/execve()
, de préférence avec un environnement propre (mais limitez au moins l’environnement aux variables en liste blanche, de préférence avec leurs valeurs vérifiées). Rappelez-vous qu’un système de bonne qualité fait ce qu’il est censé faire, alors qu’un système sécurisé fait ce qu’il est censé faire et rien de plus . Invoquer un shell complet ne rend rien plus difficile.
La complexité est l’ennemi de la sécurité. Ces jours-ci, vous pouvez facilement trouver des personnes recommandant des coquilles plus simples. La plupart des shells sont exempts de shellshock en ne supportant pas du tout les fonctions exscopes. Inversement, bash a reçu de nombreuses fonctionnalités de sécurité au fil des ans (vous devez l’appeler avec -p
pour éviter de laisser des privilèges au démarrage, il assainit IFS, …), donc ne présumez pas que je préconise de changer de shell, c’est plus un conseil général.
Certains extraits du chapitre “Programmation sécurisée pour Linux et UNIX HOWTO” de David Wheeler sur les variables d’environnement méritent encore d’être relus.
§5.2.3 ¶1:
Pour les programmes setuid / setgid sécurisés, la courte liste des variables d’environnement nécessaires en entrée (le cas échéant) doit être soigneusement extraite. Ensuite, l’environnement entier doit être effacé, suivi par la réinitialisation d’un petit ensemble de variables d’environnement nécessaires à des valeurs sûres. Il n’y a vraiment pas de meilleur moyen si vous appelez des programmes subordonnés. il n’y a pas de méthode pratique pour lister “toutes les valeurs dangereuses”.
§5.2.3 ¶6:
Si vous avez vraiment besoin de valeurs fournies par l’utilisateur, vérifiez d’abord les valeurs (pour vous assurer que les valeurs correspondent à un modèle pour les valeurs légales et qu’elles sont dans une longueur maximale raisonnable).
En agitant beaucoup les mains, je soupçonne que le nouvel exploit fait ce qui suit:
>
combine avec echo
tant que redirection de sortie pour le shell bash
echo
pour définir la fonction, la seule partie de l’argument -c
restant à exécuter est la date
, dont la sortie va à un echo
nom de fichier au lieu de la sortie standard. C’est ce que je peux faire de mieux en lisant la source bash
, mais je pense que la barre oblique inverse facilite une sorte de dépassement de tampon qui permet de fusionner la chaîne d’environnement et l’argument de -c
.