フォークボムはどのように機能しますか?


22
  • 警告は、生産マシンでこれを実行しようとしないでください

トピックに関するウィキペディアのページを読むとき、私は通常、次のコードで何が起こっているのかを追跡します。

:(){ :|:& };:

説明の抜粋

次のフォーク爆弾は、2002年に芸術として発表されました。56 その正確な起源は不明ですが、2002年より前にUsenetに存在していました。爆弾は、次の13文字をbashzshなどのUNIXシェルに貼り付けることで実行され ます。「:」という関数を定義して動作します。この関数は、フォアグラウンドで1回、バックグラウンドで1回の2回呼び出されます。

ただし、最後の部分は完全には明確ではありません。関数定義が表示されます:

:(){ ... }

しかし、他に何が起こっていますか?また、のような他のシェルを行うkshcshtcshも似たようなを構築することができるという同じ運命に苦しみますか?


2
この1つは、スタック交換にかなり頻繁にポップアップし、良い答えはここにある:stackoverflow.com/questions/991142/...
Dravスローン

@DravSloan-私はここでそのコンテンツのいくつかを作成しようとしていました、私の質問はそのように少しロードされています8-)。
slm

「神の愛のために、これを実動マシンで実行しないでください。または、実行しているマシンを使い続けたい場合は!!」を追加することができます。メッセージ:)
Drav Sloan

1
@MartinSchröder-あなたは、この質問が、その質問が尋ねられるようになったことを理解していますか?8-)。私は金曜日の夜にこれを頼んで何かを始めた後、1時間か2時間後に他の質問が来ました。
slm

1
@MartinSchröder-おそらく別々にすることをお勧めします。わずかに異なります。これは、フォーク爆弾がどのように機能するかについての全体的な詳細なビューを求めています。他の人は、フォーク爆弾内でシステムがフォークしている仕組みの背後にあるメカニズムに関する詳細を求めています。私はそれが関連しているb / cを混乱させるように見えるかもしれないことを知っていますが、それらは異なっています(IMO-明らかに)。私は他のQにさえ答えて、フォークを駆動しているボンネットの下のメカニズムを表示しようとしましたが、重複としてフラグを立てませんでした。
slm

回答:


23

このフォーク爆弾は、AIプログラミングの教師が「再帰を理解するには、まず再帰を理解する必要がある」という最初のレッスンの1つで言ったことをいつも思い出させます。

基本的に、この爆弾は再帰的な機能です。本質的に、システムリソースが消費されるまで、自分自身を呼び出し、自分自身を呼び出し、自分自身を呼び出す関数を作成します。この特定の例では、関数をそれ自体にパイピングし、それをバックグラウンド化することにより、再帰が増幅されます。

StackOverflowでこれが回答されているのを見てきましたが、それが一目でわかりやすいからです(上のリンクから盗まれた...)

☃(){ ☃|☃& };☃

☃() { ... }本体がそれ自体を呼び出すバグ関数(バグ関数)、出力をそれ自体にパイピング(バグ関数)し ☃|☃、結果をバックグラウンド化するバグ関数を定義し&ます。次に、関数が定義された後、実際にバグ関数を呼び出します; ☃

少なくとも私のArch VMでは、プロセスをバックグラウンドにする必要は、同じ最終結果を得るため、利用可能なすべてのプロセススペースを消費し、ホストをb0rkedにするための要件ではないことに注意してください。実際に、私は時々暴走プロセスを終了するように見えると言いました、そしてそれのスクリーンフル-bash: fork: Resource temporarily unavailableが停止すると停止しますTerminated(そしてjournalctlbashコアダンプを示します)。

csh / tcshについての質問に答えるために、これらのシェルはどちらも機能をサポートしていないため、エイリアスしかできません。そのため、これらのシェルでは、自分自身を再帰的に呼び出すシェルスクリプトを作成する必要があります。

zshは同じ運命(同じコード)に苦しんでいるようで、コアダンプせず、Archにを与えますOut of memory: Kill process 216 (zsh) score 0 or sacrifice child.が、それでも分岐を続けます。しばらくすると、状態Killed process 162 (systemd-logind) ...が示されます(そして、依然としてフォークzshが続きます)。

Archにはpacmankshのバージョンがないようですので、代わりにdebianで試してみる必要がありました。kshオブジェクトを:関数名として使用しますが、何かを使用すると、b()代わりに望ましい結果が得られるようです。


それらのキャラクターは何ですか?私はそれらがバグであることを知っていますが、どのようにしてそれらを作りましたか?
slm

10
小さなフォントサイズではバグのように見えますが、実際には雪だるまであることがわかります。これはユニコード文字U + 2603で、スペースなしで&#x 2603と入力することにより、htmlで表示できます。
サンブラー

2
Linuxでは、かなりの数のGnome関連アプリとFirefoxがサポートしているCtrl+Shift+u+<hex>ようです。hexは、表示するUnicode文字の16進コードです。表示可能なUnicodeのリストは、fileformat.info / info / unicode / utf8test.htmにあります(奇数のほとんどは「その他」セクションにあります)。Windowsはsuperuser.com/questions/47420/…をチェックアウトする必要があり、リンクに記載されているツールを個人的に使用するunicodeinput.exeか、ブラウザーでカットアンドペーストします。samblerが推奨するように、いつでもhtmlシーケンスを使用できます。
Dravスローン

1
ウィキまた、Unicode文字のリストを持っていますen.wikipedia.org/wiki/List_of_Unicode_characters
Dravスローン

私は雪だるまのバグが好きで、ここで使用しているバグは私のシステムには表示されません。🐛は16進数の入った箱のように見えます。
テルドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.