
Если бы вы глобально установили
alias ':(){ :|:& };:'='echo fork bomb averted'
Будет ли это эффективной стратегией безопасности, позволяющей избежать выполнения форк-бомбы Bash, или все же есть способ ее выполнить?
Полагаю, вопрос сводится к следующему: есть ли способ выполнить команду, если она связана с чем-то другим?
решение1
Два , нет, три , ... Среди основных препятствий на этом пути:
Это недопустимое имя для псевдонима.Онлайн-руководство Bash:
Символы ... и любые метасимволы оболочки или символы кавычек, перечисленные выше, не могут встречаться в имени псевдонима.
(
,)
,&
,|
и пробелы отсутствуют в Bash 4.4.Эта конкретная строка — не единственный способ написать fork bomb в оболочке, просто известная, потому что выглядит непонятной. Например, нет необходимости вызывать функцию
:
вместо чего-то, что на самом деле состоит из букв.Если бы вы могли установить псевдоним, пользователь мог бы отменить его установку, обойти его, экранировав имя псевдонима в командной строке, или вообще отключить псевдонимы, возможно, запустив функцию в скрипте (Bash не расширяет псевдонимы в неинтерактивных оболочках).
Даже если оболочка достаточно ограничена, чтобы остановить все версии 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
, комбинируя его с -j
option и несуществующими подкаталогами — реальный пример, на который я однажды наткнулся.
Вы не можете защитить себя от всех возможностей, и уж тем более от решительного нападающего.Все, чего вы добьетесь, — это повысите сложность вашей системы.
решение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