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