Sie könnten das falsche Programm ausführen. Jemand könnte Sie dazu bringen, ihr Programm auszuführen.
Die -execdir
Aktion führt Ihren Befehl aus dem Verzeichnis aus, das die gefundenen Dateien enthält. Wenn $PATH
relative Pfade enthalten sind, wie z. B. .
oder alles, was nicht damit beginnt/
, -execdir
ist 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 PATH
Umgebungsvariable ein absoluter Pfad ist, sollte dieser Fehler nicht auftreten, selbst wenn das Verzeichnis Sie suchen und -execdir
ing 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, $PATH
weil 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/shared
mit Alice geteilt.
- Alice möchte Statistiken (Zeilen, Wörter, Bytes) über die
.c
Dateien, 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 find
mit -execdir
laufen wc
auf die Dateien Eve geteilt hat, und es wird auf Dateien im selben Verzeichnis wie Eves benutzerdefinierten wc
Skript, Evas wc
läuft - mit allen Alices Privilegien!
(Eve hat ihr wc
Skript als Wrapper für das System eingerichtet wc
, sodass Alice nicht einmal weiß, dass etwas schiefgelaufen ist, dh dass do_evil
es ausgeführt wurde. Es sind jedoch einfachere - und auch komplexere - Variationen möglich. )
Wie find
verhindert man das?
find
Verhindert das Auftreten dieses Sicherheitsproblems, indem die Ausführung der -execdir
Aktion verweigert wird, wenn $PATH
ein 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 $PATH
und Sie laufen find
mit -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 $PATH
ist besonders hoch, wenn Sie ein Dienstprogramm verwenden, das das Verzeichnis automatisch ändert, weshalb find
Sie dies -execdir
in dieser Situation nicht zulassen .
Aber mit relativen Pfaden, vor allem .
in Ihrer $PATH
Natur 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 cd
zu ~eve/shared/blah
und davon wc *.c
. Wenn blah
Evas wc
Skript enthalten ist, wird es do_evil
als Alice ausgeführt.
Es gibt eine viel detaillierten Informationen hier . Eine weitere hervorragende Referenz ist hier . Um aus der ersten Referenz zu zitieren:
Aus der zweiten Referenz:
quelle
Das Hauptproblem ist der Wert der Systemvariablen,
PATH
die relative Ordner enthält. Aus Sicherheitsgründenfind
können Sie mit dem Befehl keine Binärdateien ausführen, da möglicherweise falsche Programme ausgeführt werden.Wenn Sie zum Beispiel Ihr aktuelles Verzeichnis gemäß der Warnung in Ihrem PATH haben, die Sie erhalten:
und du wirst deinen Befehl ausführen:
Falls Sie ein lokales Skript (
rm
mit ausführbaren Flags) haben,rm -fr /
in dem es enthalten ist, können alle Ihre Dateien entfernt werden, da Sie statt der erwarteten/bin/rm
Ausführungrm
aus dem aktuellen Verzeichnis ausführen , sodass dies wahrscheinlich nicht das ist, was Sie wollten.Als Randnotiz ist dieses Problem in Travis CI ( GH # 2811 ) bekannt, wenn es mit dem Fehler fehlschlägt:
Die Lösung besteht also darin, den betroffenen Eintrag aus der PATH-Variablen zu entfernen, z
wie von drogus vorgeschlagen . Der Fortschritt dieses Fehlers kann unter GH # 4862 verfolgt werden .
Hier ist die Problemumgehung für die Bash-Version:
Beispielverwendung (Übergabe gefiltert
PATH
an bestimmten Befehl):quelle
sed
, der anscheinend alle Dinge entfernt,find
die nicht gefallen: askubuntu.com/questions/621132/…xargs
undbash -c cd
ProblemumgehungOK ich gebe auf:
sed
ProblemumgehungEin bisschen weniger schön als die vorherige Problemumgehung:
Ein Testfall:
Für
rename
speziell, können Sie auch mit einigen Perl regex-fu umgehen: /programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971RTFS-Hoffnung zermalmt
Für diejenigen, die hoffen, dass es einen Weg gibt, die
find
Meinungsäußerung zu ignorieren , lassen Sie mich das mit einer Quelle zerschlagen:Daraus ergibt sich, dass es anscheinend keine Möglichkeit gibt, die Pfadprüfung auszuschalten.
Die genaue Regel, die überprüft wird, lautet: Fehler, wenn die
PATH
entweder leer ist oder nicht mit beginnt/
.quelle