Vous pourriez exécuter le mauvais programme. Quelqu'un pourrait vous faire exécuter leur programme.
L' -execdir
action exécute votre commande à partir du répertoire qui contient le ou les fichiers trouvés. Lorsque $PATH
contient des chemins relatifs, tels que .
ou tout ce qui ne commence pas/
, -execdir
n'est pas sûr car un répertoire où se trouve un fichier (ou un autre répertoire résolu par rapport à lui) peut également contenir un exécutable du même nom que celui que vous essayez courir. Cet exécutable potentiellement non fiable serait alors exécuté à la place.
Cela pourrait être délibérément exploité par un autre utilisateur pour vous obliger à exécuter son programme, ce qui pourrait nuire ou porter atteinte à la sécurité des données, au lieu du programme que vous essayez d'exécuter. Ou, moins souvent, cela peut simplement entraîner l'exécution du mauvais programme par inadvertance, même sans que quiconque essaie de résoudre le problème.
Si tout dans votre PATH
variable d'environnement est un chemin absolu, cette erreur ne devrait pas se produire, même si le répertoire que vous êtes à la recherche et -execdir
ing de est contenue dans PATH
. (J'ai vérifié que cela fonctionne.) Si vous pensez ne pas avoir de répertoires relatifs $PATH
mais que vous obtenez toujours cette erreur, veuillez mettre à jour votre question avec les détails, y compris la sortie de echo "$PATH"
.
Un exemple concret.
À titre d'exemple de ce qui pourrait mal tourner, supposons:
- Alice a
.
en elle $PATH
parce qu'elle veut être en mesure d'exécuter des programmes dans n'importe quel répertoire cd
, sans prendre la peine d'ajouter leurs noms ./
.
- La frenemy d'Alice Eve a partagé
/home/eve/shared
avec Alice.
- Alice veut des statistiques (lignes, mots, octets) sur les
.c
fichiers qu'Eve a partagés avec elle.
Alors Alice court:
find ~eve/shared -name \*.c -execdir wc {} \;
Malheureusement pour Alice, Eve a créé son propre script, l'a nommé wc
, l'a défini exécutable ( chmod +x
) et l'a placé clandestinement dans l'un des répertoires sous /home/eve/shared
. Le script d'Eve ressemble à ceci:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
Donc, quand Alice utilise find
avec -execdir
pour s'exécuter wc
sur les fichiers partagés par Eve, et qu'elle accède aux fichiers dans le même répertoire que le wc
script personnalisé d' Eve, Eve wc
s'exécute - avec tous les privilèges d'Alice!
(Étant astucieuse, Eve a fait en sorte que son wc
script agisse comme un wrapper pour le système wc
, donc Alice ne saura même pas que quelque chose s'est mal passé, c'est-à-dire qu'elle a do_evil
été exécutée. Cependant, des variations plus simples - et aussi plus sophistiquées - sont possibles. )
Comment find
empêche cela.
find
empêche ce problème de sécurité de se produire en refusant d'effectuer l' -execdir
action lorsqu'il $PATH
contient un répertoire relatif.
find
propose deux messages de diagnostic en fonction de la situation spécifique.
Si .
est $PATH
dedans, alors (comme vous l'avez vu), il dit:
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)
Il a probablement un message spécial pour le .
cas car il est particulièrement courant.
Si un chemin relatif autre que .
--say, - foo
apparaît $PATH
et que vous exécutez find
avec -execdir
, il indique:
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
Il vaut mieux ne pas avoir de chemin relatif $PATH
du tout.
Le risque d'avoir .
ou d'autres chemins d'accès relatifs $PATH
est particulièrement accru lors de l'utilisation d'un utilitaire qui modifie automatiquement le répertoire, c'est pourquoi find
vous ne pourrez pas l'utiliser -execdir
dans cette situation.
Mais avoir des chemins relatifs, en particulier .
, dans votre $PATH
est intrinsèquement risqué et il vaut mieux éviter de toute façon. Considérez la situation fictive dans l'exemple ci-dessus. Supposons au lieu de courir find
, Alice simplement cd
s à ~eve/shared/blah
et fonctionne wc *.c
. Si blah
contient le wc
script d'Eve , do_evil
s'exécute en tant qu'Alice.