Macのフォーク爆弾?

Macのフォーク爆弾?

私はちょうど1つについて学びました。フォーク爆弾、興味深いタイプのサービス拒否攻撃です。 Wikipedia(および他の場所):(){ :|:& };:では、UNIXシステムでフォークされたプロセスを無制限に使用することをお勧めします。しかし、Mac OS X Lionでは動作しないようです(最も広く使用されているオペレーティングシステムは、この直接的な攻撃に対して脆弱ではないという内容を読んだことを覚えています)。しかし、私はこの攻撃がどのように機能するのか(そしてどのように見えたのか)とても疑問に思い、私のMacで試してみたいと思います。システムのセキュリティ対策をバイパスする方法はありますか?それともMacではフォーク爆弾は不可能ですか?

答え1

フォーク爆弾の仕組み:C(またはCに似た)コードは、名前fork()付き関数を呼び出します。これにより、Linux、Unix、またはUnixファミリーはまったく新しいプロセスを作成します。このプロセスには、アドレス空間、プロセスID、シグナルマスク、オープンファイルディスクリプタ、およびオペレーティングシステムカーネルの限られたメモリスペースを占めるすべてが含まれています。新しく作成されたプロセスは、プロセスが実行されるカーネルのデータ構造内の場所も取得します。呼び出しプロセスではfork()何も起こっていないようです。フォークバームプロセスはfork()できるだけ早く、できるだけ何度も呼び出しを試みます。

秘密は新しく作成されたプロセスです。またから戻ってくるfork()同じコードで。分岐後、同じコードを実行する2つのプロセスが生成されます。各新しいフォーク爆弾プロセスはfork()できるだけ早く、できるだけ何度も呼び出しを試みます。例として提供されているコードは、フォーク爆弾のBashスクリプトバージョンです。

まもなく、オペレーティングシステムカーネルのプロセス関連リソースがすべて消費されます。プロセステーブルがいっぱいです。実行待機中のプロセスのリストがいっぱいです。物理メモリがいっぱいになり、ページングが開始されます。これが十分に長く続くと、スワップパーティションがいっぱいになります。

ユーザーに見える外観:すべてが非常に遅く実行されます。ls場合によっては、psこの状況では電源コードを介した再起動が必要になることがあります。

フォーク爆弾は過去に「ウサギ」として知られていました。繁殖が早すぎるからです。

ただ楽しさでCでフォーク爆弾プログラムを書いた。

#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
        while (1)
                fork();

        return 0;
}

私はArch Linuxのxtermでプログラムをコンパイルして実行しました。別のxtermからプロセスのリストを取得しようとしています。

1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable

fork()最初のxtermに関連するフォーク爆弾プロセスが作成および実行中のプロセスに関連するすべてのカーネルリソースを使い果たしたため、2番目のxtermのZシェルを正常に呼び出すことはできません。

答え2

フォーク爆弾が動作するのを防ぐために用意できる安全装置はたくさんあります。

最も簡単なのは次のとおりです。

ulimit -u 1024

ユーザープロセスの数を1024に制限します。

システム保護を迂回する場合は、確かにそうする方法を見つけることができますが、ここでは誰もそうする方法を提供しないようです。ただし、デフォルトではシステムにPIDが不足しているため再生成できません。爆弾がCPUの100%を占め、より多くの爆弾を生成しようとすると、デフォルトでは完全に停止します。

答え3

フォーク爆弾がどのように機能するかを本当に理解したい場合は、たとえば実行してもう一度警告を:(){ :|:& }受けてください:。 Ubuntuで直接試してみました。システムが停止します!

簡単に分析してみましょう。

:() { #Define a new shell function
  :|:& #Pipe function named ':' through itself, creating two copies of itself, and make them run in the background
} #End of function definition block
;: #Call the ':' function. Note how the function is defined with two calls to itself piped through each other. This starts a chain reaction: those two copies will in turn create two more, and so on, ad infinitum

この種のダメージを与えようとするときは、この点に注意してください。

答え4

これは可能ですが、ファイル名がfile.pyであることを確認してください。

import os 
while True
  os.startfile(file.py)

次に実行します。

python file.py

関連情報