Перейти к основному содержанию

Fork-бомба в Linux

Linux

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

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

:(){ :|:& };:

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

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

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

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

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

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

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

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

fork

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

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

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

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

fork() {
    fork | fork &
}
fork

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

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

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

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

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

ulimit -u
fork

В разных дистрибутивах и версиях 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()

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

Теги

 

Похожие материалы

Установка и настройка keepalived на примере MultiFactor Ldap Adapter

Есть два сервера с операционной системой Ubuntu 20.04.4 LTS. Но обоих серверах развёрнут LDAP proxy сервер на базе Multifactor. По сути это обычные LDAPS сервера, которые неплохо было бы объединить в один отказоустойчивый кластер Master— Slave с плавающим виртуальным IP-адресом. Сделаем это с помощью keepalived.