Awnの日記: PHPの問題? or apacheの問題?
ずーっと前から気になってるんだが、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ならこの問題は起きません。
PHPの問題? or apacheの問題? More ログイン