Del manual de findutils:
Por ejemplo construcciones como estos dos comandos
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;son muy peligrosos La razón de esto es que el '{}' se expande a un nombre de archivo que puede contener un punto y coma u otros caracteres especiales para el shell. Si, por ejemplo, alguien crea el archivo
/tmp/foo; rm -rf $HOME, los dos comandos anteriores podrían eliminar el directorio de inicio de alguien.Por esta razón, no ejecute ningún comando que pasará datos no confiables (como los nombres de archivos) a comandos que interpreten argumentos como comandos para ser interpretados más a fondo (por ejemplo, 'sh').
En el caso del shell, hay una solución inteligente para este problema:
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;No se garantiza que este enfoque evite todos los problemas, pero es mucho más seguro que sustituir los datos de la elección de un atacante en el texto de un comando de shell.
- ¿La causa del problema es
find -exec sh -c "something {}" \;que el reemplazo de{}no está entre comillas y, por lo tanto, no se trata como una sola cadena? En la solución
find -exec sh -c 'something "$@"' sh {} \;,primero
{}se reemplaza, pero como{}no se cita, ¿no"$@"tiene el mismo problema que el comando original? Por ejemplo,"$@"se ampliará a"/tmp/foo;","rm","-rf", y"$HOME"?¿Por qué
{}no se escapa o se cita?
- ¿Podría dar otros ejemplos (aún con
sh -co sin él si corresponde; con o sin losfindcuales pueden no ser necesarios) en los que se aplica el mismo tipo de problema y solución, y que son ejemplos mínimos para que podamos centrarnos en el problema y la solución con poca distracción posible? Consulte Formas de proporcionar argumentos a un comando ejecutado por `bash -c`
Gracias.