Найти в Дзене

Fork-бомба в Linux

Пожалуй, начнём. Вот такая последовательность символов в Linux может вывести вашу систему из строя: :(){ :|:& };: ПРИМЕЧАНИЕ: не следует запускать эту команду! Это — Fork-бомба. При запуске такой команды система начинает потреблять все системные ресурсы (не всегда) и выйдет из строя. Лечится перезагрузкой. Вероятно, первые fork-бомбы появились из-за ошибок при программировании. Бесконечные циклы, рекурсии, утечки памяти... Fork-бомбу можно воспринимать в качестве DoS атаки (отказ в обслуживании). При работе программа начинает копировать сама себя и в итоге использует 100% системных ресурсов, пока система не выйдет из строя. Программы в Unix выполняются с помощью комбинации двух системных вызовов, называемых fork и exec. Один процесс порождает другой, либо заменяя себя по завершении — exec,  либо, если ему нужно остаться, создавая копию самого себя — fork. Отсюда и название бомбы. Fork bomb — это процесс бесконечного создания форка самого себя до тех пор, пока в системе не останется рес
Оглавление

Пожалуй, начнём.

Вот такая последовательность символов в Linux может вывести вашу систему из строя:

:(){ :|:& };:

ПРИМЕЧАНИЕ: не следует запускать эту команду!

Это — Fork-бомба.

При запуске такой команды система начинает потреблять все системные ресурсы (не всегда) и выйдет из строя. Лечится перезагрузкой.

Вероятно, первые fork-бомбы появились из-за ошибок при программировании. Бесконечные циклы, рекурсии, утечки памяти...

Что такое fork-бомба?

Fork-бомбу можно воспринимать в качестве DoS атаки (отказ в обслуживании). При работе программа начинает копировать сама себя и в итоге использует 100% системных ресурсов, пока система не выйдет из строя.

Программы в Unix выполняются с помощью комбинации двух системных вызовов, называемых fork и exec. Один процесс порождает другой, либо заменяя себя по завершении — exec,  либо, если ему нужно остаться, создавая копию самого себя — fork. Отсюда и название бомбы.

Fork bomb — это процесс бесконечного создания форка самого себя до тех пор, пока в системе не останется ресурсов.

-2

:(){ :|:& };: – Как это работает?

Fork-бомба в Linux популярна, потому как состоит всего лишь из нескольких специальных символов, а не из длинного кода.

  • :() — определяет функцию с именем : без аргументов. Двоеточие является легитимным именем функции в bash.
  • {} — тело функции.
  • :|: — простая реализация рекурсии. Функция загружает себя в память, затем через пайп вызывает второй экземпляр себя.
  • & — запуск функции в фоновом режиме.
  • ; — разделение команд.
  • : — запуск созданной функции, по сути старт цепной реакции.

Можно заменить двоеточие на другое имя, более понятное глазу, например, на fork:

fork() {
fork | fork &
}
fork

Fork-бомба работает не везде

В Ubuntu и дистрибутивах Linux с systemd fork-бомба не сработает. Вернее сработает, но систему не остановит.

Systemd создает cgroup для каждого пользователя, что определяет максимальное количество процессов. По умолчанию пользователь может использовать 33% от их общего числа.

Как защититься от fork-бомбы

Защититься можно путём ограничения максимального количества используемых пользователем процессов. Эту цифру можно узнать командой:

ulimit -u
-3

В разных дистрибутивах и версиях Linux эта цифра может отличаться. Изменить для текущего пользователя можно командой:

ulimit -S -u 5000

Более правильный метод: отредактировать для группы в /etc/security/limits.conf. Ограничим параметр для группы wheel:

@wheel hard nproc 5000

Для пользователя lab:

lab hard nproc 5000

В заключение

Автор данного кода разработчик программного обеспечения с открытым исходным кодом Jaromil. Он считает, что это произведение искусства.

И верно,  11 специальных символов, и программа выводит систему из строя.

Другие ОС

В других операционных системах и языках программирования тоже возможно создание fork-бомб. И bash — не единственный вариант. К примеру, как вам такой вариант в BAT файле windows?

start %0 %0

C:

#include <stdlib.h>
int main(void)
{
for(;;) {
system("start");
}
}

Java:

public class forkbomb
{
   public static void main(String[] args)
   {
       Runtime.getRuntime().exec(new String[]{"javaw", "-cp", System.getProperty("java.class.path"), "forkbomb"});
   }
}

Perl:

fork while fork

Python:

import os

while True:
os.fork()

И так далее...

Источник:

Fork-бомба в Linux | internet-lab.ru

💰 Поддержать проект

Если вам понравилась статья, то ставьте 👍🏻 каналу.
Пишите комментарии, задавайте вопросы, подписывайтесь.