Ich führe einen Software-Daemon aus, der für bestimmte Aktionen die Eingabe einer Passphrase erfordert, um einige Funktionen freizuschalten, die beispielsweise so aussehen:
$ darkcoind masternode start <mypassphrase>
Jetzt habe ich einige Sicherheitsbedenken auf meinem headless Debian-Server.
Wann immer ich zum Beispiel meine Bash-Historie mit durchsuche, Ctrl+R
kann ich dieses superstarke Passwort sehen. Jetzt stelle ich mir vor, mein Server ist kompromittiert und ein Eindringling hat Shell-Zugriff und kann einfach Ctrl+R
meine Passphrase im Verlauf finden.
Gibt es eine Möglichkeit das Passwort eingeben , ohne es in der Bash Geschichte gezeigt werden, ps
, /proc
oder anderswo?
Update 1 : Wenn Sie dem Dämon kein Kennwort übergeben, wird ein Fehler ausgegeben. Dies ist keine Option.
Update 2 : Sagen Sie mir nicht, dass ich die Software oder andere hilfreiche Hinweise wie das Aufhängen der Entwickler löschen soll. Ich weiß, dass dies kein Best-Practice-Beispiel ist, aber diese Software basiert auf Bitcoin und alle Bitcoin-basierten Clients sind eine Art von JSON-RPC-Server, der diese Befehle abhört. Ein bekanntes Sicherheitsproblem wird noch diskutiert ( a , b , c ) .
Update 3 : Der Daemon ist bereits gestartet und wird mit dem Befehl ausgeführt
$ darkcoind -daemon
Dabei ps
wird nur der Startbefehl angezeigt.
$ ps aux | grep darkcoin
user 12337 0.0 0.0 10916 1084 pts/4 S+ 09:19 0:00 grep darkcoin
user 21626 0.6 0.3 1849716 130292 ? SLl May02 6:48 darkcoind -daemon
Das Übergeben der Befehle mit der Passphrase wird daher in ps
oder überhaupt nicht angezeigt /proc
.
$ darkcoind masternode start <mypassphrase>
$ ps aux | grep darkcoin
user 12929 0.0 0.0 10916 1088 pts/4 S+ 09:23 0:00 grep darkcoin
user 21626 0.6 0.3 1849716 130292 ? SLl May02 6:49 darkcoind -daemon
Dies lässt die Frage offen, wo die Geschichte auftaucht. Nur in .bash_history
?
quelle
Antworten:
Eigentlich sollte dies in der Anwendung selbst behoben werden. Und solche Anwendungen sollten Open Source sein, so dass das Beheben des Problems in der App selbst eine Option sein sollte. Eine sicherheitsrelevante Anwendung, die solche Fehler macht, kann auch andere Fehler machen, daher würde ich ihr nicht vertrauen.
Einfacher Interposer
Aber Sie haben nach einem anderen Weg gefragt, also ist hier einer:
Kompilieren Sie dies mit
dann starte deinen Prozess mit
Die Interposer-Bibliothek führt diesen Code aus, bevor die
main
Funktion aus Ihrer Anwendung ausgeführt wird. Es ersetzt das letzte Befehlszeilenargument durch das tatsächliche Kennwort im Aufruf von main. Die Befehlszeile, wie sie in/proc/*/cmdline
(und daher von Tools wieps
) gedruckt wird, enthält jedoch weiterhin das falsche Argument. Natürlich müssten Sie den Quellcode und die Bibliothek, die Sie daraus kompilieren, nur für sich selbst lesbar machen, um am besten in einemchmod 0700
Verzeichnis zu arbeiten. Und da das Passwort nicht Teil des Befehlsaufrufs ist, ist auch Ihr Bash-Verlauf sicher.Fortgeschrittener Interposer
Wenn Sie etwas ausführlicheres tun möchten, sollten Sie berücksichtigen, dass dies
__libc_start_main
ausgeführt wird, bevor die Laufzeitbibliothek ordnungsgemäß initialisiert wurde. Daher würde ich empfehlen, Funktionsaufrufe zu vermeiden, sofern sie nicht unbedingt erforderlich sind. Wenn Sie Funktionen nach Herzenslust aufrufen möchten, stellen Sie sicher, dass Sie dies unmittelbar vor dem Aufruf tunmain
, nachdem die gesamte Initialisierung abgeschlossen ist. Für das folgende Beispiel muss ich danken Grubermensch der darauf hinweist, wie ein Passwort als Kommandozeilen - Argument übergeben zu verbergen , das gebracht ,getpass
um meine Aufmerksamkeit.Dadurch werden Sie zur Eingabe des Kennworts aufgefordert, sodass Sie die Interposer-Bibliothek nicht mehr geheim halten müssen. Das Platzhalterargument wird als Kennworteingabeaufforderung wiederverwendet. Rufen Sie dies also wie folgt auf
Eine andere Alternative würde das Passwort aus einem Dateideskriptor (wie z. B.
gpg --passphrase-fd
) oder ausx11-ssh-askpass
oder was auch immer lesen .quelle
strings
Sicherheitsanfälligkeit behoben wird . Siehe SO: Passworteingabe am Terminal verbergen .__libc_start_main
.Es ist nicht nur die Geschichte. Es wird auch in der ps- Ausgabe angezeigt .
Wer diese Software geschrieben hat, sollte aufgehängt, gezeichnet und geviertelt werden. Es ist ein absolutes NEIN, unabhängig von der verwendeten Software ein Kennwort in der Befehlszeile eingeben zu müssen.
Für einen Daemon-Prozess ist es sogar noch unverzeihlicher ...
Außer rm -f auf der Software selbst kenne ich keine Lösung dafür. Ganz ehrlich: Finden Sie andere Software, um die Arbeit zu erledigen. Verwenden Sie keinen solchen Müll.
quelle
rm -f
jetzt.ps
. Solange der Entwickler das nicht beheben kann, schlägt er vor, etwas anderes zu verwenden.ps
, sodass sie nicht besser ist als dierm
Lösung.Dadurch wird die
ps
Ausgabe gelöscht.SEHR BEACHTEN : Dies könnte die Anwendung beschädigen . Sie werden gebührend gewarnt, dass hier Drachen sind.
Jetzt werden Sie ordnungsgemäß über diese ernsten Warnungen informiert. Dadurch wird die in angezeigte Ausgabe gelöscht
ps
. Es löscht weder Ihren Verlauf noch den Bash-Job-Verlauf (z. B. Ausführen des Prozesses wiemyprocess myargs &
). Aberps
die Argumente werden nicht mehr angezeigt.Rufen Sie das Programm auf, indem Sie
chmod +x
es speichern . Dann mache./whatever <pidoftarget>
Wenn dies funktioniert, wird keine Ausgabe erzeugt. Wenn es fehlschlägt, wird es sich über etwas beschweren und aufhören.quelle
gdb
kann das Gedächtnis von laufenden Prozessen verändert werden (mit viel mehr chirurgischer Präzision, als ich hinzufügen könnte).Können Sie das Argument aus einer Datei übergeben, auf die nur root oder der gewünschte Benutzer zugreifen kann?
Es ist ein RIESIGES Nein-Nein, Kennwörter in die Konsole einzugeben, aber die letzte Möglichkeit ... Beginnen Sie Ihre Zeile mit einem Leerzeichen, damit es nicht im Verlauf erscheint.
quelle
export HISTCONTROL=ignoreboth
Ignoriert sowohl Duplikate als auch Zeilen mit einem führenden Leerzeichen für den Eintrag in den Verlauf. Fügen Sie es Ihrem .bashrc- oder .bash_profile hinzu.Vielleicht funktioniert das (?):
quelle
darkcoind masternode start `head -1`
, wenn Sie das Passwort manuell eingeben möchten.ps
und ähnliche Dienstprogramme verfügbar ..bash_history
zu einem Klartext-Passwortpassword.txt
wechseln, erhalten Sie was genau?Wenn Ihr
darkcoind
Befehl das Kennwort als Befehlszeilenargument erwartet, wird es leider durch Dienstprogramme wie verfügbar gemachtps
. Die einzige wirkliche Lösung besteht darin , die Entwickler zu schulen .Während die
ps
Enthüllung unvermeidbar sein kann, können Sie zumindest verhindern, dass das Kennwort in die Shell-Verlaufsdatei geschrieben wird.In der Verlaufsdatei sollte nur
xargs darkcoind masternode start
das Kennwort und nicht das Kennwort aufgezeichnet werden.quelle
ignorespace
in$HISTCONTROL
, und dann können Sie verhindern , dass jeder Befehl aus, die in der Shell - Geschichte , indem Sie den Befehl mit einem Leerzeichen voranstellen .Sehen Sie sich, wie bereits erwähnt, Ihr Shell-Verlaufssteuerelement an, um die Informationen vor dem Verlauf zu verbergen.
Aber eine Sache, die noch niemand angedeutet zu haben scheint, ist,
/proc
mit demhidepid
Parameter zu mounten . Versuchen Sie, Ihre/proc
Zeile so/etc/fstab
zu ändernhidepid
, dass sie Folgendes enthält:quelle
Sie können das Kennwort aus dem Shell-Verlauf entfernen, indem Sie den Befehl über einen neuen Shell-Prozess ausführen, den Sie dann sofort beenden. Zum Beispiel:
Stellen Sie sicher, dass
sh
konfiguriert ist, dass der Verlauf nicht in einer Datei gespeichert wird.Natürlich werden die anderen Probleme, wie das Kennwort, das in angezeigt wird, dadurch nicht behoben
ps
. Es gibt meines Erachtens Möglichkeiten, vor denen dasdarkcoind
Programm selbst die Informationen verbirgtps
, aber dies verkürzt nur das Fenster der Sicherheitsanfälligkeit.quelle
ps
und ähnliche Dienstprogramme verfügbar .Für Bitcoin lautet die offizielle Antwort des Entwicklers, den mitgelieferten Python-Wrapper in
contrib/bitrpc/bitrpc.py
( github ) zu verwenden:und:
Quelle: # 2318
Brieftasche freischalten:
Passwort ändern:
https://github.com/bitcoin/bitcoin/tree/master/contrib/bitrpc
Für darkcoin funktioniert es wie folgt:
https://github.com/darkcoin/darkcoin/tree/master/contrib/bitrpc
quelle