#include <stdlib.h>
#include <unistd.h>
int main()
{
while(1)
fork();
}
これは、フォーク爆弾のコードです。
私たちの大学では、telnet、つまりクライアントサービスプロトコルを介して接続します。約100台のシステムがサーバーに接続されています。突然、サーバーの速度が低下し、しばらくするとクラッシュしました。誰かがフォーク爆弾を仕掛けていることを知りました。
フォーク爆弾がどのシステムに実装されているかをどのように検出できますか?そして、どうすればそれを止めることができますか?
1つの方法は、1人のユーザーが所有できるプロセスの最大数を制限することです。それを停止し、どのシステムから実装されているかを知る方法はありますか?
1つの方法は、ユーザーが実行できるプロセスの数を制限することです。
Rootとしてログインし、このファイルを編集して、ユーザーを追加し、制限を構成するだけです。
# vi /etc/security/limits.conf
この行をファイルに追加します
john hard nproc 10
これで、ユーザーjohnは10個のプロセスしか作成できません。
実行中のフォーク爆弾を停止するには、killall <name>
を使用して爆弾のすべてのプロセスを強制終了できる場合があります。ただし、フォーク爆弾は通常、システムに非常に高い負荷をかけるため、SSHで接続したり、実行したりできない場合があります。したがって、再起動が必要になるか、少なくともはるかに高速になる可能性があります。
すべてのユーザーがシステム上に自分のアカウントを持っている場合は、全員のホームディレクトリを確認して、実行可能ファイルを検索するだけです。彼はソースコードもアップロードした可能性が高いので、見つけるのはそれほど難しくないはずです。それがすべての学生の共有アカウントだった場合、あなたは運が悪いです。特に、ユーザーのtelnetまたはsshセッションが終了した後は、誰が開始したかを知る機会がありません。
ただし、そのフォーク爆弾を爆発させたユーザーを罰するのではなく、システムの構成を修正してフォーク爆弾を武装解除する必要があります。 /etc/security/limits.conf
を使用してユーザーごとのプロセス制限を設定し、フォーク爆弾が制御不能になるのを防ぐことができます。たった50回のプロセスでフォーク爆弾は大きなダメージを与えません。