Есть ли у Linux какие-либо меры для защиты от вилочных бомб?

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

Я запускаю эту программу на моем Linux, на терминале ничего не выводится, операционная система кажется мертвой. Есть ли у linux какие-либо меры защиты для такой программы, которая может исчерпать память?


источник
2
Я подозреваю, что влияние было бы намного меньше, если бы вы не следовали дурному совету, который многие дистрибутивы дают для создания большого раздела подкачки ...
R .. GitHub STOP HELPING ICE
1
Не считается ли создание противодействия "не создание новых процессов после удара 65 КБ"? ;)
Бобби

Ответы:

18

Это известно как вилочная бомба .

Есть ли у linux какие-либо меры защиты для такой программы, которая может исчерпать память?

На самом деле, нет. Каждый форк создает новый процесс с собственным виртуальным адресным пространством и использованием памяти. Таким образом, каждая копия относительно мала. В конце концов, вы израсходуете всю физическую + подкачку памяти в системе, и убийца нехватки памяти (OOM) начнет убивать отдельные процессы. Но вилочная бомба все равно будет создавать процессы так же быстро (если не быстрее).

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

Оливер Чарльзуорт
источник
2
Стоит отметить, что ulimitэто специфично для bash; другие оболочки, вероятно, будут иметь такую ​​же встроенную команду, но, возможно, с другим именем.
Джей
@Jay: справедливо. Я заметил, что в ответ сейчас, спасибо!
Оливер Чарльзуорт
1
достаточно ограничить количество дескрипторов памяти / файлов для каждого пользователя. Ограничение памяти на пользователя всегда хорошая идея. Когда процесс убит (oom), сторожевой таймер должен отправить уведомление, чтобы BOFH мог загрузить пользователя-мошенника со всеми принадлежащими процессами вне системы
Я считаю, что вы также можете установить некоторые ограничения через параметры входа в систему
p_l
10

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

Давайте сначала посмотрим на это в API ядра (поскольку вы упомянули «linux»): вы можете использовать man-страницу для 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 cgroups может ограничивать ресурсы для каждой группы. Вы можете заставить (по pam_systemdмеханизму) сеанс пользователя быть в определенной группе. Это имеет и другие преимущества, например, для планировщика ЦП.

Мацей Печотка
источник
1
+1: cgroups действительно новы, и большинство людей еще ничего о них не знают. Где мы можем узнать больше?
Кен Блум
1
@KenBloom: 1. путем просмотра /sys/fs/cgroup/2. путем поиска в google 3. путем просмотра make menuconfig4. путем просмотра /usr/src/linux/Documentation/cgroups5. путем чтения документации systemd. Извините, я не могу помочь больше, но я использовал только эти ресурсы. Я использовал cgroups на рабочем столе для управления ресурсами.
Мацей Пехотка
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 )

Дэвид Онгаро
источник