Pase la contraseña a GPG a través de un script

2

Bueno, quizás primero un poco de contexto:

Utilizo un archivo cifrado PGP (GPG) para guardar mis contraseñas. Uso un script (guión), vinculado a una combinación de teclas, para completar los nombres de usuario y las contraseñas en las aplicaciones / sitios web. También tengo un par de claves PGP para correo electrónico.

No me gusta tener que ingresar mi contraseña compleja para descifrar todos los correos electrónicos cada vez. Afortunadamente gpg2 resuelve esto almacenando la contraseña con gpg-agent. Sin embargo, no me gusta este comportamiento cuando se trata de mi archivo de contraseña. No quiero que sea descifrado por la misma cantidad de tiempo que mis correos electrónicos ...

Por lo que sé, no puede establecer diferentes tiempos de espera para diferentes teclas, por lo que se me ocurrió la siguiente solución:

Para descifrar mi archivo de contraseña, usaría esta línea en mi script "auto-type":

store="$(gpg -q --batch --passphrase 'dmenu -P' -d /path/to/file)"

(La opción -P para dmenu se agrega con un parche. No muestra lo que escribes. El archivo de mi contraseña se cifraría simétricamente)

De esta manera, gpg-agent se elude y la contraseña debe proporcionarse cada vez.

Mi pregunta es: ¿Esto pondría en peligro mi contraseña? ¿Es esto menos seguro que darle a gpg la contraseña a gpg-agent?

También, como puede ver, almaceno el texto descifrado en una variable local. ¿Qué tan inseguro es esto? El script se cierra después de escribir (o no escribir) la información solicitada y tengo esta trampa al principio del script:

finish () {
    unset store
    unset passw
}

trap finish EXIT
    
pregunta voyager 18.01.2018 - 23:20
fuente

2 respuestas

0

La mejor manera de hacerlo es utilizando un descriptor de archivo. De la página del manual:

--passphrase-fd n
Read the passphrase from file descriptor n. If you use 0 for n, the passphrase 
will be read from stdin. This can only be used if only one passphrase is 
supplied. Don't use this option if you can avoid it.

De esta manera, puede estar seguro de que no está visible en la línea de comandos o el entorno (que también puede leerse a través de / proc mediante otros procesos).

    
respondido por el allo 19.01.2018 - 15:21
fuente
2

Esto depende de tu modelo de amenaza. Si un atacante puede obtener una lista de procesos ( ps ) en su máquina en el momento adecuado, verá que la contraseña sustituida se pasa a GPG. Esto está disponible para un usuario normal, por lo que también está disponible para cualquier malware en su sistema, incluso ejecutándose como un usuario diferente.

Puedes ver esto creando un FIFO para la entrada (para que se bloquee) y ejecutando ps aux después de iniciar GPG. Por ejemplo:

% mkfifo io
% gpg -q --batch --passphrase 'echo supersecret' -d io &
% ps -ef | grep gpg
david    23136 22440  0 19:11 pts/4    00:00:00 gpg -q --batch --passphrase supersecret -d ./io

Puede ver que supersecret aparece en la salida de ps , tal como lo sería su salida de dmenu -P .

Debería considerar el uso de --passphrase-file con la redirección a través de una canalización con nombre, como:

gpg --passphrase-file <(dmenu -P)

Esto transferirá la frase de contraseña a través de una tubería, en lugar de un argumento de línea de comandos, ocultándolo de cualquier atacante capaz de leer la lista de procesos.

Además, los datos almacenados se dejarán en la memoria (física) cuando salga la secuencia de comandos del guión, ya sea que desactive o no la variable. (Unset simplemente elimina la referencia a la variable). Existe una alta probabilidad de que si alguien tomara físicamente su máquina y pudiera volcar la memoria, la memoria forense llevara a la extracción de algunas o todas sus contraseñas. No tengo conocimiento de ningún shell o herramienta para mitigar este riesgo. (También existe el riesgo de que se almacene en intercambio, si utiliza el intercambio. Considere el intercambio cifrado efímero para mitigar esta preocupación).

    
respondido por el David 19.01.2018 - 01:21
fuente

Lea otras preguntas en las etiquetas