Недавно я копал информацию о процессах в GNU / Linux и встретил печально известную вилочную бомбу:
:(){ : | :& }; :
Теоретически предполагается, что она будет дублироваться бесконечно, пока в системе не закончатся ресурсы ...
Тем не менее, я пробовал тестировать как на CLI Debian, так и на графическом дистрибутиве Mint , и это, похоже, не сильно влияет на систему. Да, есть тонны процессов, которые создаются, и через некоторое время я читаю в консоли сообщения вроде:
bash: fork: ресурс временно недоступен
bash: fork: retry: нет дочерних процессов
Но через некоторое время все процессы просто убиваются, и все возвращается к нормальной жизни. Я читал, что ulimit устанавливает максимальное количество процессов для каждого пользователя, но я не могу поднять его действительно далеко.
Какие системы защиты от вилочной бомбы? Почему он не копирует себя, пока все не замерзнет или, по крайней мере, не сильно отстает? Есть ли способ действительно разбить систему с помощью вилочной бомбы?
:(){ :& :; }; :
вместо этого? Они тоже все в конечном итоге погибают? Как насчет:(){ while :& do :& done; }; :
?Ответы:
Возможно, у вас есть дистрибутив Linux, использующий systemd.
Systemd создает группу для каждого пользователя, и все процессы пользователя принадлежат одной и той же группе.
Cgroups - это механизм Linux, устанавливающий ограничения на системные ресурсы, такие как максимальное количество процессов, циклы ЦП, использование ОЗУ и т. Д. Это другой, более современный уровень ограничения ресурсов, чем
ulimit
(который используетgetrlimit()
системный вызов).Если вы запустите
systemctl status user-<uid>.slice
(который представляет cgroup пользователя), вы увидите текущее и максимальное количество задач (процессов и потоков), которые разрешены в этой cgroup.По умолчанию максимальное количество задач, которое systemd разрешает для каждого пользователя, составляет 33% от «общесистемного максимума» (
sysctl kernel.threads-max
); обычно это составляет около 10000 задач. Если вы хотите изменить это ограничение:В systemd v239 и более поздних версиях пользователь по умолчанию устанавливается через TasksMax = in:
Чтобы настроить ограничение для конкретного пользователя (которое будет применено сразу же, а также сохранено в /etc/systemd/system.control), выполните:
Здесь также можно использовать обычные механизмы переопределения настроек устройства (например,
systemctl edit
), но они потребуют перезагрузки. Например, если вы хотите изменить ограничение для каждого пользователя, вы можете создать/etc/systemd/system/user-.slice.d/15-limits.conf
.В systemd v238 и более ранних версиях пользователь по умолчанию устанавливается через UserTasksMax = in
/etc/systemd/logind.conf
. Изменение значения обычно требует перезагрузки.Подробнее об этом:
источник
Это больше не приведет к краху современных систем Linux.
Он создает запасы процессов, но на самом деле не сжигает столько ЦП, поскольку процессы простаивают. Вы исчерпали слоты в таблице процессов, прежде чем исчерпали оперативную память.
Если вы не ограничены в cgroup, как указывает Hkoof, следующее изменение по-прежнему разрушает системы:
источник
fork
снова и снова), а оставшуюся часть времени выполняет вызов функции (постепенно увеличивая использование памяти для каждого вызова в стеке вызовов оболочки, предположительно).:(){ :& :; }; :
вместо той, о которой идет речь. Я на самом деле не полностью продумал поток выполнения архетипического, как дано.Еще в 90-х я случайно спустил одну из них на себя. Я случайно установил бит выполнения в исходном файле C, в котором была команда fork (). Когда я дважды щелкнул по нему, csh попытался запустить его, а не открыть его в редакторе, как я хотел.
Даже тогда это не сломало систему. Unix достаточно устойчив, чтобы ваша учетная запись и / или ОС имели ограничение по процессу. Вместо этого все становится очень вялым, и все, что нужно для запуска процесса, может потерпеть неудачу.
За кулисами происходит то, что таблица процессов заполняется процессами, которые пытаются создать новые процессы. Если один из них завершает работу (либо из-за ошибки на форке, потому что таблица процессов заполнена, либо из-за отчаянного оператора, пытающегося восстановить работоспособность своей системы), один из других процессов будет радостно разветвлять новый для заполнения. пустота.
«Вилочная бомба» - это, по сути, непреднамеренно самовосстанавливающаяся система процессов, задача которых - сохранить таблицу процессов заполненной. Единственный способ остановить это - убить их всех сразу.
источник
-1
не флаг.kill
принимает только одну опцию, затем останавливает парсинг опций. Это убивает идентификатор процесса-1
, который является псевдонимом для всех процессов.