Vous pourriez exécuter le mauvais programme. Quelqu'un pourrait vous faire exécuter leur programme.
L' -execdiraction exécute votre commande à partir du répertoire qui contient le ou les fichiers trouvés. Lorsque $PATHcontient des chemins relatifs, tels que .ou tout ce qui ne commence pas/ , -execdirn'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 PATHvariable 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 -execdiring de est contenue dans PATH. (J'ai vérifié que cela fonctionne.) Si vous pensez ne pas avoir de répertoires relatifs $PATHmais 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 $PATHparce 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/sharedavec Alice.
- Alice veut des statistiques (lignes, mots, octets) sur les
.cfichiers 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 findavec -execdirpour s'exécuter wcsur les fichiers partagés par Eve, et qu'elle accède aux fichiers dans le même répertoire que le wcscript personnalisé d' Eve, Eve wcs'exécute - avec tous les privilèges d'Alice!
(Étant astucieuse, Eve a fait en sorte que son wcscript 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 findempêche cela.
findempêche ce problème de sécurité de se produire en refusant d'effectuer l' -execdiraction lorsqu'il $PATHcontient un répertoire relatif.
find propose deux messages de diagnostic en fonction de la situation spécifique.
Si .est $PATHdedans, 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, - fooapparaît $PATHet que vous exécutez findavec -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 $PATHdu tout.
Le risque d'avoir .ou d'autres chemins d'accès relatifs $PATHest particulièrement accru lors de l'utilisation d'un utilitaire qui modifie automatiquement le répertoire, c'est pourquoi findvous ne pourrez pas l'utiliser -execdirdans cette situation.
Mais avoir des chemins relatifs, en particulier ., dans votre $PATHest 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 cds à ~eve/shared/blahet fonctionne wc *.c. Si blahcontient le wcscript d'Eve , do_evils'exécute en tant qu'Alice.