フォークボムを停止して検出する方法


14
#include <stdlib.h>
#include <unistd.h>

int main()
{
   while(1)
      fork();
}

これはフォーク爆弾のコードです。

私たちの大学では、telnet、つまりクライアントサービスプロトコルを介して接続します。約100台のシステムがサーバーに接続されています。突然サーバーが遅くなり、しばらくしてからクラッシュしました。sombodyがフォーク爆弾を実装していることを知りました。

どのシステムでフォークボムが実装されているかをどのように検出できますか?そして、どうすればそれを止めることができますか?

1つの方法は、1人のユーザーが所有できるプロセスの最大数を制限することです。それを停止し、どのシステムから実装されているかを知る方法はありますか?


19
Telnet?マジ?本当にSSHを使用する必要があります...
ThiefMaster



まあそれはSOから移行されましたが、1つの答えはカーネルレベルである可能性があります。暫定的に行われたパッチもありますが、受け入れられると思われるものはありません。私のポイントは、それを検出する方法です。システムをもう使用できないことを知っているユーザーは、検出ポイントはおそらく重要なポイントではないでしょう。回復する方法 現在の答えはリブートです、私は述べるでしょう:1つのプロセス(あなたが混乱をクリーンアップしたいもの)のみを実行し、他のすべてのものを停止するようカーネルに指示する方法。これは、システムコンソールでのみアクセス可能な機能です。
フィリップlhardy

回答:


16

1つの方法は、ユーザーが実行できるプロセスの数を制限することです。

rootとしてログインし、このファイルを編集して、ユーザーを追加し、制限を構成します。

# vi /etc/security/limits.conf

この行をファイルに追加します

john hard nproc 10

これで、ユーザーjohnは10個のプロセスのみを作成できます。


新しい設定/etc/security/limits.confを有効にするには、再起動する必要があると思います。
ダンD.

2
いいえ。ただし、PAMによって適用されるため、新しいログインにのみ適用されます。
シーフマスター

14

実行中のフォーク爆弾を停止するにkillall <name>は、爆弾のすべてのプロセスを殺すために使用できる場合があります。ただし、フォーク爆弾は通常、システムに非常に高い負荷をかけるため、システムにSSH接続したり実行したりできない場合があります。そのため、再起動が必要になる場合があります。

すべてのユーザーがシステム上に自分のアカウントを持っている場合は、全員のホームディレクトリを確認して実行可能ファイルを検索するだけです。彼はソースコードもアップロードしているので、それを見つけるのは難しくないはずです。すべての学生の共有アカウントである場合は、運が悪いです。特に、ユーザーのtelnetまたはsshセッションが終了した後、誰がそれを開始したかを知る機会がありません。

ただし、そのフォーク爆弾を爆発させたユーザーを罰する代わりに、フォーク爆弾を武装解除するようにシステムの構成を修正する必要があります。ユーザーごとにプロセス制限を設定して/etc/security/limits.conf、フォーク爆弾が制御不能になるのを防ぐことができます。たとえば、プロセスが50だけの場合、フォーク爆弾はあまりダメージを与えません。


どのシステムから来るのかを検出するのは不可能ですか?
ラジェシュM

@ user1670364:何を求めているのか明確ではありません。「来る」とはどういう意味ですか?どのユーザーがプロセスを所有しているのか、他に知りたいことはありますか?
デビッドシュワルツ

@DavidSchwartz私はそれが実装されているシステム上のフォーク爆弾を検出できることを意味しますか?
ラジェシュM

@ user1670364:フォークボムを実際に実行しているシステムを意味する場合、遅いシステムです。責任があるユーザーを意味する場合、分岐しているプロセスを所有しているのはユーザーです。
デビッドシュワルツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.