Linux a-t-il des mesures de protection contre les bombes à fourche?

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

J'exécute ce programme sur mon linux, rien ne sort sur le terminal, l'OS semble disparaître. Linux a-t-il une mesure de protection contre un tel programme qui peut manquer de mémoire?


la source
2
Je soupçonne que l'impact serait beaucoup moins important si vous ne suiviez pas les mauvais conseils que de nombreuses distributions donnent pour créer une grande partition de swap ...
R .. GitHub STOP HELPING ICE
1
Est-ce que "ne pas créer de nouveaux processus après avoir atteint 65k" compte comme contre-mesure? ;)
Bobby

Réponses:

18

Ceci est connu comme une bombe à fourche .

Linux a-t-il une mesure de protection contre un tel programme qui peut manquer de mémoire?

Pas vraiment. Chaque fork produit un nouveau processus, avec son propre espace d'adressage virtuel et sa propre utilisation de la mémoire. Donc, chaque copie est relativement petite. Finalement, vous utiliserez toute la mémoire physique + swap du système, et le tueur hors mémoire (OOM) commencera à tuer les processus individuels. Mais la bombe fourchette créera toujours des processus tout aussi rapides (sinon plus rapides).

Une façon d'éviter que cela ne se produise en premier lieu consiste à limiter le nombre de processus utilisateur à l'aide de ulimit -u(en supposant que vous utilisez Bash; les autres shells auront des équivalents).

Oliver Charlesworth
la source
2
Une chose à noter ulimitest spécifique à bash; d'autres obus auront probablement la même commande intégrée, mais peut-être avec un nom différent.
Jay
@Jay: Juste point. Je l'ai noté dans la réponse maintenant, merci!
Oliver Charlesworth
1
limiter les descripteurs de mémoire / fichier par utilisateur devrait être suffisant. Limiter la mémoire par utilisateur est toujours une bonne idée. Lorsqu'un processus est tué (oom), le chien de garde doit envoyer une notification afin que le BOFH puisse démarrer l'utilisateur «voyou» avec tous les processus appartenant au système
Je pense que vous pouvez également définir des limites via les paramètres de connexion
p_l
10

Oui, bien qu'il ne soit pas activé par défaut sur votre système. L' setrlimitappel système définit les limites du système, y compris le nombre de processus par utilisateur.

Examinons-le d'abord dans l'API du noyau (puisque vous avez mentionné "linux"): vous pouvez utiliser la page de manuel de setrlimit, qui vous dira de faire quelque chose comme

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

struct rlimit  r;

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

Cela définira le nombre maximal de processus par utilisateur ( RLIMIT_NPROC) à 40 (limite souple) et 50 (limite stricte).

Maintenant, à partir du shell, si vous utilisez bash, vous pouvez utiliser la ulimitcommande intégrée:

ulimit -u
29089

Vous pouvez définir la limite en la passant comme argument:

ulimit -u 100

ulimit --help vous montrera qu'il existe plusieurs autres limites que vous pouvez définir (une qui peut être intéressante est le nombre maximum de descripteurs de fichiers utilisés par l'utilisateur).

Geai
la source
7

Cela dépend si vous souhaitez l'utiliser au niveau utilisateur ou au niveau système. Au niveau utilisateur, la ulimit(ou les commandes correspondantes pour d'autres shells) serait la solution la plus simple.

Cependant, au niveau du système, il existe des mécanismes pour empêcher les utilisateurs malveillants (ou tout simplement ne pas utiliser ulimit) d'arrêter le système. Le mécanisme des cgroups Linux peut limiter les ressources par groupe. Vous pouvez forcer (par pam_systemdmachanisme) la session utilisateur à être dans un groupe spécifique. Cela présente d'autres avantages, par exemple pour le planificateur de CPU.

Maciej Piechotka
la source
1
+1: les groupes de discussion sont vraiment nouveaux et la plupart des gens n'en savent pas encore grand-chose. Où pouvons-nous en savoir plus?
Ken Bloom
1
@KenBloom: 1. en parcourant /sys/fs/cgroup/2. en recherchant dans google 3. en parcourant make menuconfig4. En consultant /usr/src/linux/Documentation/cgroups5. En lisant la documentation de systemd. Désolé, je ne peux pas vous aider davantage, mais j'ai utilisé uniquement ces ressources. J'ai utilisé des groupes de contrôle sur le bureau pour contrôler les ressources.
Maciej Piechotka
6

Utilisez à ulimit -upartir du shell bash pour définir une limite sur les "processus utilisateur max".

Depuis le shell C, vous utilisez la limitcommande.

Si vous avez besoin d'un appel système pour ce faire, utilisez l' setrlimitappel pour définir RLIMIT_NPROC.

Ken Bloom
la source
1

Étant donné que les réponses les plus récentes ici datent de plus de 3 ans, je tiens à souligner que les noyaux plus récents (depuis la version 4.3) ont un support explicite pour empêcher les bombes à fourche via le nouveau "sous-système PID". (Voir https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865c et https://git.kernel.org/cgit/linux/kernel/git /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )

David Ongaro
la source