0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

fork爆弾、見つけました。

Posted at

誰かがすでに見つけているかもしれませんが、新しいfork爆弾を見つけたので書いておうと思います。
fork爆弾について知らない人は

を見てください。

見つけたものは以下です。

:()(:|:&);:

wikipediaに書いてある有名なやつは13文字(不要なスペースを消ば12文字)ですが、これは11文字でちょっと短いです。

有名なfork爆弾は

:(){ :|:& };:

というもので、わかりやすく書き直すと、以下のようになります。


main () 
{
    main | main &
};

main

これはgroup_commandを呼び出す関数mainを定義し、main内部でバックグラウンドプロセスを再帰的に呼び出すことで、
大量のプロセスを作るというものです。

一方、今回の爆弾をわかりやすく書き直すと、
以下のようになります。

main () 
( 
    main | main &
); 

main

これはsubshellを呼び出す関数mainを定義し、その中でmainを再帰的に呼び出します。
subshellがforkしている場合は、forkしてから更に2回forkするので、合計3回forkすると思われます。


bashの関数の定義方法ははparse.yの930行目あたりで以下のように定義されています。


function_def 
: WORD '(' ')' newline_list function_body
| FUNCTION WORD '(' ')' newline_list function_body
| FUNCTION WORD function_body
| FUNCTION WORD '\n' newline_list function_body
;

newline_list
: 
| newline_list '\n'
;

function_body
: shell_command
| shell_command redirection_list
;

私は、関数定義の際は '{' '}' を使って定義するのだと思い込んでいたのですが、定義を見る限り、関数の内容の部分はshell_commandと認識されるものであればなんでもいいようです。
つまり、以下のように書いても関数が定義できることがわかります。

#WORD '(' ')' newline_list for_command
func1() for i in $(seq 10); do echo hello;done

#WORD '(' ')' newline_list while_command
func2() while文

#WORD '(' ')' newline_list subshell
func3() (サブシェル)

#WORD '(' ')' newline_list group_command
func4() {グループコマンド}

よく見る関数の定義

main () 
{
    echo hello;
}

はグループコマンドを使った定義方法です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?