Imprimer

Shellshock

.

Depuis quelques jours, Internet bruisse d'une nouvelle vulnérabilité nommée Shellshock découverte dans bash par Stéphane Chazelas le 12 septembre 2014, et publiée le 24 septembre. Cette vulnérabilité repose sur une erreur dans l'utilisation de variables d'environnement associées à une définition de fonction shell. L'exploitation de la vulnérabilité donne à l'agresseur accès à un interpréteur de commandes sur le système visé, avec les droits associés au processus attaqué.

La vulnérabilité

Variables d'environnement et sécurité

Avec le shell, il est possible de définir une variable d'environnement, qui est accessible à l'interpréteur de commandes où se fait la définition ainsi qu'à ses sous-processus. C'est une façon de transmettre des données d'un processus père à un ou plusieurs processus fils.

En matière de sécurité, toute transmission d'information entre deux composants (ici un processus père et l'un de ses descendants) doit donner lieu à la validation des données transmises avant leur utilisation. C'est pour cela que certains scripts valident, voire définissent d'autorité, le contenu des variables PATH, LIB et autres, qui permettent d'indiquer le chemin de recherche des commandes ou des bibliothèques.

Shellshock

La vulnérabilité Shellshock ne touche que l'interpréteur bash. Elle est subtile, en cela que le processus visé ne peut pas vérifier l'inocuité d'une variable d'environnement : lorsque le processus démarre, il est déjà trop tard. Il s'agit d'une vulnérabilité de type exécution de commande à distance (RCE, Remote Command Execution). La variable d'environnement définit une fonction suivie de code shell. L'ensemble est transmis au processus cible qui, s'il s'agit d'un bash vulnérable, exécutera le code placé après la définition de fonction :

$ env x='() { :;}; echo Vulnérable' bash -c "echo Voici un test"
Vulnérable
Voici un test

Dans l'exemple ci-dessus, la variable d'environnement x contient la définition d'une fonction vide : accolade ouvrante, deux-points, point-virgule, accolade fermante. Cette définition est suivie du code echo Vulnérable. La variable x est placée dans l'environnement du shell courant, et un sous-processus est lancé (bash -c ...). Le résultat est que la commande echo associée à la variable d'environnement est exécutée, et elle l'est avant que le shell lui-même n'exécute la commande demandée.

Si vous n'êtes pas vulnérable (pas d'utilisation de bash, ou version corrigée de cet interpréteur de commandes), vous obtiendrez

$ env x='() { :;}; echo Vulnérable' bash -c "echo Voici un test"
Voici un test