Fork爆弾
Fork爆弾(フォークばくだん)とは、コンピュータシステムへのDoS攻撃の一種で、fork機能を使ったものである。これは、コンピュータ上で同時に実行可能なプログラム数あるいはプロセス数に制限があるという前提に依存したものである。
[編集] 詳細
Fork爆弾は非常に高速に多数のプロセスを生成して、コンピュータのオペレーティングシステムの管理するプロセスのリストを埋め尽くす。プロセステーブルが埋め尽くされると、いずれかのプロセスを終了させない限り新たなプロセスを生成できなくなる。そして、たとえ1つのプロセスを終了させて対処のためのプロセスを生成しようとしても、Fork爆弾のプロセス群は空いたプロセスのスロットを迅速に埋めようと待っているのである。
プロセステーブルを埋め尽くすだけでなく、Fork爆弾はプロセッサ時間とメモリも占有する。結果としてFork爆弾以外のプロセス群やシステムは動作が困難(低速)となるか、動作できなくなる。
Fork爆弾は「wabbit」の一種である。wabbitは自己増殖するプログラムだが、ワームのようにネットワークを介して広がっていく能力のないものを指す。
多くのFork爆弾は "fork while fork" を使用するが、"fork while 1" の方がさらに高速にシステムをダウンさせる可能性がある。一般的なFork爆弾としてPerlインタプリタを利用した perl -e "fork while fork" とか、Bashを利用した :(){ :|:& };: などがある(Explanationに英文で意味の説明がある)。
$0 & $0 &
Microsoft Windows ではバッチファイルを使って以下のようになる:
:s start %0 goto s
C言語での例を以下に示す:
#include <unistd.h>
int main(void)
{
while(1) {
fork();
}
return 0;
}
[編集] 対処の難しさ
Fork爆弾が起動させられてしまった場合、その対処としてはFork爆弾が生成した全プロセスを終了させることしかないため、システムのリブート以外に対処法がないという状況になる可能性がある。問題のプロセス群を強制終了させるには新たなプロセスを生成しなくてはならないが、プロセステーブルの空きスロットがない可能性があるし、メモリ管理のデータ構造が不足している可能性もある。つまり、Fork爆弾が動作しているシステム上で新たにプロセスを生成できる可能性は非常に低い。
[編集] 予防
基本的には通常のセキュリティ対策を施して、不正なアクセスによるプロセス生成を防ぐのが第一である。しかし、Fork爆弾はプログラミング初心者のミスによって発生することもある。
Fork爆弾が作動する方法は、可能な限り多くのプロセスを生成することである。従ってFork爆弾を防ぐには、1つのプログラムあるいは1人のユーザーが生成できるプロセス数を制限すればよい。信頼できないユーザーが相対的に少数のプロセスしか生成できないようにすれば、悪意があるかどうかに関わらず Fork爆弾の危険性は減る。しかし、複数のユーザーが協力してFork爆弾を使用すれば、そのプロセス数の合計がシステム全体のプロセス数の制限を使い切る可能性は依然として残る。他の解決法としてカーネルでFork爆弾を検出する方法が考えられ、Linuxカーネルのモジュールとしてそれが実装されているが、広く使われてはいない。
このような予防策を講じたとしても、Fork爆弾はシステムに重大な影響を及ぼす可能性がある。例えば、24個のCPUのあるサーバで、各ユーザーが100個までのプロセスを生成できる設定になっている場合、Fork爆弾が100個までしかプロセスを生成できないとしても24個のCPU全部を100%使用することになる。これによりシステムは応答不可能となり、システム管理者が問題を解決するためにログインすることすらできない状況になりうる。