Prozessargumente sind für alle Benutzer sichtbar, aber die Umgebung ist nur für denselben Benutzer sichtbar ( zumindest unter Linux , und ich denke bei jeder modernen Unix-Variante). Die Weitergabe eines Kennworts über eine Umgebungsvariable ist daher sicher. Wenn jemand Ihre Umgebungsvariablen lesen kann, kann er Prozesse wie Sie ausführen, sodass das Spiel bereits zu Ende ist.
Es besteht die Gefahr, dass der Inhalt der Umgebung indirekt verloren geht, wenn Sie beispielsweise ps
eine Untersuchung durchführen und versehentlich das Ergebnis einschließlich vertraulicher Umgebungsvariablen an einem öffentlichen Ort kopieren und einfügen. Ein weiteres Risiko besteht darin, dass Sie die Umgebungsvariable an ein Programm übergeben, das sie nicht benötigt (einschließlich untergeordneter Elemente des Prozesses, für den das Kennwort erforderlich ist), und dass das Programm seine Umgebungsvariablen offenlegt, weil es nicht erwartet hat, dass sie vertraulich sind. Wie hoch diese Risiken für sekundäre Leckagen sind, hängt davon ab, was der Prozess mit dem Kennwort bewirkt (wie lange wird er ausgeführt? Werden Unterprozesse ausgeführt?).
Es ist einfacher sicherzustellen, dass das Kennwort nicht versehentlich durchgesickert ist, indem es durch einen Kanal geleitet wird, der nicht zum Abhören vorgesehen ist, z. B. eine Pipe. Dies ist auf der Senderseite ziemlich einfach zu bewerkstelligen. Wenn Sie beispielsweise das Kennwort in einer Shell-Variablen haben, können Sie dies einfach tun
echo "$password" | theprogram
if theprogram
erwartet das Passwort bei seiner Standardeingabe. Beachten Sie, dass dies sicher ist, da echo
es sich um eine integrierte Funktion handelt. Mit einem externen Befehl wäre dies nicht sicher, da das Argument in der ps
Ausgabe verfügbar gemacht würde . Ein anderer Weg, um den gleichen Effekt zu erzielen, ist mit einem Here-Dokument:
theprogram <<EOF
$password
EOF
Einige Programme, die ein Kennwort benötigen, können angewiesen werden, es aus einem bestimmten Dateideskriptor zu lesen. Sie können einen anderen Dateideskriptor als die Standardeingabe verwenden, wenn Sie die Standardeingabe für etwas anderes benötigen. Zum Beispiel mit gpg
:
get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP
Wenn das Programm nicht angewiesen werden kann, aus einem Dateideskriptor zu lesen, sondern aus einer Datei, können Sie es anweisen, aus einem Dateideskriptor zu lesen, indem Sie einen Dateinamen wie `/ dev / fd / 3 verwenden.
theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF
In ksh, bash oder zsh können Sie dies durch Prozessersetzung präziser ausführen.
theprogram --password-from-file=<(echo "$password")