Woher weiß ps, wie man Passwörter versteckt?

22

Zeuge:

$ ps f
  PID TTY      STAT   TIME COMMAND
31509 pts/3    Ss     0:01 -bash
27266 pts/3    S+     0:00  \_ mysql -uroot -p
25210 pts/10   Ss+    0:00 /bin/bash
24444 pts/4    Ss     0:00 -bash
29111 pts/4    S+     0:00  \_ tmux attach
 4833 pts/5    Ss+    0:00 -bash
 9046 pts/6    Ss     0:00 -bash
17749 pts/6    R+     0:00  \_ ps f
 4748 pts/0    Ss     0:00 -bash
14635 pts/0    T      0:02  \_ mysql -uroot -px xxxxxxxxxxxxxxxx
16210 pts/0    S+     0:01  \_ mysql -uroot -px xxxxxxxxxxxxxxxx

Woher wusste ps, dass er die mysqlPasswörter verstecken sollte ? Kann ich dies in meine eigenen Skripte integrieren, um bestimmte CLI-Attribute auszublenden?

dotancohen
quelle
6
Wahrscheinlich ist es die andere Art und Weise und mysqlnicht die Magie ps: „MySQL-Clients überschreiben normalerweise das Befehlszeilen-Kennwortargument während ihrer Initialisierungssequenz mit Nullen.“ - Endbenutzer-Richtlinien für die Kennwortsicherheit
manatwork
Danke, das ist ein informatives Dokument. Ich werde sehen, wie ich cli-Argumente in meinen eigenen Skripten überschreiben kann.
Dotancohen
1
@manatwork Ich würde das als Antwort geben, denn genau das passiert gerade - und es ist ein nützlicher Link für Sicherheitsprobleme in Bezug auf MySQL. :)
Drav Sloan
Beachten Sie, dass Befehlszeilenargumente zwar abgehört werden können, Umgebungsvariablen jedoch sicher sind .
Gilles 'SO - hör auf, böse zu sein'
Weitere Informationen hierzu finden Sie unter unix.stackexchange.com/q/385339/135943
Wildcard

Antworten:

23

psversteckt das Passwort nicht. Anwendungen wie mysql überschreiben die Liste der Argumente, die sie erhalten haben. Bitte beachten Sie, dass es einen kleinen Zeitrahmen gibt (möglicherweise erweiterbar durch hohe Systemlast), in dem die Argumente für andere Anwendungen sichtbar sind, bis sie überschrieben werden. Das Verbergen des Prozesses für andere Benutzer könnte helfen. Im Allgemeinen ist es viel besser, Kennwörter über Dateien als über die Befehlszeile zu übergeben.

In diesem Artikel wird für C beschrieben, wie dies getan wird. Im folgenden Beispiel werden alle Befehlszeilenargumente ausgeblendet / gelöscht:

#include <string.h>

int main(int argc, char **argv)
{
    // process command line arguments....

    // hide command line arguments
    if (argc > 1) {
        char *arg_end;    
        arg_end = argv[argc-1] + strlen (argv[argc-1]);
        *arg_end = ' ';
    }

    // ...
}

Siehe auch /programming/724582/hide-arguments-from-ps und /programming/3830823/hiding-secret-from-command-line-parameter-on-unix .

Jofel
quelle
Sehr schön danke. Mir war nicht klar, dass die Argumente als solche veränderlich sind.
Dotancohen
Beachten Sie auch, dass dies nicht bei allen Programmen mit Kennwörtern möglich ist.
Asche
Der Link zu diesem Artikel ist fehlerhaft. Jemand, der mir den Code erklärt? (Warum funktioniert der Code, nur \0auf Leerzeichen setzen?) Jemand, auf den verlinkt wird setproctitle()?
Schemata
Oder liegt die Antwort hier ?
Schemata
7

Das mysql- Programm ersetzt das Passwort in der Befehlszeile durch xin dieser Codezeile :

while (*argument) *argument++= 'x';     // Destroy argument
Schemata
quelle
3
Leider ist das nicht so sicher wie es sein könnte. Sie können feststellen, wie lang das Passwort ist. Es ist besser, es durch zu ersetzen, \0damit Sie zusätzliche Informationen zum Ermitteln der Kennwortlänge benötigen (ohne UB / SEGFAULT).
wizzwizz4