GNU/Linux >> Tutoriels Linux >  >> Linux

Que fait Env X=() { :;}; Command' Bash Do et pourquoi n'est-il pas sécurisé ?

Il y a apparemment une vulnérabilité (CVE-2014-6271) dans bash :attaque par injection de code de variables d'environnement spécialement conçues pour Bash

J'essaie de comprendre ce qui se passe, mais je ne suis pas tout à fait sûr de comprendre. Comment le echo peut-il être exécuté tel quel entre guillemets simples ?

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

MODIFICATION 1  : Un système corrigé ressemble à ceci :

$ 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

MODIFICATION 2  :Il existe une vulnérabilité / un correctif connexe :CVE-2014-7169 qui utilise un test légèrement différent :

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"

sortie non corrigée :

vulnerable
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for `BASH_FUNC_x'
test

sortie partiellement corrigée (première version) :

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test

sortie corrigée jusqu'à CVE-2014-7169 inclus :

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test

MODIFICATION 3 :l'histoire continue avec :

  • CVE-2014-7186
  • CVE-2014-7187
  • CVE-2014-6277

Réponse acceptée :

bash stocke les définitions de fonctions exportées en tant que variables d'environnement. Les fonctions exportées ressemblent à ceci :

$ foo() { bar; }
$ export -f foo
$ env | grep -A1 foo
foo=() {  bar
}

Autrement dit, la variable d'environnement foo a le contenu littéral :

() {  bar
}

Lorsqu'une nouvelle instance de bash est lancée, elle recherche ces variables d'environnement spécialement conçues et les interprète comme des définitions de fonctions. Vous pouvez même en écrire un vous-même et constater qu'il fonctionne toujours :

$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function

Malheureusement, l'analyse des définitions de fonctions à partir de chaînes (les variables d'environnement) peut avoir des effets plus larges que prévu. Dans les versions non corrigées, il interprète également les commandes arbitraires qui se produisent après la fin de la définition de la fonction. Cela est dû à des contraintes insuffisantes dans la détermination des chaînes de type fonction acceptables dans l'environnement. Par exemple :

$ export foo='() { echo "Inside function" ; }; echo "Executed echo"'
$ bash -c 'foo'
Executed echo
Inside function

Notez que l'écho en dehors de la définition de la fonction a été exécuté de manière inattendue lors du démarrage de bash. La définition de la fonction n'est qu'une étape pour que l'évaluation et l'exploitation se produisent, la définition de la fonction elle-même et la variable d'environnement utilisée sont arbitraires. Le shell regarde les variables d'environnement, voit foo , qui semble répondre aux contraintes qu'il connaît sur ce à quoi ressemble une définition de fonction, et il évalue la ligne, en exécutant également involontairement l'écho (qui peut être n'importe quelle commande, malveillante ou non).

Connexe :Dd :plusieurs fichiers d'entrée ?

Ceci est considéré comme non sécurisé car les variables ne sont généralement pas autorisées ou attendues, par elles-mêmes, pour provoquer directement l'invocation du code arbitraire qu'elles contiennent. Peut-être que votre programme définit des variables d'environnement à partir d'une entrée utilisateur non fiable. Il serait très inattendu que ces variables d'environnement puissent être manipulées de telle sorte que l'utilisateur puisse exécuter des commandes arbitraires sans votre intention explicite de le faire en utilisant cette variable d'environnement pour une telle raison déclarée dans le code.

Voici un exemple d'attaque viable. Vous exécutez un serveur Web qui exécute un shell vulnérable, quelque part, dans le cadre de sa durée de vie. Ce serveur Web transmet des variables d'environnement à un script bash, par exemple, si vous utilisez CGI, les informations sur la requête HTTP sont souvent incluses en tant que variables d'environnement à partir du serveur Web. Par exemple, HTTP_USER_AGENT peut être défini sur le contenu de votre agent utilisateur. Cela signifie que si vous usurpez votre agent utilisateur pour qu'il soit quelque chose comme '() { :; } ; echo foo', lorsque ce script shell s'exécute, echo foo sera exécuté. Encore une fois, echo foo peut être n'importe quoi, malveillant ou non.


Linux
  1. Que signifie -s et [[]] dans une condition If dans Bash ?

  2. Le point d'Uniq -u et à quoi ça sert ??

  3. Que fait 'bash -c' ?

  4. Qu'est-ce que `S_ISREG()` et à quoi sert-il ?

  5. La manipulation de la fonction bash expliquée

Qu'est-ce qu'une machine virtuelle et pourquoi l'utiliser ?

Qu'est-ce que la commande Grep sous Linux ? Pourquoi est-il utilisé et comment fonctionne-t-il ?

Pourquoi eval devrait-il être évité dans Bash et que dois-je utiliser à la place ?

que fait la fonction low_alias et où est-elle définie

Qu'est-ce qu'un GPU Matrox et pourquoi le serveur UNIX de mon université en a-t-il un ?

Que fait 'set -e', et pourquoi pourrait-il être considéré comme dangereux ?