パスワードを忘れた? アカウント作成
391714 journal

Awnの日記: PHPの問題? or apacheの問題?

日記 by Awn

ずーっと前から気になってるんだが、mod_phpが有効なapache上で、
(大なり小なりが書けないんで全角)

---- hoge.php ----
<?php
system("/usr/bin/setsid ./hoge.sh > /dev/null &");
?>

---- hoge.sh ----
#!/bin/sh
while :
do
sleep 999999
done

をpublic_htmlに置いて、hoge.phpをブラウズすると、apacheがrestartできなくなる。
hoge.shが80番ポートのソケットを握ってしまい、再起動できない。
/usr/bin/setsidしてるのは、apacheへのシグナルがhoge.shに届かないようにするため。

きちんとapacheのセキュリティフィックスを行っているISPなどなら、
apacheに穴が見つかったタイミングでこれを仕掛けるとパニックになるかも知れません。
netstat -tnlpすれば、誰が握っているかはわかりますが。

これはDoSを狙ったものですが、そうでなくてもmod_php上からデーモンの再起動なんかを行うときに、
system("/etc/init.d/hogehoge restart");
とかやってしまうと(ちゃんと処理していないデーモンだと)同じ目に合います。
最近までphpではfork()できなかったので、fork()して必要のないfdを片っ端から閉じる、ということもできなかった。
system()で、0,1,2以外は全部閉じるようなことはしてくれないのかな。
もしかしたら、mod_perlとかmod_*系全てに当てはまるのかもしれない。

というより、mod_*のプロセスに、この辺のfdが渡ってしまうapacheに問題があるのかも。
ちなみに、CGIならこの問題は起きません。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

アレゲは一日にしてならず -- アレゲ見習い

読み込み中...