Пожалуй, начнём.
Вот такая последовательность символов в Linux может вывести вашу систему из строя:
:(){ :|:& };:
ПРИМЕЧАНИЕ: не следует запускать эту команду!
Это — Fork-бомба.
При запуске такой команды система начинает потреблять все системные ресурсы (не всегда) и выйдет из строя. Лечится перезагрузкой.
Вероятно, первые fork-бомбы появились из-за ошибок при программировании. Бесконечные циклы, рекурсии, утечки памяти...
Что такое fork-бомба?
Fork-бомбу можно воспринимать в качестве DoS атаки (отказ в обслуживании). При работе программа начинает копировать сама себя и в итоге использует 100% системных ресурсов, пока система не выйдет из строя.
Программы в Unix выполняются с помощью комбинации двух системных вызовов, называемых fork и exec. Один процесс порождает другой, либо заменяя себя по завершении — exec, либо, если ему нужно остаться, создавая копию самого себя — fork. Отсюда и название бомбы.
Fork bomb — это процесс бесконечного создания форка самого себя до тех пор, пока в системе не останется ресурсов.
:(){ :|:& };: – Как это работает?
Fork-бомба в Linux популярна, потому как состоит всего лишь из нескольких специальных символов, а не из длинного кода.
- :() — определяет функцию с именем : без аргументов. Двоеточие является легитимным именем функции в bash.
- {} — тело функции.
- :|: — простая реализация рекурсии. Функция загружает себя в память, затем через пайп вызывает второй экземпляр себя.
- & — запуск функции в фоновом режиме.
- ; — разделение команд.
- : — запуск созданной функции, по сути старт цепной реакции.
Можно заменить двоеточие на другое имя, более понятное глазу, например, на fork:
fork() {
fork | fork &
}
fork
Fork-бомба работает не везде
В Ubuntu и дистрибутивах Linux с systemd fork-бомба не сработает. Вернее сработает, но систему не остановит.
Systemd создает cgroup для каждого пользователя, что определяет максимальное количество процессов. По умолчанию пользователь может использовать 33% от их общего числа.
Как защититься от fork-бомбы
Защититься можно путём ограничения максимального количества используемых пользователем процессов. Эту цифру можно узнать командой:
ulimit -u
В разных дистрибутивах и версиях 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()
И так далее...