Percebi há algum tempo que nomes de usuário e senhas dados curlcomo argumentos de linha de comando não aparecem na pssaída (embora, é claro, eles possam aparecer no seu histórico do bash).
Da mesma forma, eles não aparecem /proc/PID/cmdline.
(Porém, a duração do argumento combinado de nome de usuário / senha.)
Demonstração abaixo:
[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 ~]#
Como esse efeito é alcançado? Está em algum lugar no código fonte de curl? (Presumo que seja um curlrecurso, não um psrecurso? Ou é um recurso do kernel de algum tipo?)
Além disso: isso pode ser alcançado fora do código-fonte de um executável binário? Por exemplo, usando comandos de shell, provavelmente combinados com permissões de root?
Em outras palavras, eu poderia, de alguma forma, mascarar um argumento que apareça na saída /procou na pssaída (mesma coisa, acho) que passei para algum comando arbitrário do shell? (Eu acho que a resposta para isso é "não", mas parece valer a pena incluir essa meia pergunta extra.)
environdiretamente para acessar variáveis de ambiente? - a linha inferior: a lista de argumentos, como a lista de variáveis de ambiente, está na memória de processo de leitura / gravação do usuário e pode ser modificada pelo processo do usuário.
greppadrão em uma classe de caracteres. Por exemplops -ef | grep '[c]url'
curlcorresponde, curlmas [c]urlnão corresponde [c]url. Se você precisar de mais detalhes, faça uma nova pergunta e ficarei feliz em responder.