Percebi há algum tempo que nomes de usuário e senhas dados curl
como argumentos de linha de comando não aparecem na ps
saí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 curl
recurso, não um ps
recurso? 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 /proc
ou na ps
saí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.)
environ
diretamente 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.
grep
padrão em uma classe de caracteres. Por exemplops -ef | grep '[c]url'
curl
corresponde, curl
mas [c]url
não corresponde [c]url
. Se você precisar de mais detalhes, faça uma nova pergunta e ficarei feliz em responder.