Поможет ли глобальное присвоение псевдонима форк-бомбе предотвратить ее выполнение?

Поможет ли глобальное присвоение псевдонима форк-бомбе предотвратить ее выполнение?

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

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

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

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

решение1

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

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

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

    (, ), &, |и пробелы отсутствуют в Bash 4.4.

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

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

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

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

Что-то вроде этого /etc/security/limits.confустановит жесткое ограничение в 50 процессов для всех пользователей:

*        hard    nproc           50

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

решение2

Нет. Существует слишком много способов написать форк-бомбу.

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

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

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

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

решение3

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

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

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

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

решение4

Дважды — нет.

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

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

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

Связанный контент