Skąd PS wie, aby ukryć hasła?

22

Świadek:

$ 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

Skąd PS wiedział, aby ukryć mysqlhasła? Czy mogę włączyć to do własnych skryptów, aby ukryć określone atrybuty CLI?

dotancohen
źródło
6
Jest to prawdopodobnie inny sposób i mysqldziała magicznie, a nie ps: „Klienci MySQL zazwyczaj nadpisują argument wiersza polecenia zerami podczas sekwencji inicjalizacji.” - Wytyczne dla użytkowników końcowych dotyczące bezpieczeństwa haseł
manatwork
Dziękuję, to jest dokument informacyjny. Zobaczę, jak mogę zastąpić argumenty CLI we własnych skryptach.
dotancohen
1
@manatwork Chciałbym odpowiedzieć na to pytanie, ponieważ tak właśnie się dzieje - i jest to przydatne łącze do problemów bezpieczeństwa dotyczących mysql. :)
Drav Sloan
Zauważ, że chociaż argumenty wiersza poleceń mogą być podsłuchiwane, zmienne środowiskowe są bezpieczne .
Gilles „SO- przestań być zły”
Aby uzyskać więcej informacji na ten temat, zobacz unix.stackexchange.com/q/385339/135943
Wildcard

Odpowiedzi:

23

psnie ukrywa hasła. Aplikacje takie jak mysql zastępują listę argumentów, którą otrzymali. Należy pamiętać, że istnieje krótki przedział czasowy (możliwy do rozszerzenia przez duże obciążenie systemu), w którym argumenty są widoczne dla innych aplikacji, dopóki nie zostaną zastąpione. Ukrywanie procesu innym użytkownikom może pomóc. Zasadniczo o wiele lepiej jest przekazywać hasła przez pliki niż w wierszu poleceń.

W tym artykule opisano C, jak to zrobić. Poniższy przykład ukrywa / usuwa wszystkie argumenty wiersza poleceń:

#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 = ' ';
    }

    // ...
}

Zobacz także /programming/724582/hide-arguments-from-ps i /programming/3830823/hiding-secret-from-command-line-parameter-on-unix .

Jofel
źródło
Bardzo fajnie, dziękuję. Nie zdawałem sobie sprawy, że argumenty jako takie można modyfikować.
dotancohen
Pamiętaj również, że nie wszystkie programy będą to robić za pomocą haseł.
popiół
Link do tego artykułu jest zepsuty. Ktoś, kto wyjaśni mi kod? (Dlaczego kod działa, wystarczy ustawić \0spację?) Dowolny link do setproctitle()?
schemacs
Czy odpowiedź leży tutaj ?
schemacs
7

Mysql program zastępuje hasła z wiersza poleceń ze xw tej linii kodu :

while (*argument) *argument++= 'x';     // Destroy argument
schemacs
źródło
3
Niestety nie jest to tak bezpieczne, jak mogłoby być. Możesz powiedzieć, jak długie jest hasło. Lepiej zastąp go \0, abyś potrzebował dodatkowych informacji, aby znaleźć długość hasła (bez UB / SEGFAULT).
wizzwizz4,