フォーク爆弾
フォーク爆弾 とは何ですか?
フォーク爆弾プロセスが自身を再帰的に fork し続けることでプロセステーブル・メモリ・CPU を枯渇させるサービス妨害手法。
フォーク爆弾は、子プロセスを再帰的に生成し、各サイクルで倍増させて、カーネルの上限・メモリ・CPU が飽和してシステムが応答不能になるまで続く、悪意ある、あるいは事故的なコードです。古典的な POSIX の一行コマンド :(){ :|:& };: は、: という名前の関数を定義し、その関数が自身の 2 つのコピーをパイプでバックグラウンドに渡してから呼び出します。各世代でプロセス数が倍増するため、プロセステーブルは数秒で埋まってしまいます。この着想は Unix よりはるか以前にさかのぼり、最も古い名称の一つが 「wabbit」 すなわちラビット(rabbit)プログラムで、1969〜1974 年頃にワシントン大学の Burroughs メインフレーム上で確認されたと伝えられています。
フォーク爆弾はワームのようにネットワークを介して伝播することはなく、局所的なリソース枯渇攻撃です。しかし、単一の非特権ユーザーが全員のサービスを妨害できる、共有マルチユーザーホスト、CI ランナー、コンテナでは非常に効果的です。
防御策は、システムコールをブロックするのではなく、プロセスツリーが消費できるリソースに上限を設けます。Linux における主要な制御は、ユーザーごとのプロセス数を制限する ulimit -u / PAM の pam_limits(nproc)と、コンテナのタスク数を制限する cgroups の pids コントローラ(pids.max。Docker と Kubernetes は --pids-limit で公開)です。アカウント分離、信頼できないコード用のサンドボックス、専用の CI エグゼキュータは、被害範囲をさらに封じ込めます。
flowchart TD
A[":() 関数が<br/>自身を 2 回呼び出す"] --> B[子プロセス 1]
A --> C[子プロセス 2]
B --> D[孫プロセス]
B --> E[孫プロセス]
C --> F[孫プロセス]
C --> G[孫プロセス]
D --> H["... 指数関数的に増加 ..."]
E --> H
F --> H
G --> H
H --> I{"pids.max / ulimit -u<br/>に到達?"}
I -->|上限なし| J[プロセステーブル枯渇 — ホストがハング]
I -->|上限あり| K[新規 fork が EAGAIN で失敗 — ホストは生存]● 例
- 01
DoS デモとして知られる Bash の一行コマンド `:(){ :|:& };:`。
- 02
無限ループ内で誤って fork する不具合のある CI スクリプト。
● よくある質問
フォーク爆弾 とは何ですか?
プロセスが自身を再帰的に fork し続けることでプロセステーブル・メモリ・CPU を枯渇させるサービス妨害手法。 サイバーセキュリティの マルウェア カテゴリに属します。
フォーク爆弾 とはどういう意味ですか?
プロセスが自身を再帰的に fork し続けることでプロセステーブル・メモリ・CPU を枯渇させるサービス妨害手法。
フォーク爆弾 からどのように防御しますか?
フォーク爆弾 に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
フォーク爆弾 の別名は何ですか?
一般的な別名: ウサギ型(Wabbit), ラビットウイルス。