Respuesta

6

Las líneas de comando siempre estarán visibles (aunque solo a través de/proc).

Así que la única solución real es: no lo haga. Es posible suministrar en la entrada estándar, o una fd dedicado:

./my_secured_process some parameters 3<<< "[email protected]" 

con un guión como (simplicidad primero)

#!/bin/bash 
cat 0<&3 

(esta muestra acaba de volcar una contraseña incorrecta en la salida estándar)

ahora todo lo que necesita es preocuparse por:

  • MITM (guiones que imitan aleros abandonan la contraseña, por ejemplo, por subvertir PATH)
  • historia fiesta de retener su contraseña en la línea de comandos (mira HISTIGNORE de fiesta, por ejemplo)
  • la seguridad de la secuencia de comandos que contiene la contraseña de redirección
  • seguridad del TTY de utilizar; keyloggers; ... como se puede ver, ahora hemos descendido a
+0

¿Está el 3 por encima de un error tipográfico? ¿Debería ser << q0rban

+0

Ok, creo que lo entiendo. Ese es el numero del argumento? Creo que se supone que es un 2, no un 3. El primer argumento sería 0, el segundo 1, el tercero 2. ¿Es eso correcto? – q0rban

+1

No. '<<<' significa: transmitir este texto a stdin. '3 <<<' significa: transmitir este texto a _filedescriptor 3_. Como puede ver con el script de demostración, puede leer 'fd 3' desde el script. Esta es la seguridad por oscuridad porque stdin/stdout/stderr son los únicos descriptores de archivos de canal de shell _standard_ (habituales). – sehe

0

La única forma de 'principios generales de seguridad' para escapar de ser mostrado en la lista es el proceso si reimplementar toda la funcionalidad del programa que desea para llamar en funciones puras de Bash. Las llamadas a funciones no son procesos separados. Usualmente esto no es factible.

3

El programa llamado puede cambiar su línea de comandos simplemente sobrescribir argv así:

#include <stdlib.h> 
#include <string.h> 

int main(int argc, char** argv) { 
    int arglen = argv[argc-1]+strlen(argv[argc-1])+1 - argv[0]; 
    memset(argv[0], arglen, 0); 
    strncpy(argv[0], "secret-program", arglen-1); 
    sleep(100); 
} 

Pruebas:

$ ./a.out mySuperPassword & 
$ ps -f 
UID  PID PPID C STIME TTY   TIME CMD 
me  20398 18872 0 11:26 pts/3 00:00:00 bash 
me  20633 20398 0 11:34 pts/3 00:00:00 secret-program 
me  20645 20398 0 11:34 pts/3 00:00:00 ps -f 
$ 

UPD: Lo sé, no es completamente segura y puede causar condiciones de carrera , pero muchos programas que aceptan contraseñas desde la línea de comandos hacen este truco.

3

¿Cómo sobre el uso de un enfoque de descriptor de archivo:

env -i bash --norc # clean up environment 
set +o history 
read -s -p "Enter your password: " passwd 
exec 3<<<"$passwd" 
mycommand <&3 # cat /dev/stdin in mycommand 

Ver:

Hiding secret from command line parameter on Unix

Cuestiones relacionadas