В вычислительной технике форк-бомба ( также называемая вирусом-кроликом ) представляет собой атаку типа «отказ в обслуживании» (DoS) , при которой процесс непрерывно копирует себя, истощая доступные системные ресурсы, замедляя или вызывая сбой системы из-за нехватки ресурсов .
Около 1978 года сообщалось о раннем варианте форк-бомбы под названием wabbit, запущенной на System/360 . Возможно, она произошла от похожей атаки под названием RABBITS, о которой сообщалось в 1969 году на Burroughs 5500 в Вашингтонском университете . [1]
Форк-бомбы работают как за счет потребления процессорного времени в процессе разветвления , так и за счет переполнения таблицы процессов операционной системы . [2] [3] Базовая реализация форк-бомбы — это бесконечный цикл , который многократно запускает новые копии самого себя.
В операционных системах типа Unix fork-бомбы обычно пишутся для использования системного вызова fork . [3] Поскольку разветвленные процессы также являются копиями первой программы, как только они возобновляют выполнение со следующего адреса по указателю кадра , они продолжают разветвляться бесконечно внутри своей собственной копии того же бесконечного цикла. Это приводит к экспоненциальному росту процессов. Поскольку современные системы Unix обычно используют технику управления ресурсами «копирование при записи» при разветвлении новых процессов, [4] fork-бомба обычно не переполняет память такой системы.
Операционные системы Microsoft Windows не имеют эквивалентной функциональности системному вызову fork Unix; [5] поэтому fork-бомба в такой операционной системе должна создавать новый процесс вместо ответвления от существующего, например, с помощью batch echo %0^|%0 > $_.cmd & $_
. В этом пакетном скрипте %0|%0
записывается в $.cmd
, который затем выполняется & $_
. [6]
Классический пример форк-бомбы — это программа, написанная в оболочке Unix :(){ :|:& };:
, возможно, датируемая 1999 годом [7], которую проще всего понять как
вилка () { вилка | вилка & } вилка
В нем функция определяется ( fork()
) как вызывающая сама себя ( fork
), а затем передающая ( |
) свой результат в себя, и все это в фоновом задании ( &
).
Код, использующий двоеточие :
в качестве имени функции, недопустим в оболочке, как определено в POSIX, который допускает только буквенно-цифровые символы и подчеркивания в именах функций. [8] Однако его использование разрешено в GNU Bash в качестве расширения. [9]
Поскольку режим работы fork-бомбы полностью инкапсулирован путем создания новых процессов, один из способов предотвращения серьезного влияния fork-бомбы на всю систему — это ограничение максимального количества процессов, которыми может владеть один пользователь. В Linux это можно сделать с помощью утилиты ulimit ; например, команда ulimit -u 30
ограничит затронутого пользователя максимум тридцатью принадлежащими ему процессами. [10]
В системах с поддержкой PAM этот предел также можно установить в /etc/security/limits.conf
, [11]
а в *BSD системный администратор может установить ограничения в /etc/login.conf
. [12]
Современные системы Linux также позволяют более точно предотвращать fork-бомбы с помощью cgroups и контроллеров номеров процессов (PID). [13]
bash$ :(){ :|:&};:}
Имя: в командном языке оболочки слово, состоящее исключительно из подчеркиваний, цифр и букв алфавита из переносимого набора символов. Первый символ имени не является цифрой.
Когда оболочка находится в режиме POSIX (см. Режим Bash POSIX), fname должно быть допустимым именем оболочки и не может совпадать с одним из специальных встроенных имен (см. Специальные встроенные имена). В режиме по умолчанию имя функции может быть любым словом оболочки без кавычек, которое не содержит '$'.