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シェルを正常に呼び出すことはできません。

おすすめ記事