¿Cuáles son los problemas de seguridad y las condiciones de carrera al usar `find -exec`?

14

Desde la findpá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?

Danny Tuppeny
fuente
Relacionado: ¿Por qué es un mal bucle sobre la salida de find una mala práctica? donde eso está cubierto en algunas de las respuestas.
Stéphane Chazelas

Respuestas:

13

Encontré los detalles aquí :

La -execacción hace que se ejecute otro programa. Transmite al programa el nombre del archivo que se está considerando en ese momento. El programa invocado normalmente realizará alguna acción en ese archivo. Una vez más, hay una condición de carrera que puede explotarse aquí. Tomaremos como ejemplo específico el comando

 find /tmp -path /tmp/umsp/passwd -exec /bin/rm

En este simple ejemplo, estamos identificando solo un archivo para eliminar e invocando /bin/rmpara eliminarlo. Existe un problema porque hay un intervalo de tiempo entre el punto donde find decide que necesita procesar la -execacción y el punto donde el /bin/rmcomando realmente emite la llamada al sistema unlink () para eliminar el archivo del sistema de archivos. Dentro de este período de tiempo, un atacante puede cambiar el nombre del /tmp/umsp directorio, reemplazándolo con un enlace simbólico a /etc. No hay forma de /bin/rmdeterminar si está funcionando en el mismo archivo que find tenía en mente. Una vez que el enlace simbólico está en su lugar, el atacante ha persuadido a find para causar la eliminación del /etc/passwdarchivo, que no es el efecto previsto por el comando que realmente se invocó.

No estoy seguro de la probabilidad de que alguien pueda explotar esto; pero supongo que ahí está la respuesta!

Danny Tuppeny
fuente
En el caso anterior, execdirprimero sería chdir a /tmp/umspantes 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 -execpero antes de que el rmcomando 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 el findcomando.
Oteo
1
@RuiFRibeiro El enlace no es el argumento que se pasa al comando, es un directorio intermedio. /tmp/umspes un directorio cuando lo findve, pero cuando se rmejecuta, el atacado lo ha cambiado a un enlace simbólico /etc. /tmp/umsp/passwdes un archivo regular todo el tiempo, pero no el mismo.
Gilles 'SO- deja de ser malvado'
2

Creo que la razón por la cual -execes 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:

find /some/path -exec coolprogram

En /some/path, alguien hizo otro coolprogram, 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 cpioterminó en el directorio incorrecto. Causó un bloqueo del programa porque cpiono funcionaba ya que ejecutaba el archivo de cero bytes en el directorio.

Doug
fuente
3
Estos riesgos no están aislados find -exec. Si ha puesto .en su camino, simplemente ejecutar coolprogramen su directorio actual ya es peligroso, ¡ya sea que lo findhaga o no!
Danny Tuppeny el
1
De acuerdo, pero parece que -execdir observa la condición que mencioné también: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.
Doug
Supongo que la moraleja de la historia es que tener. en tu camino también es una mala idea, por eso me aseguro de que no esté allí.
Doug
Interesante saber acerca de no permitir .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! :)
Danny Tuppeny
1
Creo que el 90% del código que escribo es solo para atrapar el 5% de las cosas que salen mal. :)
Doug