J'ai remarqué il y a quelque temps que les noms d'utilisateur et les mots de passe donnés en curl
tant qu'arguments de ligne de commande n'apparaissent pas dans la ps
sortie (bien qu'ils puissent bien sûr apparaître dans votre historique bash).
De même, ils n'apparaissent pas dans /proc/PID/cmdline
.
(La longueur de l'argument combiné nom d'utilisateur / mot de passe peut cependant être dérivée.)
Démonstration ci-dessous:
[root@localhost ~]# nc -l 80 &
[1] 3342
[root@localhost ~]# curl -u iamsam:samiam localhost &
[2] 3343
[root@localhost ~]# GET / HTTP/1.1
Authorization: Basic aWFtc2FtOnNhbWlhbQ==
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: localhost
Accept: */*
[1]+ Stopped nc -l 80
[root@localhost ~]# jobs
[1]+ Stopped nc -l 80
[2]- Running curl -u iamsam:samiam localhost &
[root@localhost ~]# ps -ef | grep curl
root 3343 3258 0 22:37 pts/1 00:00:00 curl -u localhost
root 3347 3258 0 22:38 pts/1 00:00:00 grep curl
[root@localhost ~]# od -xa /proc/3343/cmdline
0000000 7563 6c72 2d00 0075 2020 2020 2020 2020
c u r l nul - u nul sp sp sp sp sp sp sp sp
0000020 2020 2020 0020 6f6c 6163 686c 736f 0074
sp sp sp sp sp nul l o c a l h o s t nul
0000040
[root@localhost ~]#
Comment cet effet est-il atteint? Est-ce quelque part dans le code source de curl
? (Je suppose que c'est une curl
fonctionnalité, pas une ps
fonctionnalité? Ou est-ce une fonctionnalité du noyau?)
Aussi: cela peut-il être réalisé en dehors du code source d'un exécutable binaire? Par exemple, en utilisant des commandes shell, probablement combinées avec des permissions root?
En d'autres termes, pourrais-je en quelque sorte masquer un argument d'apparaître dans /proc
ou dans une ps
sortie (même chose, je pense) que j'ai passé à une commande de shell arbitraire ? (Je suppose que la réponse à cette question est "non", mais il semble utile d'inclure cette demi-question supplémentaire.)
environ
directement pour accéder aux variables d'environnement? - la ligne du bas: la liste des arguments, comme la liste des variables d'environnement, est en mémoire en lecture / écriture dans le processus utilisateur et peut être modifiée par le processus utilisateur.
grep
modèle une classe de caractères. Par exempleps -ef | grep '[c]url'
curl
correspond curl
mais [c]url
ne correspond pas [c]url
. Si vous avez besoin de plus de détails, posez une nouvelle question et je me ferai un plaisir de vous répondre.