書き換えられたcmdlineと変わらないcomm先ほど、「psコマンドはprocファイルのcmdlineを読む」と書きましたが、これは正確ではありません。正しくは、「(一般的なオプションを付けて)psコマンドを実行すると、procファイルのcmdlineを読む」が正解です。実は、psコマンド実行時にcという誰も知らないマイナーなオプションを付けると、commの方を表示します。name)」と表現されています。~]$上の例で、PID=2096のプロセスは、はじめはnotepad.exeに見えましたが、次のcオプションではscript.plに見えます。化けの皮がはがれました。一つ、psコマンドでは無くpstreeコマンドを使っても簡単に元のコマンド名を見ることができます。~]$これは、pstreeコマンドは/proc/(プロセスID)/statファイルを読み込みそこからコマンド名を取得するので、/proc/(プロセスID)/cmdlineは読まないためです。そのため、$0書き換えはpstreeコマンドには効きません。$0を書き換える目的この$0は、プログラムの動作状態を表示するために使うのが一番まっとうなやり方です。実行状態によってscript.pl(run)とscript.pl(wait)のように$0を適宜書き換えれば、psで監視している人は分かりやすくてハッピーです。一つ、$0操作はpsコマンドからの隠蔽目的でもよく使われます。具体的には、Perlでマルウェアを書いている人たちの間では、この$0いじりをするのは常套手段でありよく使われる手法です。以下は、以前に収集した、PHPの脆弱性を狙って送り込まれてきたボットネット用のPerlクライアント(PerlBot)ソースの一部です。-x");....(省略)....$0="$processo"."\0"x16;;このように、悪意のあるスクリプトを"/usr/sbin/sshd"とか、あるいはcrondなど一般的なデーモンのように見せかけることで、psコマンドで見つかりにくくするわけです。psコマンドを打って/usr/sbin/sshdがひとつ紛れ込んでいても、目でパッと見るくらいなら普通は気がつきません。fork()すると?もはや細かすぎて誰も興味ないと思いますが、$0を書き換えた状態でfork()すると、子プロセスへも$0改変は引き継がれます。100;こうすると、notepad.exeが2つ見えます。OSによる違い冒頭に述べましたが、$0をいじったスクリプトがpsコマンドでどう見えるかは、OSによって違います。x.x.x)という文字列が必ず入ります。そのためFreeBSDでは、Perlで書かれたマルウェアがps偽装するのも難しくなります。~]$ちなみにSolarisでは(若い人は知らなくていいOSです)、以下のように$0をいじってpsコマンドで見ても、何も変わっていません。元のコマンドラインそのままが表示されます。Solarisのpsコマンドは、Linuxとは違ってカーネル内のプロセステーブルから直接持ってくるため、Perlスクリプト内で何をしようがpsの出力は変わりません(......だったはず)。一応最後に教訓めいたことを書くと、侵入されて悪意のあるプロセスが動いているかもしれないサーバ上でプロセス調査するには、Linuxではpsコマンドにcオプションを付けた出力も取得しておいた方が良い、ということです。FreeBSDやSolarisなら、$0偽装が効かないのでこの辺の判別がやりやすくなります。こんなケースでは、そもそもpsコマンド自体が侵入者に置き換えられてしまっているのでは......とかフォレンジック的に色々心配しないといけないことがあるので、あまり実用的とは言えない知識です。あわせて読みたい@k_morihisaさんが、実際に仕込まれそうになったIRCBOTのソースコードを元に、偽装プロセス名の一覧を作られています。関する罪」の情報公開請求をしました月別アーカイブはてなブログをはじめよう!ozumaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。