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?


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 .


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.