Будет ли глобальное наложение псевдонима бомбой-вилкой препятствовать ее выполнению?


15

Если бы вы были глобально установлены

alias ':(){ :|:& };:'='echo fork bomb averted'

будет ли это эффективной стратегией безопасности, позволяющей избежать бомбардировки бомбами Bash, или все же найдется способ ее выполнить?

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


1
@ user1717828, «бомба-вилка» - это программа, которая всегда запускает новые свои копии навсегда. Результирующий экспоненциальный рост числа запущенных программ обычно приводит к тому, что что-то ломается в короткие сроки.
Марка

1
Даже если бы это сработало - это не защитило бы программу, которая вызывает fork () и не проходила через bash?
UKMonkey

2
: () {: |: &: |: &} ;:
Джошуа

3
Просто бегиa(){ a|a& };a
user253751

1
Вы бы избегали общей формы (если бы вы заставили ее работать вообще), но возможны почти бесконечные вариации.
Мачта

Ответы:


52

Два , нет, три , ... Среди основных препятствий на пути , которые являются:

  1. Это не допустимое имя для псевдонима. Электронное руководство Bash :

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

    (, ), &, |И пробелы могут в Bash 4.4.

  2. Эта конкретная строка - не единственный способ написать бомбу в оболочке, просто известную, потому что она выглядит неясной. Например, нет необходимости вызывать функцию :вместо чего-то, фактически составленного из букв.

  3. Если бы вы могли установить псевдоним, пользователь мог бы удалить псевдоним, обойти его путем экранирования имени псевдонима в командной строке или вообще отключить псевдонимы, возможно, запустив функцию в скрипте (Bash не раскрывает псевдонимы в неинтерактивных оболочках) ,

  4. Даже если оболочка достаточно ограничена, чтобы остановить все версии бомбы-вилки, система общего назначения будет иметь другие программируемые утилиты, которые могут рекурсивно обрабатывать подпроцессы. Есть Perl или компилятор C? Достаточно просто. Даже awk мог бы это сделать. Даже если они не установлены, вам также нужно будет запретить пользователю /bin/shвводить скомпилированные двоичные файлы извне системы или запускать, которая, вероятно, должна быть полностью работоспособной оболочкой для функционирования остальной системы.

Просто используйте ulimit -u(т.е. RLIMIT_NPROC) или эквивалентный, чтобы ограничить количество процессов, которые может запустить пользователь. В большинстве систем Linux есть pam_limitsвозможность установить предел количества процессов до запуска любых выбранных пользователем команд.

Примерно так можно /etc/security/limits.confбыло бы установить жесткий предел в 50 процессов для всех пользователей:

*        hard    nproc           50

(Стивен Китт уже упоминал пункт 1, Джефф Шаллер упомянул 2 и 3.)


Можно ли написать вилочную бомбу без &?
Стивен Китт

4
@ StefhenKitt Я не уверен на 100%, но я предполагаю, что bash завершен. Если это так, вероятно, есть бесконечные возможности. Например, вы можете разобрать ascii char-code 38 и выполнить его.
Мари

@Marie в этом конкретном контексте, вы также должны избегать любых других запрещенных символов, обходя &ограничение.
Стивен Китт,

15
Моя точка зрения заключалась в том, что пытаться занести в черный список плохую функциональность - плохая идея Есть почти всегда способы обойти.
Мари

2
@Marie: Bash вполне определенно завершен.
Приостановлено до дальнейшего уведомления.

18

Нет. Есть слишком много способов написать вилочную бомбу.

Злой писатель-бомбардировщик просто попробует еще раз с другим именем функции. Или другие изменения, пока его бомба не преуспеет.

Случайный писатель-бомбардировщик не будет производить каноническую вилочную бомбу.

На самом деле довольно легко стать непреднамеренным писателем-бомбардировщиком. Например, вы можете просто использовать рекурсив makeс внешним, непроверенным cd, комбинируя его с -jопцией и несуществующими подкаталогами - реальный пример, на который я наткнулся однажды.

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


14

Вы не можете использовать псевдоним в виде бомбы, потому что это неверное имя :

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name

Символы '/', '$', '`', '=' и любые метасимволы оболочки или символы цитирования, перечисленные выше, могут не отображаться в псевдониме.

Некоторые оболочки не проверяют псевдонимы, когда они объявлены, но при интерпретации команд и пропускают неверное имя. Всегда будет вилка &, которая не может быть включена в действительное псевдоним, поэтому защитить себя таким способом невозможно.


Разрешает ли оболочка устанавливать этот псевдоним или нет, не имеет значения. Важно то, что даже если такой псевдоним существует, он не раскрывается при интерпретации команд, поскольку имя псевдонима не соответствует разрешенному шаблону. dashи, boshнапример, оба молча игнорируют это.
Шили

10

Дважды нет.

Это не единственный способ написать бомбу.

Есть также несколько способов выполнить «команду» при наличии псевдонима:

command the-command
\the-command

Пример:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png

Не связано с основной темой, но почему \lsпоказало, output.pngно command lsне показало ?
nxnev

Хорошо подмечено! Это действительно не имеет отношения к основной теме. Это классическая ошибка PEBCAK, когда я копирую / неправильно вставляю (или очищаю промежуточный файл output.png). Я исправлю это, чтобы свести к минимуму отвлекающие факторы. Спасибо, @nxnev!
Джефф Шаллер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.