web-dev-qa-db-fra.com

Comment sécuriser Apache contre la vulnérabilité Bash Shellshock?

J'ai un serveur Web Apache en cours d'exécution, et avec les dernières nouvelles de l'exploit Shellsock contre bash, je me demandais si mon serveur Web était vulnérable. Je ne le pense pas, mais je veux m'assurer de ne pas me tromper.

Je n'utilise pas de CGI bash intentionnellement sur le serveur, il exécute des trucs PHP utilisant mod_php et un site Python WSGI. Mais j'aimerais pour être sûr qu'aucun des logiciels exécutés sur le serveur n'utilise CGI sans que je m'y attende.

Comment puis-je m'assurer que mon serveur Web n'est pas vulnérable?

43
user56147

Mis à part CGI, une utilisation négligée de sh est dans les appels de exec(), ou via l'utilisation de system() et popen(), sur la plupart des systèmes Linux cela signifie bash. La famille d'appels exec() est souvent utilisée avec "/bin/sh -c "pour fournir diverses fonctionnalités telles que la redirection Shell, les pipelines ou même simplement l'expansion d'arguments lors de l'appel de processus.

Apache utilise exactement cela (via APR, voir l'utilisation de Shell_PATH in apr/threadproc/unix/proc.c ) lorsque vous utilisez des journaux redirigés, ainsi que dans d'autres circonstances telles que les filtres de sortie externes (via ExtFilterDefine) et le traitement de #exec cmd SSI inclut. Ce comportement s'applique presque certainement également à de nombreux modules tiers.

Les meilleures étapes à suivre pour sécuriser votre serveur Web:

  • corrigez ou mettez à niveau votre paquet bash (si vous le faites vous-même, assurez-vous qu'il n'y a pas d'instances sh errantes, recherchez sh dans tous les chroots configurés manuellement également)
  • exécutez Apache dans un chroot, utilisez un minimum /bin/sh si et seulement si nécessaire:

    • dans Apache httpd 2.2, passez de l'utilisation de "|" à "|| "in piped logs , cela supprime le besoin de /bin/sh (disponible depuis Apache 2.2.12)
    • dans Apache httpd 2.4, assurez-vous que vous n'utilisez pas "|$ "in piped logs , cela revient au comportement httpd.2.2. 2.4 prend en charge | et ||, ni utiliser /bin/sh
  • assurez-vous que les scripts CGI par défaut sont désactivés, revérifiez à partir du niveau supérieur Options (par exemple <Directory /> bas pour ExecCGI

  • considérer mod_security si vous ne l'utilisez pas déjà. Red Hat a fourni quelques règles qui peuvent être utilisées pour enregistrer et nettoyer l'environnement dans KB article 12123 .

Vous pouvez également envisager d'utiliser "#!/bin/sh -p "dans les scripts, cela force bash à mode privilégié , cela empêche d'importer des fonctions de l'environnement (ainsi que d'autres changements). Cela peut aider si vous avez des vulnérabilités Scripts CGI sur un système, mais pas de correctif ni de compilateur. Cela peut ne pas fonctionner sur Debian et les systèmes dérivés , alors vérifiez attentivement.

(Également si /bin/sh est bash, ne le remplacez pas aveuglément par autre chose, cela pourrait affecter vos scripts de démarrage.)

Tout code d'application qui s'exécute via CGI (autre que les scripts bash) ou sous les modules Apache (Python et PHP dans votre cas) mai joue également un rôle dans cette. Si une variable peut être suffisamment contrôlée par un attaquant (le codage URI peut être un défi), et si l'application utilise /bin/sh lors de l'appel de processus, et si ces variables sont préservées, vous pourriez avoir un problème.

Si vous utilisez un système Linux contemporain, mais que vous n'avez pas configuré de chroot ou un autre conteneur pour Apache, vous devriez pouvoir utiliser unshare et un montage de liaison pour remplacer /bin/sh lors du démarrage d'Apache (ou de tout autre service).

unshare -m -- sh -c "mount --bind /usr/local/bin/bash /bin/sh && 
    /usr/local/Apache2/bin/apachectl start"

Les avantages à cela sont

  • moins de risques de rupture, car vous pouvez remplacer de manière sélective bash
  • vous pouvez vous connecter et auditer les tentatives pour appeler sh plus facilement

(Ce que vous ne pouvez pas faire facilement, c'est écrire un script bash comme wrapper pour inspecter et enregistrer les variables suspectes, vous devrez bien sûr utiliser autre chose ...)

Si vous exécutez auditd sur Linux, vous pouvez facilement regarder l'utilisation de /bin/sh en ajoutant quelques règles à audit.rules et rechargement:

-w /bin/sh                -p x
-w /bin/bash              -p x

(J'ai besoin des deux, puisque sh est un lien symbolique vers bash)

Red Hat a publié une approche alternative, un "correctif" d'exécution que vous pouvez utiliser avec LD_PRELOAD, vous pouvez trouver que dans l'avis . Cela pourrait également être adapté pour enregistrer des variables douteuses, si nécessaire. Étant donné qu'il existe actuellement des questions sur l'exhaustivité des correctifs jusqu'à présent, cette solution est probablement une bonne solution à court terme pour Apache au moins.

Vous pouvez également trouver des conseils plus généraux sur le renforcement d'Apache ici: Apache Server Hardening

28
mr.spuratic

Selon l'avis de Redhat:

mod_php, mod_Perl et mod_python n'utilisent pas de variables d'environnement et nous pensons qu'elles ne sont pas affectées.

En savoir plus à ce sujet sur: https://access.redhat.com/node/120022

9
shaomoon

Sécurisez bash et vous avez sécurisé la boîte. Il existe des correctifs disponibles dans la plupart des distributions ou vous pouvez les compiler et les corriger vous-même si vous exécutez une distribution qui n'est pas encore corrigée.

1
Andrew

Si vous n'êtes pas sûr de pouvoir désactiver le module cgi Sudo a2dismod mod_cgi ou supprimez LoadModule dans httpd.conf. Comme shaomoon mentionné mod_php, mod_Perl et mod_python ne sont pas affectés.

Quoi qu'il en soit, vous devez simplement installer le patch . Si votre bash n'est pas vulnérable, votre Apache sera également protégé contre cette attaque.

1
PiTheNumber