Fork爆弾
Linuxカーネルにはユーザー毎のプロセス数を制限する RLIMIT_NPROC があり、setrlimit()システムコールで設定される。また、LinuxやBSD系OSでは、/etc/security/limits.conf を編集することでも同様の効果が得られる。
また、OSがFork爆弾を検出するという対策もある。Linuxには rexFBD というカーネルモジュールがあり、そのような機能を実装している。
FreeBSDでは、システム管理者が /etc/login.conf に制限を置くことができる。
このような予防策を講じたとしても、Fork爆弾はシステムに重大な影響を及ぼす可能性がある。例えば、24個のCPUのあるサーバで、各ユーザーが100個までのプロセスを生成できる設定になっている場合、Fork爆弾が100個までしかプロセスを生成できないとしても24個のCPU全部を100%使用することもありうる。これによりシステムは応答不可能となり、システム管理者が問題を解決するためにログインすらできない状況になりうる。
次の例は、UNIXのbashまたはzshでFork爆弾として機能する13文字であり、特によく知られている。
まず、先頭の ":()" は ":" という関数(引数なし)を定義することを宣言している。続く "{ :|:& };" がその本体で、自分自身を2つ起動してパイプでつなぎ、バックグラウンドで実行することを意味する。バックグラウンドなので、親プロセスをkillしても子プロセスは終了しない。最後の ":" がその関数の実行開始を意味する。この文字列は関数名を ":" として意味をわかりにくくしている。これをもっと判りやすい名前に置換すると次のようになる。
Microsoft Windows の cmd および command.com 用バッチファイル:
POSIX C または C++による例:
Perlによる例:
Pythonによる例:
Rubyによる例: