この不可解なBashコマンドはどういう意味ですか?


23

私は悪意のあるコマンドに関するUbuntuフォーラムの警告を読んでいて、この興味深い宝石を見つけました。

:(){ :|:& };:

警告:上記のコード、厳密なproc制限が設定されていない(おそらく設定されていない)場合にハードリスタートを要求しない限り、マシンクラッシュさせます。

このコードは、実行に似ていると考えてくださいsudo rm -rf /

しかし、それはどういう意味ですか?プログラミングの経験があっても、アセンブリ言語ではない暗号のようなコマンドを見たことはありません。


16
追加のポイント:これは実際にはに似ていませんsudo rm -rf /。このコマンドはすべてのファイルを削除します。これは、マシンのリソースが使用できなくなり、再起動するまで、マシンのリソースを詰まらせるだけです。
jtbandes

@jtban:次に編集します。どちらのコードも、実行するには「危険」だと考えています。はいsudo rm -rf /もっと危険ですが、リモートサーバーでこれを実行する人を見たことがあります。コントロールパネルにアクセスせずに再起動するのに苦労する「何をしたかを確認したかっただけです
ジョシュK

7
そのemotibomb:P
RCIX

可能性があることに注意してくださいarbitrary_name(){ arbitrary_name|arbitrary_name& };arbitrary_name。この名前:は、このコマンドを短くてわかりにくいものにするだけでなく何も:ないビルトインを多くのことをする関数に変えます。その定義:(){ :|:& }を他の誰かの環境に忍び込ませて、そこにとどまらせておくと、被害者がそれを最も期待しなくなっときに攻撃されます。
カミルマシオロウスキ

回答:


40

あなたが言ったように、それはフォークボムです。それがすることは、関数を定義し、それを呼び出すことです。関数が呼び出され:ます。

名前を付けてforkbomb、何が起こっているかをよりよく確認できるようにします。

forkbomb(){ forkbomb|forkbomb& };forkbomb

ご覧のように、おそらくプログラミングの経験から推測すると、最初の部分は関数定義(forkbomb(){ ... })であり、最後の:部分は関数が呼び出される場所(;Bashのステートメントを分離するだけ)です。

さて、この関数は何をしますか?Bashに精通している場合は、|文字が1つのコマンド/プログラムの標準出力を別のコマンド/プログラムの標準入力にパイプすることがわかります。したがって、基本的に、関数の2つのインスタンスを:|:起動します(これが「分岐」する場所です)。

そして魔法:&これらのコマンドをバックグラウンドに入れて、元の機能を返すことができますが、各インスタンスはバックグラウンドで牛が帰宅するまでフォークし、すべてのリソースを使い果たしてシステムを停止します(制限がない限り)それに課せられた)。


1
素晴らしい答えです!関数名として:を使用できるとは思いませんでした。名前の変更が役立ちます。3分で受け入れます。
TheLQ

1
+1クール...すばらしい説明。これは、OSタスクスイッチャーのスタックオーバーフローのようなものです。それは実際にカーネルをクラッシュさせますか、それとも使用するのが耐えられなくなるまでリソースを使い果たしますか?
エヴァンプライス

少なくとも直接ではなく、実際にカーネルがクラッシュするとは思わない。指数関数的にさらに多くのプロセスを作成し続けます。各プロセスはCPUとメモリを占有し、プロセッサがそれらすべてを処理しようとすると、本当に使用できなくなります。カーネルは負荷の下で最終的にクラッシュする可能性があります(わかりません)が、それまでは使用できません。
jtbandes

3
:実際に関数を実行するfinalを説明することを忘れないでください!
-Phoshi

@Phoshi:私がやったと思ったが、明確にするために編集します!
jtbandes

9

ウィキペディアの記事Forkbombから引用

:()      # define ':' -- whenever we say ':', do this:
{        # beginning of what to do when we say ':'
    :    # load another copy of the ':' function into memory...
    |    # ...and pipe its output to...
    :    # ...another copy of ':' function, which has to be loaded into memory
         # (therefore, ':|:' simply gets two copies of ':' loaded whenever ':' is called)
    &    # disown the functions -- if the first ':' is killed,
         #     all of the functions that it has started should NOT be auto-killed
}        # end of what to do when we say ':'
;        # Having defined ':', we should now...
:        # ...call ':', initiating a chain-reaction: each ':' will start two more.

7

分解:

: () // Define ':' as a function. When you type ':' do the following
{
    : // Call ':' 
    | // Redirect output
    : // Into ':'
    & // Push process to the background
}; // End of ':' def
: // Now do ':'

に変更:bomb、あなたが持っている:

bomb(){ bomb|bomb& };bomb

とてもエレガントです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.