Hat Linux irgendwelche Maßnahmen zum Schutz vor Gabelbomben?

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

Ich führe dieses Programm unter Linux aus, es werden keine Ausgaben auf dem Terminal ausgegeben, das Betriebssystem scheint tot zu sein. Hat Linux eine Schutzmaßnahme für ein solches Programm, die möglicherweise nicht genügend Arbeitsspeicher hat?


quelle
2
Ich vermute, die Auswirkungen wären viel geringer, wenn Sie nicht den schlechten Ratschlägen folgen würden, die viele Distributionen geben, um eine große Swap-Partition zu erstellen ...
R .. GitHub STOP HELPING ICE
1
Zählt "keine neuen Prozesse nach Erreichen von 65.000 erstellen" als Gegenmaßnahme? ;)
Bobby

Antworten:

18

Dies ist als Gabelbombe bekannt .

Hat Linux eine Schutzmaßnahme für ein solches Programm, die möglicherweise nicht genügend Arbeitsspeicher hat?

Nicht wirklich. Jeder Fork erzeugt einen neuen Prozess mit einem eigenen virtuellen Adressraum und einer eigenen Speichernutzung. Jede Kopie ist also relativ klein. Schließlich verbrauchen Sie den gesamten physischen + Swap-Speicher des Systems, und der OOM-Killer (Out-of-Memory) beendet einzelne Prozesse. Aber die Gabelbombe wird immer noch genauso schnelle Prozesse erzeugen (wenn nicht sogar schneller).

Eine Möglichkeit, dies zu verhindern, besteht darin, die Anzahl der Benutzerprozesse zu begrenzen ulimit -u(vorausgesetzt, Sie verwenden Bash; andere Shells haben Entsprechungen).

Oliver Charlesworth
quelle
2
Eine Sache zu beachten ist, dass ulimitspezifisch für Bash ist; Andere Shells haben wahrscheinlich den gleichen integrierten Befehl, aber möglicherweise einen anderen Namen.
Jay
@ Jay: Fairer Punkt. Ich habe das jetzt in der Antwort vermerkt, danke!
Oliver Charlesworth
1
Die Begrenzung der Speicher- / Dateideskriptoren pro Benutzer sollte ausreichen. Es ist immer eine gute Idee, den Speicher pro Benutzer zu begrenzen. Wenn ein Prozess beendet wird (oom), sollte der Watchdog eine Benachrichtigung senden, damit der BOFH den "Rogue" -Benutzer mit allen dazugehörigen Prozessen vom System
Ich glaube, Sie können auch einige Grenzen durch Anmeldeparameter setzen
p_l
10

Ja, obwohl es auf Ihrem System möglicherweise nicht standardmäßig aktiviert ist. Der setrlimitSystemaufruf definiert Systemgrenzen - einschließlich der Anzahl der Prozesse pro Benutzer.

Schauen wir uns das zuerst in der Kernel-API an (da Sie "Linux" erwähnt haben): Sie können die Manpage für setrlimit verwenden, die Sie auffordert, so etwas zu tun

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

struct rlimit  r;

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

Dadurch werden die maximalen Prozesse pro Benutzer ( RLIMIT_NPROC) auf 40 (weiches Limit) und 50 (hartes Limit) festgelegt.

Wenn Sie jetzt in der Shell bash verwenden, können Sie den ulimitintegrierten Befehl verwenden:

ulimit -u
29089

Sie können das Limit festlegen, indem Sie es als Argument übergeben:

ulimit -u 100

ulimit --help zeigt Ihnen, dass Sie mehrere andere Grenzwerte festlegen können (einer, der von Interesse sein kann, ist die maximale Anzahl der vom Benutzer verwendeten Dateideskriptoren).

Jay
quelle
7

Dies hängt davon ab, ob Sie es auf Benutzer- oder Systemebene verwenden möchten. Auf Benutzerebene ulimitwären die (oder entsprechenden Befehle für andere Shells) die einfachste Lösung.

Auf Systemebene gibt es jedoch Mechanismen, die verhindern, dass böswillige Benutzer (oder einfach nicht ulimit verwenden) das System stoppen. Der Linux-cgroups-Mechanismus kann die Ressourcen pro Gruppe begrenzen. Sie können (durch pam_systemdMachanismus) erzwingen, dass sich die Benutzersitzung in einer bestimmten Gruppe befindet. Dies hat andere Vorteile, zum Beispiel für den CPU-Scheduler.

Maciej Piechotka
quelle
1
+1: cgroups sind wirklich neu und die meisten Leute wissen noch nicht viel über sie. Wo können wir mehr lernen?
Ken Bloom
1
@ KenBloom: 1. durch Durchsuchen /sys/fs/cgroup/2. durch Suchen in Google 3. durch Durchsuchen von make menuconfig4. durch Durchsuchen von /usr/src/linux/Documentation/cgroups5. durch Lesen der systemd-Dokumentation. Entschuldigung, ich kann nicht mehr helfen, aber ich habe nur diese Ressourcen verwendet. Ich habe cgroups auf dem Desktop verwendet, um Ressourcen zu steuern.
Maciej Piechotka
6

Verwenden Sie diese ulimit -uOption aus der Bash-Shell, um ein Limit für "maximale Benutzerprozesse" festzulegen.

In der C-Shell verwenden Sie den limitBefehl.

Wenn Sie dazu einen Systemaufruf benötigen, verwenden Sie den setrlimitAufruf zum Festlegen RLIMIT_NPROC.

Ken Bloom
quelle