Я зауважив деякий час тому, що імена користувачів та паролі, задані curl
як аргументи командного рядка, не відображаються у ps
виході (хоча, звичайно, вони можуть відображатися у вашій історії баш).
Вони також не з'являються в /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
. Якщо вам потрібна детальніше, задайте нове запитання, і я з радістю відповім.