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?
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:
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:
|
" à "||
"in piped logs , cela supprime le besoin de /bin/sh
(disponible depuis Apache 2.2.12)|$
"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
bash
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
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
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.
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.