Comment PS sait-il cacher les mots de passe?

22

Témoin:

$ 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

Comment PS a-t-il su cacher les mysqlmots de passe? Puis-je l'incorporer dans mes propres scripts pour masquer des attributs CLI particuliers?

dotancohen
la source
6
Il est probablement l'autre et mysqlne la magie, non ps: « clients MySQL remplace généralement l'argument de mot de passe en ligne de commande avec des zéros au cours de leur séquence d'initialisation. » - Directives de l' utilisateur final pour mot de passe de sécurité
manatwork
Merci, c'est un document informatif. Je vais voir comment je pourrais écraser les arguments cli dans mes propres scripts.
dotancohen
1
@manatwork Je mettrais cela comme une réponse, car c'est exactement ce qui se passe - et c'est un lien utile pour les problèmes de sécurité concernant mysql. :)
Drav Sloan
Notez que même si les arguments de ligne de commande peuvent être espionnés, les variables d'environnement sont sûres .
Gilles 'SO- arrête d'être méchant'
Pour plus d'informations à ce sujet, voir unix.stackexchange.com/q/385339/135943
Wildcard

Réponses:

23

psne cache pas le mot de passe. Des applications comme mysql écrasent la liste des arguments qu'ils ont obtenue. Veuillez noter qu'il existe un petit laps de temps (éventuellement extensible par une charge système élevée), où les arguments sont visibles pour d'autres applications jusqu'à ce qu'ils soient remplacés. Cacher le processus à d'autres utilisateurs pourrait aider. En général, il est préférable de passer des mots de passe via des fichiers que par ligne de commande.

Dans cet article, il est décrit pour C, comment procéder. L'exemple suivant masque / supprime tous les arguments de ligne de commande:

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

    // ...
}

Regardez aussi /programming/724582/hide-arguments-from-ps et /programming/3830823/hiding-secret-from-command-line-parameter-on-unix .

jofel
la source
Très gentil merci. Je ne savais pas que les arguments sont mutables en tant que tels.
dotancohen
Notez également que tous les programmes ne le feront pas avec des mots de passe.
ash
Le lien vers cet article est rompu. Quelqu'un pour m'expliquer le code? (Pourquoi le code fonctionne-t-il, il suffit de définir l' \0espace?) Un lien vers setproctitle()?
schemacs
Ou la réponse se trouve ici ?
schemacs
7

Le programme mysql remplace le mot de passe de la ligne de commande par xdans cette ligne de code :

while (*argument) *argument++= 'x';     // Destroy argument
schemacs
la source
3
Malheureusement, ce n'est pas aussi sûr qu'il pourrait l'être. Vous pouvez déterminer la longueur du mot de passe. Il est préférable de le remplacer par \0afin d'avoir besoin d'informations supplémentaires pour trouver la longueur du mot de passe (sans UB / SEGFAULT).
wizzwizz4