Hace un tiempo noté que los nombres de usuario y contraseñas dados curl
como argumentos de línea de comando no aparecen en la ps
salida (aunque, por supuesto, pueden aparecer en su historial de bash).
Tampoco aparecen en /proc/PID/cmdline
.
(Sin embargo, la longitud del argumento combinado de nombre de usuario / contraseña puede derivarse).
Demostración a continuación:
[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 ~]#
¿Cómo se logra este efecto? ¿Está en algún lugar del código fuente de curl
? (¿Asumo que es una curl
característica, no una ps
característica? ¿O es una característica del núcleo de algún tipo?)
Además: ¿ se puede lograr esto desde fuera del código fuente de un ejecutable binario? Por ejemplo, mediante el uso de comandos de shell, probablemente combinado con permisos de root?
En otras palabras, ¿podría alguna manera enmascarar un argumento de aparecer en /proc
o en la ps
salida (lo mismo, creo) que pasé a algunos arbitraria de comandos shell? (Supongo que la respuesta a esto es "no", pero parece que vale la pena incluir esta media pregunta adicional).
environ
directamente para acceder a las variables de entorno? - el resultado final: la lista de argumentos, como la lista de variables de entorno, está en la memoria de proceso de lectura / escritura del usuario, y puede ser modificada por el proceso del usuario.
grep
patrón sea una clase de personaje. Ej .ps -ef | grep '[c]url'
curl
coincide curl
pero [c]url
no coincide [c]url
. Si necesita más detalles, haga una nueva pregunta y estaremos encantados de responder.