¿Es seguro pasar datos confidenciales a través del entorno de proceso?

34

Recientemente he estado buscando la posibilidad de pasar información confidencial de un proceso a otro (en el momento del inicio del proceso) sin pasarla a través de la línea de comandos o sin usar una entrada del sistema de archivos. Esto en Linux, pero las preguntas también se aplican a otros sistemas.

En particular, la contraseña para acceder a un servidor MySQL pasará de un script al cliente MySQL. Para hacerlo, puede pasarlo por la línea de comando ( -pPASSWORD ), pero esto es desagradable, ya que un simple proceso de proceso revelará la contraseña a todos los interesados. En este caso preciso, el programa cliente de MySQL es lo suficientemente amigable como para sobrescribir el texto de la línea de comandos, reemplazando la cadena de contraseña visible por XXX pero esta es una solución maloliente.

Pensé en usar el entorno de proceso en su lugar. El script establece la contraseña en el entorno de proceso, el subproceso iniciado puede leerlo desde allí. De hecho, el cliente MySQL lo permite y busca la variable de entorno MYSQL_PWD . Esto parece bastante seguro y también elegante, ya que un entorno de proceso no puede ser consultado por nadie más que por root y el propietario del proceso, al menos por lo que sé.

Sin embargo, el manual MySQL 5.1 indica:

  

Este método para especificar su contraseña de MySQL [a través del entorno] debe considerarse extremadamente inseguro y no debe utilizarse. Algunas versiones de ps incluyen una opción para mostrar el entorno de los procesos en ejecución. En algunos sistemas, si establece MYSQL_PWD , su contraseña estará expuesta a cualquier otro usuario que ejecute ps. Incluso en sistemas sin una versión de ps , no es prudente suponer que no hay otros métodos por los cuales los usuarios puedan examinar los entornos de proceso ".

La pregunta entonces es: ¿Es realmente inseguro pasar datos confidenciales a través del entorno de proceso? ¿Existen sistemas que permitan consultar el entorno de otro proceso sin verificación de permisos? Claramente, el superusuario puede agarrar la contraseña a voluntad, pero nuevamente, no la necesita en primer lugar.

    
pregunta David Tonhofer 22.07.2012 - 17:15
fuente

3 respuestas

19

Para responder a mi propia pregunta:

Parece que algunos sistemas son, o más bien eran realmente inseguros, filtrando información del entorno a otros procesos.

Un problema similar al presente se plantea en github por el usuario 'mitchblank' para la aplicación 'mosh' (shell móvil). El autor escribe:

  

Fondo: en la imagen de proceso, argv [] y envp [] se almacenan de la misma manera, uno junto al otro. En "clásico" UNIXes / usr / bin / ps se configuraba normalmente como "kmem" (o grupo similar), lo que le permitía excavar en / dev / kmem para leer información sobre los procesos activos. Esto incluía la capacidad de leer los argumentos del proceso Y el entorno, de todos los usuarios en el sistema.

     

En estos días, estos 'hacks privilegiados de ps' están detrás de nosotros: todos los sistemas UNIX tienen diferentes formas de consultar dicha información (/ proc en Linux, etc.) Creo que todos (?) de estos solo consideran el entorno de un proceso Para ser legible por su uid. Por lo tanto, los datos sensibles a la seguridad como las contraseñas en el entorno no se filtran. Sin embargo, las viejas formas no están 100% muertas. A modo de ejemplo, aquí hay un ejemplo de una máquina AIX 5.2 a la que tengo acceso ... "

     

....

     

Hoy en día, parece que Mosh solo está en Linux / OSX / FreeBSD, pero si se pone en práctica, me temo que terminará en alguna plataforma que aún usa el modelo UNIX de la vieja escuela "todo el mundo puede ver las variables de entorno de cualquiera".

No he podido confirmar la existencia de ningún sistema que permitiera filtrar las variables del entorno (un trabajo para historiadores y personas que tienen acceso a instalaciones antiguas).

Mirar a su alrededor muestra que en el año 2000, las variables de entorno se consideraron sensibles, es decir, los posibles problemas se habrían marcado, consulte Vulnerabilidad CERT 22404 . De hecho, la debilidad de AIX 5.2 mencionada anteriormente fue un error (desde que se corrigió. Desafortunadamente, no hay información detallada sobre esto en Internet, por lo que puedo encontrar aparte de esto boletín técnico de IBM )

CERT y El foro de RIESGOS no proporciona nada sobre las variables de entorno que se implementan de manera insegura o que se explotan en cualquier momento.

No estoy seguro de si otros programas transmiten datos confidenciales (GPG no lo hace), pero la advertencia del manual de MySQL parece ser excesiva.

    
respondido por el David Tonhofer 17.09.2012 - 12:12
fuente
4
user@example(pts/1)$ cd /proc/1022 
user@example(pts/1)$ ls -lha environ 
-r-------- 1 root root 0 Jul 22 17:20 environ

Entonces, en Linux es seguro. Puede que no sea seguro en otros sistemas operativos similares a UNIX ...

A menos que no pueda confiar en root , pero todas las apuestas están desactivadas.

    
respondido por el Hubert Kario 22.07.2012 - 17:23
fuente
3

La antigua sabiduría convencional solía ser: No, el medio ambiente no es seguro. No pasar secretos a través del medio ambiente.

No sé si la antigua sabiduría convencional todavía es aplicable. Al menos en las últimas versiones de Linux, parece que ya no es posible que un proceso vea el entorno de otro proceso (si son propiedad de diferentes usuarios). Sin embargo, no sé qué hacen otros sistemas operativos. Yo estaría bastante informado acerca de pasar secretos a través del medio ambiente; No suena como el tipo de cosas que estoy seguro de que todos los sistemas operativos protegerán.

Una solución más segura: configure una tubería (si los dos procesos tienen algún tipo de relación hijo-padre), o use comunicación entre procesos (IPC), o guárdela en un archivo privado que nadie más pueda leer. La mejor solución probablemente dependerá de sus circunstancias. Si está escribiendo un código de aplicación, puede considerar uno de los dos primeros mecanismos. Si está escribiendo un script de shell, lo más simple es probablemente almacenarlo en un archivo privado cuyos permisos estén configurados para asegurarse de que nadie más pueda leerlo. Al menos eso es lo que haría, aunque siempre es posible que sea demasiado conservador.

Por supuesto, si está escribiendo un script que solo necesita trabajar en un solo sistema, puede probar ese sistema para ver si alguien más puede ver el entorno. Pero si está escribiendo un código general para un uso generalizado, me inclino por las soluciones del párrafo anterior en lugar de pasar secretos a través del medio ambiente, aunque admito que no puedo apuntar a ningún sistema moderno en el que el uso del medio ambiente sea peligroso. .

    
respondido por el D.W. 18.09.2012 - 07:58
fuente

Lea otras preguntas en las etiquetas