stringtranslate.com

Вилочная бомба

Концепция форк-бомбы — процессы постоянно воспроизводят себя, что может привести к отказу в обслуживании.

В вычислительной технике форк-бомба ( также называемая вирусом-кроликом ) представляет собой атаку типа «отказ в обслуживании» (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]

Смотрите также

Ссылки

  1. ^ Раймонд, Эрик С. (1 октября 2004 г.). "ваббит". Жаргонный лексикон. Архивировано из оригинала 15 мая 2012 года . Проверено 15 октября 2013 г.
  2. ^ Йе, Нонг (2008). Безопасные компьютерные и сетевые системы: моделирование, анализ и проектирование . John Wiley & Sons. стр. 16. ISBN 978-0470023242.
  3. ^ ab Jielin, Dong (2007). Сетевой словарь . стр. 200. ISBN 978-1602670006.
  4. ^ Dhamdhere, Dhananjay M. (2006). Операционные системы: концептуальный подход . McGraw-Hill Higher Education. стр. 285. ISBN 0-07-061194-7.
  5. ^ Хаммонд, Марк (2000). Программирование на Python на Win32: Помощь программистам Windows . "O'Reilly Media, Inc.". стр. 35. ISBN 1565926218.
  6. Enderman (26 июня 2024 г.). @echo.%0^|%0›$^_^.c^md&$_›nul . Получено 30 июня 2024 г. – через YouTube.
  7. Михал Залевски (19 августа 1999 г.). "[RHSA-1999:028-01] Переполнение буфера в libtermcap tgetent()". Группа новостей : muc.lists.bugtraq . Получено 10 декабря 2022 г.bash$ :(){ :|:&};:}
  8. ^ "The Open Group Base Specifications Issue 7, 2018 edition IEEE Std 1003.1™-2017 Section 3.235". The Open Group/IEEE. Имя: в командном языке оболочки слово, состоящее исключительно из подчеркиваний, цифр и букв алфавита из переносимого набора символов. Первый символ имени не является цифрой.
  9. ^ "Справочное руководство GNU Bash, раздел 3.3" . Получено 11 декабря 2022 г. Когда оболочка находится в режиме POSIX (см. Режим Bash POSIX), fname должно быть допустимым именем оболочки и не может совпадать с одним из специальных встроенных имен (см. Специальные встроенные имена). В режиме по умолчанию имя функции может быть любым словом оболочки без кавычек, которое не содержит '$'.
  10. ^ Купер, Мендель (2005). Advanced Bash Scripting Guide . стр. 305–306. ISBN 1430319305.
  11. ^ Soyinka, Wale (2012). Администрирование Linux: Руководство для начинающих . McGraw Hill Professional. стр. 364–365. ISBN 978-0071767590.
  12. ^ Лукас, Майкл В. (2007). Absolute FreeBSD: Полное руководство по FreeBSD . No Starch Press. стр. 198–199. ISBN 978-1593271510.
  13. ^ "Process Number Controller in Documentation/ as appear in Linux kernel 5.3". 8 октября 2019 г. Архивировано из оригинала 8 октября 2019 г. Получено 8 октября 2019 г.

Внешние ссылки