Некоторое время назад я заметил, что имена пользователей и пароли, заданные в curl
качестве аргументов командной строки, не отображаются в ps
выходных данных (хотя, конечно, они могут появляться в вашей истории bash).
Они также не появляются в /proc/PID/cmdline
.
(Длина объединенного аргумента имя пользователя / пароль может быть получена, хотя.)
Демонстрация ниже:
[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 ~]#
Как достигается этот эффект? Это где-то в исходном коде curl
? (Я предполагаю, что это curl
особенность, а не ps
особенность? Или это какая-то особенность ядра?)
Кроме того: это может быть достигнуто извне исходного кода двоичного исполняемого файла? Например, с помощью команд оболочки, возможно, в сочетании с правами root?
Другими словами, могу ли я как-то замаскировать аргумент, появляющийся в /proc
или в ps
выходных данных (я думаю, то же самое), которые я передал какой-то произвольной команде оболочки? (Я предполагаю, что ответом будет «нет», но, кажется, стоит включить эту лишнюю половину вопроса.)
environ
непосредственно для доступа к переменным среды? - нижняя строка: список аргументов, как и список переменных среды, находится в памяти пользовательского процесса для чтения / записи и может быть изменен пользовательским процессом.
grep
шаблона классом символов. Напримерps -ef | grep '[c]url'
curl
соответствует, curl
но [c]url
не соответствует [c]url
. Если вам нужно больше подробностей, задайте новый вопрос, и я буду рад ответить.