Gli argomenti di processo sono visibili a tutti gli utenti, ma l'ambiente è visibile solo allo stesso utente ( almeno su Linux , e penso a ogni moderna variante unix). Quindi passare una password attraverso una variabile d'ambiente è sicuro. Se qualcuno può leggere le variabili di ambiente, può eseguire i processi come te, quindi il gioco è già finito.
Il contenuto dell'ambiente è a rischio di perdite indirette, ad esempio se si esegue ps
per indagare su qualcosa e si copia e si incolla accidentalmente il risultato, comprese le variabili di ambiente riservate in un luogo pubblico. Un altro rischio è che si passa la variabile di ambiente a un programma che non ne ha bisogno (compresi i figli del processo che richiede la password) e che il programma espone le sue variabili di ambiente perché non si aspettava che fossero riservate. Quanto sono gravi questi rischi di perdite secondarie dipende da cosa fa il processo con la password (per quanto tempo dura? Esegue sottoprocessi?).
È più facile garantire che la password non perda accidentalmente passandola attraverso un canale che non è progettato per essere intercettato, come una pipe. Questo è abbastanza facile da fare sul lato invio. Ad esempio, se hai la password in una variabile di shell, puoi semplicemente farlo
echo "$password" | theprogram
se si theprogram
aspetta la password per il suo input standard. Si noti che questo è sicuro perché echo
è incorporato; non sarebbe sicuro con un comando esterno poiché l'argomento verrebbe esposto in ps
output. Un altro modo per ottenere lo stesso effetto è con un documento qui:
theprogram <<EOF
$password
EOF
Ad alcuni programmi che richiedono una password può essere detto di leggerlo da un descrittore di file specifico. È possibile utilizzare un descrittore di file diverso dall'input standard se è necessario l'input standard per qualcos'altro. Ad esempio, con gpg
:
get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP
Se non si può dire al programma di leggere da un descrittore di file ma si può dire di leggere da un file, si può dire di leggere da un descrittore di file usando un nome di file come `/ dev / fd / 3.
theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF
In ksh, bash o zsh, puoi farlo in modo più conciso attraverso la sostituzione del processo.
theprogram --password-from-file=<(echo "$password")