Чи в Linux є якісь заходи щодо захисту від вилкових бомб?


12
#include <unistd.h>
int main(int argc, char* argv[]) {
  while(1)
  {
    fork();
  } 
}

Я запускаю цю програму на моєму Linux, нічого не виводиться на термінал, ОС, здається, загине. Чи має linux будь-який захід захисту для такої програми, який може втратити пам'ять?


2
Я підозрюю, що вплив був би набагато меншим, якби ви не дотримувались поганих порад, які дають багато дистрибутивів, щоб створити великий розділ підкачки ...
R .. GitHub ЗАСТОСУЙТЕ ДОПОМОГА

1
Чи "не створює жодних нових процесів після удару 65k" вважається протизаходом? ;)
Боббі

Відповіді:


18

Це відомо як вилочна бомба .

Чи має linux будь-який захід захисту для такої програми, який може втратити пам'ять?

Не зовсім. Кожна вилка створює новий процес із власним віртуальним адресним простором та використанням пам'яті. Тож кожна копія порівняно невелика. Врешті-решт, ви використаєте всю фізичну + своп-пам'ять у системі, і вбивця поза пам'яті (OOM) почне вбивати окремі процеси. Але вилка бомба все одно буде створювати процеси так само швидко (якщо не швидше).

Одним із способів запобігти цьому в першу чергу є обмеження кількості користувацьких процесів, використовуючи ulimit -u(якщо припустимо, що ви використовуєте Bash; інші оболонки матимуть еквіваленти).


2
Варто зазначити одне, що ulimitхарактерно для bash; інші оболонки, ймовірно, матимуть таку ж вбудовану команду, але, можливо, з іншою назвою.
Jay

@Jay: Справедливий пункт. Я вже зазначив, що у відповіді зараз, дякую!
Олівер Чарльворт

1
обмеження дескрипторів пам'яті / файлів на кожного користувача повинно бути достатньо. Обмеження пам’яті на користувача завжди є хорошою ідеєю. Коли процес буде вбито (ом), сторожовий собака повинен надіслати сповіщення, щоб BOFH міг завантажувати користувача-шахрая з усіма належними процесами поза системою

Я вважаю, що ви також можете встановити деякі обмеження через параметри входу
p_l

10

Так, хоча це може бути не включено за замовчуванням у вашій системі. setrlimitСистемний виклик визначає системні обмеження - в тому числі кількості процесів для кожного користувача.

Давайте спочатку розглянемо це в API ядра (оскільки ви згадали про "linux"): ви можете використовувати manpage для setrlimit, який підкаже вам зробити щось на кшталт

#include <sys/resource.h>
...

struct rlimit  r;

rnew.r_cur = 40;
rnew.r_max = 50;
setrlimit(RLIMIT_NPROC,&r);

Це встановить максимальний процес на користувача ( RLIMIT_NPROC) до 40 (м'який межа) та 50 (жорсткий межа).

Тепер із оболонки, якщо ви використовуєте bash, ви можете використовувати ulimitвбудовану команду:

ulimit -u
29089

Ви можете встановити ліміт, передавши його як аргумент:

ulimit -u 100

ulimit --help покаже вам, що є кілька інших обмежень, які ви можете встановити (один, який може вас зацікавити, - це максимальна кількість дескрипторів файлів, які використовує користувач).


7

Це залежить від того, чи потрібно використовувати його на рівні користувача або на рівні системи. На рівні користувача ulimit(або відповідні команди для інших оболонок) було б найпростішим рішенням.

Однак на системному рівні існують механізми, щоб запобігти зловмисним користувачам (або просто не використовувати ulimit) зупинки системи. Механізм групових груп Linux може обмежувати ресурси на груповій основі. Ви можете змусити (за допомогою pam_systemdмаханізму) сеансу користувача бути у певній групі. Це має інші переваги, наприклад, для планувальника процесора.


1
+1: групи справді нові, і більшість людей ще мало що про них знає. Де ми можемо дізнатися більше?
Кен Блум

1
@KenBloom: 1. переглядом /sys/fs/cgroup/2. шляхом пошуку в google 3. переглядом make menuconfig4. Перегляданням /usr/src/linux/Documentation/cgroups5. Читанням системної документації. Вибачте, що не можу допомогти більше, але я використовував лише ці ресурси. Я використовував групи на робочому столі для управління ресурсами.
Maciej Piechotka

6

Використовуйте ulimit -uз оболонки bash, щоб встановити обмеження на "максимальні користувацькі процеси".

З оболонки C ви використовуєте limitкоманду.

Якщо для цього вам потрібен системний виклик, використовуйте setrlimitвиклик для встановлення RLIMIT_NPROC.


1

Оскільки останні відповіді тут мають більше 3 років, я хочу зазначити, що нові ядра (з 4.3) мають явну підтримку для запобігання вилкових бомб через нову "підсистему PID". (Див. Https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865c та https://git.kernel.org/cgit/linux/kernel/git /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.