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.
Il y a une information très détaillée ici . Une autre excellente référence est ici . Pour citer la première référence:
De la deuxième référence:
la source
Le problème principal est avec la valeur de la variable système
PATH
qui contient des dossiers relatifs, donc pour des raisons de sécurité, lafind
commande ne vous permettra pas d'exécuter des binaires, car elle peut potentiellement exécuter de mauvais programmes.Ainsi, par exemple, si vous avez votre répertoire actuel dans votre PATH selon l'avertissement que vous obtenez:
et vous exécuterez votre commande:
au cas où vous auriez un script local (
rm
avec des drapeaux exécutables) contenantrm -fr /
, il peut supprimer tous vos fichiers, car au lieu de l'exécuter/bin/rm
, vous l'exécuterez àrm
partir du répertoire actuel, donc ce n'est probablement pas ce que vous vouliez.En remarque, il s'agit d'un problème connu dans Travis CI ( GH # 2811 ) lorsqu'il échoue avec l'erreur:
La solution consiste donc à supprimer l'entrée affectée de la variable PATH, par exemple
tel que proposé par drogus . La progression de ce bug peut être suivie sur GH # 4862 .
Voici la solution de contournement de la version Bash:
Exemple d'utilisation (passage filtré
PATH
à une commande spécifique):la source
sed
qui semble supprimer tout ce quifind
n'aime pas: askubuntu.com/questions/621132/…xargs
etbash -c cd
solution de contournementOK, j'abandonne:
sed
solution de contournementUn peu moins sympa que la solution de contournement précédente:
Un cas d'essai:
Pour plus
rename
précisément, vous pouvez également contourner certains regex-fu Perl: /programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971RTFS espère écraser
Pour ceux qui espèrent qu'il existe un moyen d'ignorer
find
l'opinionnisme, laissez-moi l'écraser avec une source:De cela, nous voyons qu'il ne semble pas y avoir de moyen de désactiver la vérification du chemin.
La règle exacte qu'il vérifie est: échouer si le
PATH
est vide ou ne commence pas par/
.la source