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

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()

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

Теги

 

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

Nessus — установка на Ubuntu

Понадобилось мне просканировать один хост на наличие уязвимостей. Нет ничего лучше для этих целей, чем сканер безопасноcти Nessus. Версия Essentials позволяет бесплатно просканировать до 16 IP адресов.

Теги