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
機能だと思いますか?それとも何らかのカーネル機能ですか?)
また、これはバイナリ実行可能ファイルのソースコードの外部から達成できますか? たとえば、シェルコマンドを使用して、おそらくルート権限と組み合わせて使用しますか?
言い換えれば、任意のシェルコマンドに渡し/proc
たps
出力(または同じことだと思います)に出てくる引数を何らかの方法でマスクできますか?(これに対する答えは「いいえ」であると思いますが、この余分な半質問を含める価値があるようです。)
environ
直接環境変数にアクセスするために使用していますか?—一番下の行:引数リストは、環境変数のリストと同様に、読み取り/書き込みユーザープロセスメモリ内にあり、ユーザープロセスによって変更できます。
grep
パターン文字クラスを。例ps -ef | grep '[c]url'
curl
は一致しますcurl
が一致[c]url
しません[c]url
。さらに詳しい情報が必要な場合は、新しい質問をしてください。喜んでお答えします。