Potresti eseguire il programma sbagliato. Qualcuno potrebbe farti eseguire il loro programma.
L' -execdir
azione esegue il comando dalla directory che contiene i file trovati. Quando $PATH
contiene percorsi relativi, come .
o tutto ciò che non inizia/
, -execdir
è insicuro perché una directory in cui viene trovato un file (o un'altra directory risolta rispetto ad esso) potrebbe contenere anche un eseguibile con lo stesso nome di quello che stai provando correre. L'eseguibile potenzialmente non attendibile verrebbe invece eseguito.
Questo potrebbe essere deliberatamente sfruttato da un altro utente per farti eseguire il suo programma, il che potrebbe causare danni o violare la sicurezza dei dati, invece del programma che stai tentando di eseguire. O, meno spesso, potrebbe semplicemente comportare l'esecuzione involontaria del programma sbagliato, anche senza che nessuno provi a far accadere il problema.
Se tutto nella PATH
variabile di ambiente è un percorso assoluto, questo errore non dovrebbe verificarsi, anche se la directory da cui stai cercando e -execdir
in cui è contenuta è contenuta PATH
. (Ho verificato che funzioni.) Se ritieni di non avere alcuna directory relativa $PATH
ma stai ancora riscontrando questo errore, aggiorna la tua domanda con i dettagli, incluso l'output di echo "$PATH"
.
Un esempio concreto.
Come esempio di cosa potrebbe andare storto, supponiamo:
- Alice ha
.
in lei $PATH
perché vuole essere in grado di eseguire programmi in qualunque directory si trovi cd
, senza preoccuparsi di anteporre i loro nomi ./
.
- La frenetica Eva
/home/eve/shared
di Alice ha condiviso con Alice.
- Alice vuole statistiche (righe, parole, byte) sui
.c
file che Eva ha condiviso con lei.
Quindi Alice corre:
find ~eve/shared -name \*.c -execdir wc {} \;
Sfortunatamente per Alice, Eva ha creato la sua sceneggiatura, l'ha nominata wc
, l'ha impostata come eseguibile ( chmod +x
) e l'ha collocata clandestinamente in una delle directory sotto /home/eve/shared
. La sceneggiatura di Eva appare così:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
Quindi, quando Alice usa find
con -execdir
per essere eseguita wc
sui file che Eva ha condiviso e arriva ai file nella stessa directory dello wc
script personalizzato di Eva, Eva wc
corre, con tutti i privilegi di Alice!
(Essendo furbo, Eva ha fatto in modo che la sua wc
sceneggiatura agisca come un involucro per il sistema wc
, quindi Alice non saprà nemmeno che qualcosa è andato storto, cioè che è do_evil
stato eseguito. Tuttavia, sono possibili variazioni più semplici - e anche più sofisticate. )
Come find
impedisce questo.
find
impedisce che si verifichi questo problema di sicurezza rifiutando di eseguire l' -execdir
azione quando $PATH
contiene una directory relativa.
find
offre due messaggi diagnostici a seconda della situazione specifica.
Se .
è dentro $PATH
, allora (come hai visto) dice:
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)
Probabilmente ha un messaggio speciale per il .
caso in quanto è particolarmente comune.
Se un percorso relativo diverso .
--say, foo
--appears in $PATH
e si esegue find
con -execdir
, si dice:
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
È meglio non avere affatto percorsi relativi $PATH
.
Il rischio di avere .
o altri percorsi relativi $PATH
è particolarmente accentuato quando si utilizza un'utilità che modifica automaticamente la directory, motivo find
per cui non è possibile utilizzarlo -execdir
in questa situazione.
Ma avere percorsi relativi, in particolare .
, nel tuo $PATH
è intrinsecamente rischioso ed è comunque davvero meglio evitarlo. Considera la situazione immaginaria nell'esempio sopra. Supponiamo che invece di correre find
, Alice semplicemente cd
S per ~eve/shared/blah
e corre wc *.c
. Se blah
contiene la wc
sceneggiatura di Eva , do_evil
funziona come Alice.