Sie könnten das falsche Programm ausführen. Jemand könnte Sie dazu bringen, ihr Programm auszuführen.
Die -execdirAktion führt Ihren Befehl aus dem Verzeichnis aus, das die gefundenen Dateien enthält. Wenn $PATHrelative Pfade enthalten sind, wie z. B. .oder alles, was nicht damit beginnt/ , -execdirist dies unsicher, da ein Verzeichnis, in dem sich eine Datei befindet (oder ein anderes Verzeichnis, das relativ dazu aufgelöst wurde), möglicherweise auch eine ausführbare Datei mit demselben Namen enthält wie die, die Sie versuchen zu rennen. Diese möglicherweise nicht vertrauenswürdige ausführbare Datei würde dann stattdessen ausgeführt.
Dies könnte absichtlich von einem anderen Benutzer ausgenutzt werden, um zu bewirken, dass Sie dessen Programm ausführen, was zu einem Schaden oder einer Verletzung der Datensicherheit führen kann, anstatt des Programms, das Sie ausführen möchten. Oder, seltener, es kann einfach dazu führen, dass versehentlich das falsche Programm ausgeführt wird, auch ohne dass jemand versucht, das Problem zu lösen.
Wenn alles in Ihrer PATHUmgebungsvariable ein absoluter Pfad ist, sollte dieser Fehler nicht auftreten, selbst wenn das Verzeichnis Sie suchen und -execdiring aus ist in enthalten PATH. (Ich habe überprüft, ob dies funktioniert.) Wenn Sie der Meinung sind, dass Sie keine relativen Verzeichnisse haben $PATH, diese Fehlermeldung jedoch weiterhin erhalten, aktualisieren Sie Ihre Frage mit Details, einschließlich der Ausgabe von echo "$PATH".
Ein konkretes Beispiel.
Nehmen wir als Beispiel an, was schief gehen könnte:
- Alice hat es
.in sich, $PATHweil sie Programme in jedem Verzeichnis ausführen möchte, in dem sie sich gerade befindet cd, ohne sich die Mühe zu machen, ihren Namen voran zu stellen ./.
- Alice's frenemy Eve hat
/home/eve/sharedmit Alice geteilt.
- Alice möchte Statistiken (Zeilen, Wörter, Bytes) über die
.cDateien, die Eve mit ihr geteilt hat.
Also läuft Alice:
find ~eve/shared -name \*.c -execdir wc {} \;
Unglücklicherweise für Alice hat Eve ihr eigenes Skript erstellt, benannt wc, ausführbar gemacht ( chmod +x) und es heimlich in eines der Verzeichnisse darunter gestellt /home/eve/shared. Evas Skript sieht folgendermaßen aus:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
Also , wenn Alice Anwendungen findmit -execdirlaufen wcauf die Dateien Eve geteilt hat, und es wird auf Dateien im selben Verzeichnis wie Eves benutzerdefinierten wcSkript, Evas wcläuft - mit allen Alices Privilegien!
(Eve hat ihr wcSkript als Wrapper für das System eingerichtet wc, sodass Alice nicht einmal weiß, dass etwas schiefgelaufen ist, dh dass do_eviles ausgeführt wurde. Es sind jedoch einfachere - und auch komplexere - Variationen möglich. )
Wie findverhindert man das?
findVerhindert das Auftreten dieses Sicherheitsproblems, indem die Ausführung der -execdirAktion verweigert wird, wenn $PATHein relatives Verzeichnis enthalten ist.
find bietet je nach Situation zwei Diagnosemeldungen an.
Wenn .ist in $PATH, dann (wie Sie gesehen haben) heißt es:
find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
Es hat wahrscheinlich eine besondere Botschaft für den .Fall, wie es besonders häufig ist.
Wenn ein relativer Pfad anders als .--say, foo--appears in $PATHund Sie laufen findmit -execdir, heißt es:
find: The relative path `foo' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
Es ist besser, überhaupt keine relativen Pfade zu haben $PATH.
Das Risiko von .Pfaden oder anderen relativen Pfaden $PATHist besonders hoch, wenn Sie ein Dienstprogramm verwenden, das das Verzeichnis automatisch ändert, weshalb findSie dies -execdirin dieser Situation nicht zulassen .
Aber mit relativen Pfaden, vor allem .in Ihrer $PATHNatur aus riskant ist und wirklich sowieso am besten vermieden werden. Betrachten Sie die fiktive Situation im obigen Beispiel. Angenommen, anstatt zu rennen find, rennt Alice einfach cdzu ~eve/shared/blahund davon wc *.c. Wenn blahEvas wcSkript enthalten ist, wird es do_evilals Alice ausgeführt.