Podría ejecutar el programa incorrecto. Alguien podría hacerte ejecutar su programa.
La -execdir
acción ejecuta su comando desde el directorio que contiene los archivos encontrados. Cuando $PATH
contiene rutas relativas, como .
o cualquier cosa que no comience/
, no -execdir
es seguro porque un directorio donde se encuentra un archivo (u otro directorio resuelto en relación con él) también podría contener un ejecutable con el mismo nombre que el que está intentando correr. Ese ejecutable potencialmente no confiable se ejecutaría en su lugar.
Esto podría ser explotado deliberadamente por otro usuario para que ejecute su programa, lo que podría causar daños o vulnerar la seguridad de los datos, en lugar del programa que está intentando ejecutar. O, con menos frecuencia, podría simplemente resultar en la ejecución inadvertida del programa incorrecto, incluso sin que nadie intente solucionar el problema.
Si todo en su PATH
variable de entorno es una ruta absoluta, no debería ocurrir este error, incluso si el directorio que está buscando y -execdir
ing del que se contenida en PATH
. (He comprobado que esto funciona). Si cree que no tiene ningún directorio relativo $PATH
pero aún recibe este error, actualice su pregunta con detalles que incluyan la salida de echo "$PATH"
.
Un ejemplo concreto
Como ejemplo de lo que podría salir mal, suponga:
- Alice tiene
.
en ella $PATH
porque quiere poder ejecutar programas en cualquier directorio que quiera cd
, sin molestarse en anteponer sus nombres ./
.
- La enemiga frenemy de Alice ha compartido
/home/eve/shared
con Alice.
- Alice quiere estadísticas (líneas, palabras, bytes) en los
.c
archivos que Eve ha compartido con ella.
Entonces Alice corre:
find ~eve/shared -name \*.c -execdir wc {} \;
Desafortunadamente para Alice, Eve creó su propio script, lo nombró wc
, lo configuró como ejecutable ( chmod +x
) y lo colocó clandestinamente en uno de los directorios debajo /home/eve/shared
. El guión de Eve se ve así:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
Entonces, cuando Alice usa find
con -execdir
para ejecutarse wc
en los archivos que Eve ha compartido, y llega a los archivos en el mismo directorio que el wc
script personalizado de Eve, Eve wc
ejecuta, ¡con todos los privilegios de Alice!
(Siendo astuta, Eve ha hecho que su wc
guión actúe como una envoltura para el sistema wc
, por lo que Alice ni siquiera sabrá que algo salió mal, es decir, que do_evil
se ejecutó. Sin embargo, son posibles variaciones más simples y también más sofisticadas. )
Cómo find
previene esto.
find
evita que ocurra este problema de seguridad al negarse a tomar la -execdir
acción cuando $PATH
contiene un directorio relativo.
find
ofrece dos mensajes de diagnóstico según la situación específica.
Si .
está adentro $PATH
, entonces (como has 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)
Probablemente tiene un mensaje especial para el .
caso, ya que es especialmente común.
Si .
aparece una ruta relativa distinta de - dice, foo
- $PATH
y usted corre find
con -execdir
, 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
Es mejor no tener caminos relativos en $PATH
absoluto.
El riesgo de tener .
u otras rutas relativas $PATH
se incrementa especialmente cuando se usa una utilidad que cambia automáticamente el directorio, por find
lo que no le permitirá usar -execdir
en esta situación.
Pero tener caminos relativos, especialmente .
, en su $PATH
es inherentemente arriesgado y es mejor evitarlo de todos modos. Considere la situación ficticia en el ejemplo anterior. Supongamos que en lugar de correr find
, Alice simplemente cd
es para ~eve/shared/blah
y se ejecuta wc *.c
. Si blah
contiene el wc
guión de Eve , do_evil
corre como Alice.
Hay una información muy detallada aquí . Otra excelente referencia está aquí . Para citar de la primera referencia:
De la segunda referencia:
fuente
El principal problema es con el valor de la variable del sistema
PATH
que contiene carpetas relativas, por lo que, por razones de seguridad, elfind
comando no le permitirá ejecutar archivos binarios, porque potencialmente puede ejecutar programas incorrectos.Entonces, por ejemplo, si tiene su directorio actual en su RUTA según la advertencia que obtiene:
y ejecutarás tu comando:
en caso de que tenga un script local (
rm
con indicadores ejecutables) que lo contengarm -fr /
, puede eliminar todos sus archivos, porque en lugar de ejecutar lo esperado/bin/rm
, ejecutarárm
desde el directorio actual, por lo que probablemente no sea lo que deseaba.Como nota al margen, este es un problema conocido en Travis CI ( GH # 2811 ) cuando falla con el error:
Entonces, la solución es eliminar la entrada afectada de la variable PATH, por ejemplo
según lo propuesto por drogus . El progreso de este error se puede seguir en GH # 4862 .
Aquí está la solución alternativa de la versión Bash:
Ejemplo de uso (paso filtrado
PATH
a comando específico):fuente
sed
que parece eliminar todo lo quefind
no le gusta: askubuntu.com/questions/621132/…xargs
ybash -c cd
soluciónEsta bien me rindo:
sed
solución alternaUn poco menos agradable que la solución anterior:
Un caso de prueba:
Para
rename
concreto, también se puede evitar con un poco de Perl expresiones regulares-fu: /programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971RTFS esperanza aplastante
Para aquellos que tienen la esperanza de que exista una forma de ignorar
find
la opinión de los demás, permítanme aclararlo con alguna fuente:A partir de eso, vemos que parece que no hay forma de desactivar la comprobación de ruta.
La regla exacta que verifica es: falla si
PATH
está vacío o no comienza/
.fuente