Estoy escribiendo una colección de utilidades en bash
que tiene una biblioteca común. Cada secuencia de comandos que escribo debe tener un bloque de código que determine la ruta de acceso de la biblioteca en relación con el ejecutable. No es el código real, sino un ejemplo:¿Puedo confiar en las variables de mi entorno?
#!/bin/bash
DIR="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
. $DIR/../lib/utilities/functions
En lugar de un preámbulo que trata de buscar la biblioteca, tuve la brillante idea de utilizar una variable de entorno para indicar la ubicación bibliotecas.
#!/bin/bash
. $TOOLS_LIBRARY_PATH
Podría utilizar un programa de envoltura para establecer esa variable de entorno, o podría establecerlo en mi propio camino. Puede haber mejores formas de organizar un conjunto de herramientas bash
, pero la pregunta es:
¿Puedo confiar en las variables de mi entorno?
Esta es una de esas preguntas que nunca he pensado realmente acerca de eso. Cuando se programa en otros idiomas, las rutas se usan para buscar bibliotecas (por ejemplo, LD_LIBRARY_PATH
, PYTHONPATH
, PERLLIB
, RUBYLIB
, CLASSPATH
, NODE_PATH
), pero nunca he tenido que detenerme y pensar en cómo podría ser inseguro.
De hecho, LD_LIBRARY_PATH
tiene Why LD_LIBRARY_PATH
is bad para desalentar su uso. Las variables de entorno de ruta de biblioteca de Ruby y Perl se ignoran si se invocan sus mecanismos de seguridad, $SAFE
y -T
(taint mode), respectivamente.
Mis pensamientos hasta ahora ...
- El usuario puede configurar
TOOLS_PATH_LIBRARY
a una biblioteca de su elección, pero la utilidad se ejecutará bajo su UID. Simplemente podrían ejecutar su biblioteca maliciosa directamente conbash
. - Mis herramientas
sudo
algunas cosas. Alguien podría establecer suTOOLS_PATH_LIBRARY
a algo que aproveche esto. Pero las herramientas no se ejecutan a través delsudo
, solo invocansudo
aquí y allá. El usuario debería ser unsudoer
en cualquier caso, simplemente podría llamar alsudo
directamente. - Si no puedo confiar en
TOOLS_PATH_LIBRARY
, entonces no puedo confiar enPATH
. Todas las invocaciones de programa deben usar rutas absolutas. - He visto programas shell que usan alias para programas que son absolutos, de modo que en lugar de llamar a
ls
, use una variable, comoLS=/bin/ls
. Según lo que he leído, esto es para proteger a los usuarios de la redefinición de los valores predeterminados del programa como alias. Ver: PATH, functions and security. Bash scripting best practices. . - Perl's taint mode trata todas las variables de entorno como "contaminadas", lo cual es un presentimiento, por lo que estoy tratando de razonar sobre los riesgos del medio ambiente.
- No es posible que un usuario cambie el entorno de otro, a menos que ese usuario sea root. Por lo tanto, solo me preocupa que un usuario cambie su propio entorno para escalar privilegios. Veo: Is there a way to change another process's environment variables?
he rubber ducked esto en una respuesta de tipo, pero todavía voy a publicarlo, ya que no es una respuesta fácil.
Actualización: ¿Cuáles son los problemas de seguridad que rodean el uso de variables de entorno para especificar rutas a bibliotecas y ejecutables?
Por supuesto que no se puede. No puedes confiar en nada, nunca. Pero si no asumes que es correcto, ¿dónde estás? No puedes hacer nada. –
Si puede resolver todos los directorios sin variables adicionales, hágala así, sea amable con sus usuarios directos. Pero también deje la puerta trasera en forma de variable de entorno para ser amable con los que se van a integrar con su biblioteca.Supongamos que las variables están configuradas correctamente (vea el comentario de Chris Morgan para "por qué"). – bobah
Bonita publicación, has identificado muchos problemas. Interesante, pero parece que estás al borde de la parálisis del análisis (como dice Chris). La seguridad se trata de capas, ¿verdad? Si no puede confiar en sus usuarios, necesita más capas para evitar que le disparen en el pie. Las personas pueden obtener un doctorado en cuestiones de seguridad, y aún así obtener su MilSpec o sistemas de seguridad bancaria ser pirateados, por lo que tendrá que averiguar dónde se compensa el tiempo transcurrido entre la preparación de un archivo adjunto frente a la probabilidad de éxito es adjuntar para su proyecto actual, sus usuarios legítimos y otras partes interesadas. Buena suerte. – shellter