私の Web アプリケーションでは、ユーザーがサンドボックスで任意のコードを実行できます。forkbomb を防ぐために、アプリケーションはsetrlimitRLIMIT_NPROC
を呼び出し、ユーザー コードを実行する前に 50 に制限します。これは、Ubuntu 12.04 から Ubuntu 13.04 までうまく機能しました。しかし、Ubuntu 13.10 (Apache 2.4 および Linux 3.11 に同梱) にアップグレードした後、www-data
Apache2 がアイドル状態の場合でも、50 プロセスの制限に達しました!
この問題は、 を使用しbash
てユーザーとして実行することにより、最も簡単に再現できます。最初にユーザーに切り替えて開始します:www-data
ulimit
www-data
bash
jeroen@Ubuntu:/$ sudo su www-data
$ bash
www-data@Ubuntu:/$
RLIMIT_NPROC
問題が発生するまで徐々に下げます。
#RLIMIT_NPROC=100: works fine
www-data@Ubuntu:/$ ulimit -u 100
www-data@Ubuntu:/$ ls
bin dev initrd.img lib64 mnt root srv usr vmlinuz.old
boot etc initrd.img.old lost+found opt run sys var
cdrom home lib media proc sbin tmp vmlinuz
#RLIMIT_NPROC=50: limit reached
www-data@Ubuntu:/$ ulimit -u 50
www-data@Ubuntu:/$ ls
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
したがって、RLIMIT_NPROC
50 に設定すると、プロセスはフォークできなくなります。これは、すでに 50 以上のプロセスが user として実行されていることを意味しますwww-data
。ただし、これは当てはまらないようです。サーバーは空のアイドル状態の Apache 2.4 です。によるとps
、現在 が所有する proc は 2 つだけwww-data
です。
jeroen@Ubuntu:~$ ps aux | grep www-data
www-data 11473 0.0 0.5 631296 46164 ? Sl 14:28 0:01 /usr/sbin/apache2 -k start
www-data 11474 0.0 0.5 565656 45632 ? Sl 14:28 0:01 /usr/sbin/apache2 -k start
jeroen 12136 0.0 0.0 13644 956 pts/4 S+ 14:51 0:00 grep --color=auto www-data
では、アイドル状態であっても Apache 2.4 で 50www-data
の制限に達するのはなぜですか?RLIMIT_NPROC