Desde la find
página del manual :
-exec command ; There are unavoidable security problems surrounding use of the -exec action; you should use the -execdir option instead. -execdir command {} + Like -exec, but the specified command is run from the subdirectory containing the matched file, which is not normally the directory in which you started find. This a much more secure method for invoking commands, as it avoids race conditions during resolution of the paths to the matched files.
¿Qué significa esto? ¿Por qué hay condiciones de carrera al ejecutarlo desde el directorio inicial? ¿Y cómo son estos riesgos de seguridad?
Respuestas:
Encontré los detalles aquí :
No estoy seguro de la probabilidad de que alguien pueda explotar esto; pero supongo que ahí está la respuesta!
fuente
execdir
primero sería chdir a/tmp/umsp
antes de ejecutar el comando, y por lo tanto, en teoría, un atacante volver a vincular el directorio no tendría ningún efecto ... si la vinculación se produce después de encontrar "decide" evaluar-exec
pero antes de que elrm
comando pueda hacer su trabajo. Pero me pregunto por qué esto marcaría la diferencia: el atacante podría simplemente volver a vincular después de que el usuario haya decidido escribir elfind
comando./tmp/umsp
es un directorio cuando lofind
ve, pero cuando serm
ejecuta, el atacado lo ha cambiado a un enlace simbólico/etc
./tmp/umsp/passwd
es un archivo regular todo el tiempo, pero no el mismo.Creo que la razón por la cual
-exec
es peligroso es porque si el usuario no especificara el nombre completo y la ruta al programa que se ejecutará, potencialmente ejecutaría el programa incorrecto.Ejemplo:
En
/some/path
, alguien hizo otrocoolprogram
, y carga todos tus datos a algún mal actor.Pero espera, dices, ¿no tienes que ejecutarlo como
./coolprogram
? Sí, pero algunas personas síPATH=.:/bin:whatever
, que ejecutarán el programa en el directorio actual.Esto probablemente se simplifica, pero creo que podría ser peligroso en algunos casos. Tuve que solucionar un problema una vez donde un byte cero
cpio
terminó en el directorio incorrecto. Causó un bloqueo del programa porquecpio
no funcionaba ya que ejecutaba el archivo de cero bytes en el directorio.fuente
find -exec
. Si ha puesto.
en su camino, simplemente ejecutarcoolprogram
en su directorio actual ya es peligroso, ¡ya sea que lofind
haga o no!The ‘-execdir’ action refuses to do anything if the current directory is included in the $PATH environment variable. This is necessary because ‘-execdir’ runs programs in the same directory in which it finds files – in general, such a directory might be writable by untrusted users. For similar reasons, ‘-execdir’ does not allow ‘{}’ to appear in the name of the command to be run.
.
en la ruta y{}
en el comando. ¡Quizás en el futuro Linux prohibirá.
completamente el camino y las herramientas no necesitarán implementar sus propios controles de seguridad! :)