Cuando se ejecutan scripts de shell, ¿es más seguro pasar información confidencial usando stdin o como una opción de cadena?

4

Estoy creando una serie de scripts automatizados que se ejecutarán dentro de un entorno cifrado (cifrado completo del disco).

Muchos comandos tanto en Windows como en * nix tienen dos maneras de ingresar información confidencial, como contraseñas. En un modo, el programa solicita al usuario la contraseña y, en el otro, la contraseña se especifica mediante un argumento de opción.

Al escribir un script de shell, el comando se puede automatizar usando cualquiera de estos procesos. En el primer caso, el comando se ejecuta, luego se redirige el estándar in (stdin) y la contraseña se ingresa en el programa cuando se solicita. En el segundo caso, la contraseña se especifica como un argumento para el programa.

¿Es uno de estos inherentemente más riesgoso que el otro? ¿Hay alguna compensación a tener en cuenta? En cualquier caso, estoy preguntando específicamente sobre el método para suministrar la contraseña, no sobre el riesgo o la vulnerabilidad asociada con el almacenamiento de la contraseña en el disco.

Aquí hay un ejemplo en Python, usando la versión CLI de VeraCrypt:

Redireccionando la entrada estándar:

cmd = ['veracrypt', "--text", partition, mount_point]
input_file = open_file()
vc_call = subprocess.run(cmd, stdin=input_file)
vc_call.wait()


Pasando la contraseña como argumento:

password = get_password_from_file():
cmd = ['veracrypt', "--text", "--non-interactive", "--password", password, partition, mount_point]
vc_call = subprocess.run(cmd)

nota:

No estoy seguro de si es importante, pero en * nix, los comandos se pueden ejecutar directamente como llamadas al sistema. En el código anterior, ninguna de las llamadas a subprocess.run() recibió una opción shell=True , lo que provocaría que el comando se ejecutara dentro del shell predeterminado. Mi entendimiento es que en Windows, todos los comandos deben ejecutarse a través del shell cmd . Esto podría hacer una diferencia entre las dos opciones, pero no estoy seguro de cómo.

    
pregunta BrianHVB 21.07.2018 - 06:28
fuente

2 respuestas

6

Pasarlo mediante stdin es más seguro, ya que los argumentos son visibles en el árbol de procesos.

Normalmente, pasar un valor secreto como argumento es más riesgoso. Cada vez que se pasa algo como un argumento, todos los demás procesos que se ejecutan bajo el mismo usuario (y, a veces, todos los procesos y períodos de otros usuarios) podrán ver los argumentos de cada proceso. Es por esto que puedes ver los argumentos ejecutando ps aux . Al pasar un valor a través de stdin, por otro lado, lo envía a través de un descriptor de archivos. Este descriptor no será legible por procesos no privilegiados. Si su modelo de amenaza involucra otros procesos locales maliciosos, debe enviar el material confidencial a través de la entrada estándar.

Pasar datos a través de la entrada estándar implica pasarlos a través de un descriptor de archivos que el programa puede leer usando llamadas de IO estándar. En este caso, será tan seguro como abrir un archivo para leerlo. Los argumentos de la línea de comando, por otro lado, se mantienen en un proceso ' argv en la memoria. Un programa simplemente tiene que acceder a esa dirección de memoria para ver los argumentos. Sin embargo, esta información es visible para otros usuarios a través de ese proceso ' /proc/<pid>/cmdline . En realidad, este es también el caso de las variables de entorno en algunos sistemas (especialmente en los sistemas antiguos * nix), por lo que pasar secretos a través del entorno tampoco es necesariamente una buena idea.

    
respondido por el forest 21.07.2018 - 10:18
fuente
4

En los sistemas similares a Unix, los argumentos de la línea de comandos pueden filtrarse de varias maneras. Generalmente son visibles para otros procesos, incluso procesos que no se ejecutan como el mismo usuario. (Algunas variantes de Unix, por ejemplo, ciertas configuraciones de Linux reforzadas, pueden ocultar los argumentos de la línea de comandos a otros usuarios). Pueden almacenarse en los registros de auditoría.

No estoy seguro de Windows, pero los riesgos son casi los mismos.

El paso de la información a través de una tubería (para que el proceso la reciba en una entrada estándar) no se filtrará fuera del proceso de envío y recepción a menos que tome medidas especiales como ejecutar su script en un depurador.

Dada la opción, hay un orden muy claro de disminución de los riesgos de fuga de datos: las tuberías son seguras, las variables de entorno generalmente son seguras si el subproceso no genera otros subprocesos, los argumentos de la línea de comandos no deben considerarse como confidenciales.

    
respondido por el Gilles 21.07.2018 - 10:18
fuente

Lea otras preguntas en las etiquetas