Если бы вы были глобально установлены
alias ':(){ :|:& };:'='echo fork bomb averted'
будет ли это эффективной стратегией безопасности, позволяющей избежать бомбардировки бомбами Bash, или все же найдется способ ее выполнить?
Я предполагаю, что вопрос сводится к следующему: есть ли способ выполнить команду, когда она имеет псевдоним для чего-то другого?
a(){ a|a& };a
Ответы:
Два, нет,три, ... Среди основных препятствий на пути , которые являются:Это не допустимое имя для псевдонима. Электронное руководство Bash :
(
,)
,&
,|
И пробелы могут в Bash 4.4.Эта конкретная строка - не единственный способ написать бомбу в оболочке, просто известную, потому что она выглядит неясной. Например, нет необходимости вызывать функцию
:
вместо чего-то, фактически составленного из букв.Если бы вы могли установить псевдоним, пользователь мог бы удалить псевдоним, обойти его путем экранирования имени псевдонима в командной строке или вообще отключить псевдонимы, возможно, запустив функцию в скрипте (Bash не раскрывает псевдонимы в неинтерактивных оболочках) ,
Даже если оболочка достаточно ограничена, чтобы остановить все версии бомбы-вилки, система общего назначения будет иметь другие программируемые утилиты, которые могут рекурсивно обрабатывать подпроцессы. Есть Perl или компилятор C? Достаточно просто. Даже awk мог бы это сделать. Даже если они не установлены, вам также нужно будет запретить пользователю
/bin/sh
вводить скомпилированные двоичные файлы извне системы или запускать, которая, вероятно, должна быть полностью работоспособной оболочкой для функционирования остальной системы.Просто используйте
ulimit -u
(т.е.RLIMIT_NPROC
) или эквивалентный, чтобы ограничить количество процессов, которые может запустить пользователь. В большинстве систем Linux естьpam_limits
возможность установить предел количества процессов до запуска любых выбранных пользователем команд.Примерно так можно
/etc/security/limits.conf
было бы установить жесткий предел в 50 процессов для всех пользователей:(Стивен Китт уже упоминал пункт 1, Джефф Шаллер упомянул 2 и 3.)
источник
&
?&
ограничение.Нет. Есть слишком много способов написать вилочную бомбу.
Злой писатель-бомбардировщик просто попробует еще раз с другим именем функции. Или другие изменения, пока его бомба не преуспеет.
Случайный писатель-бомбардировщик не будет производить каноническую вилочную бомбу.
На самом деле довольно легко стать непреднамеренным писателем-бомбардировщиком. Например, вы можете просто использовать рекурсив
make
с внешним, непровереннымcd
, комбинируя его с-j
опцией и несуществующими подкаталогами - реальный пример, на который я наткнулся однажды.Вы не можете защититься от всех возможностей, и, безусловно, не против решительного злоумышленника.Все, чего вы добьетесь, это увеличит сложность вашей системы.
источник
Вы не можете использовать псевдоним в виде бомбы, потому что это неверное имя :
Некоторые оболочки не проверяют псевдонимы, когда они объявлены, но при интерпретации команд и пропускают неверное имя. Всегда будет вилка
&
, которая не может быть включена в действительное псевдоним, поэтому защитить себя таким способом невозможно.источник
dash
и,bosh
например, оба молча игнорируют это.Дважды нет.
Это не единственный способ написать бомбу.
Есть также несколько способов выполнить «команду» при наличии псевдонима:
Пример:
источник
\ls
показало,output.png
ноcommand ls
не показало ?