Gabelbombe auf einem Mac?

8

Ich habe gerade von einer Gabelbombe erfahren , einer interessanten Art eines Denial-of-Service-Angriffs. Wikipedia (und einige andere Orte) schlagen vor, :(){ :|:& };:auf UNIX-Computern den Prozess unendlich oft zu verzweigen. Unter Mac OS X Lion scheint es jedoch nicht zu funktionieren (ich erinnere mich, dass die beliebtesten Betriebssysteme für einen solchen direkten Angriff nicht anfällig sind). Ich bin jedoch sehr gespannt, wie ein solcher Angriff funktioniert (und aussieht) und möchte ihn auf meinem Mac ausprobieren. Gibt es eine Möglichkeit, die Sicherheitsvorkehrungen des Systems zu umgehen, oder ist eine Gabelbombe auf Macs nicht möglich?


quelle
2
Hinweis: Ich empfehle nicht, Gabelbomben direkt auf Ihrem System (und niemals auf dem System eines anderen) auszuprobieren. Einige Betriebssysteme sind immer noch anfällig. Versuchen Sie es in einer vollständigen VM (z. B. VirtualBox).
Gilles 'SO - hör auf böse zu sein'
Wurde diese Frage beantwortet (dh warum funktionieren Gabelbomben auf einem Mac nicht)? Die akzeptierte Antwort (die von Bruce Ediger ) erklärt lediglich die Funktionsweise einer Gabelbombe und spricht nicht unbedingt mit den Mechanikern in OS X, die verhindern, dass eine Gabelbombe Chaos anrichtet (wie es anderswo im Linux-Land üblich ist). .
Decimus Phostle
@decimusphostle Ich bin mir nicht sicher, wie Sie zu dem Schluss gekommen sind, dass meine Frage lautete, warum Gabelbomben auf Macs nicht funktionieren. Also ja, die Frage wurde beantwortet.

Antworten:

3

So funktioniert eine Gabelbombe: Im C-Code (oder C-ähnlichen Code) wird eine Funktion namens benannt fork(). Dies führt dazu, dass Linux oder Unix oder Unix-a-Likes einen völlig neuen Prozess erstellen. Dieser Prozess verfügt über einen Adressraum, eine Prozess-ID, eine Signalmaske, offene Dateideskriptoren und alle möglichen Dinge, die Platz im etwas begrenzten Speicher des Betriebssystemkerns beanspruchen. Der neu erstellte Prozess erhält auch einen Platz in der Datenstruktur des Kernels, damit Prozesse ausgeführt werden können. Für den aufgerufenen Prozess fork()sieht es so aus, als wäre nichts passiert. Ein Gabelbombenprozess wird versuchen, fork()so schnell wie möglich und so oft wie möglich zu callen.

Der Trick ist, dass der neu erstellte Prozess auch ausfork() demselben Code stammt. Nach einem Fork haben Sie zwei Prozesse, die denselben Code ausführen. Jeder neue Gabelbombenprozess versucht fork()so schnell wie möglich zu rufen , so oft er kann. Der Code, den Sie als Beispiel angegeben haben, ist eine Bash-Skript-Version einer Gabelbombe.

Bald sind alle prozessbezogenen Ressourcen des Betriebssystemkerns aufgebraucht. Die Prozesstabelle ist voll. Die Warteliste der Prozesse ist voll. Der reale Speicher ist voll, daher beginnt das Paging. Wenn dies lange genug dauert, füllt sich die Swap-Partition.

Wie das für einen Benutzer aussieht: Alles läuft super langsam. Sie erhalten Fehlermeldungen wie "Prozess konnte nicht erstellt werden", wenn Sie einfache Dinge wie ausprobieren ls. Der Versuch eines psführt zu einer endlosen Pause (wenn überhaupt) und gibt eine sehr lange Liste von Prozessen zurück. Manchmal erfordert diese Situation einen Neustart über das Netzkabel.

Gabelbomben wurden früher "Kaninchen" genannt. Weil sie sich so schnell vermehrten.

Nur zum Spaß habe ich ein Gabelbombenprogramm in C geschrieben:

#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
        while (1)
                fork();

        return 0;
}

Ich habe dieses Programm unter Arch Linux in einem xterm kompiliert und ausgeführt. Ich habe ein anderes xterm versucht, eine Prozessliste zu bekommen:

1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable

Die Z-Shell im 2. xterm konnte nicht fork()erfolgreich aufgerufen werden, da die mit dem 1. xterm verknüpften Gabelbombenprozesse alle Kernelressourcen für den erstellten und ausgeführten Prozess aufgebraucht hatten.

Bruce Ediger
quelle
3

Es gibt viele Sicherheitsvorkehrungen, die getroffen werden können, um zu verhindern, dass die Gabelbombe funktioniert.

Das einfachste ist:

ulimit -u 1024

Begrenzung der Anzahl der Benutzerprozesse auf 1024.

Was die Systemgarantien angeht, gibt es sicherlich Möglichkeiten, dies zu tun, aber ich glaube nicht, dass Ihnen hier jemand eine Möglichkeit dazu bietet, aber im Grunde gehen Ihrem System die PIDs aus und es kann nicht mehr erscheinen verarbeitet und kommt im Grunde zum Stillstand, da Ihre Bombe 100% der CPU beansprucht und versucht, mehr von sich selbst zu erzeugen.

Karlson
quelle
Gabelbomben gibt es schon immer. Dies ist in der Tat ein sehr einfacher Schutz gegen Gabelbomben, aber bei weitem die meisten Linux-Distributionen implementieren ihn nicht. Ich weiß nicht warum, aber ich denke, es hat auch etwas mit der Einschränkung vertrauenswürdiger Benutzerprozesse zu tun.
Jippie
@ Jippie Weil es besser ist, dies auf eine andere Art und Weise zu tun wierlimit
Karlson
4
Trotzdem halte ich es für eine dumme Standardeinstellung, dass die meisten Distributionen eine Gabelbombe von nicht privilegierten Benutzern erlauben, eine Maschine zu doS.
Jippie
1
@jippie Die Philosophie hinter den meisten Unix-Distributionen ist, dass sie von "intelligenten" Leuten betrieben werden. Standardmäßig dürfen diese "intelligenten" Leute fast alles tun, und die Administratoren werden sich anstrengen, um das System sicherer zu machen ... Ich überlasse die Schlussfolgerung der Vorstellungskraft des Lesers. Und Datei in Frage ist/etc/security/limits.conf
Karlson
1
Die Begrenzung der Anzahl von Prozessen reicht nicht immer aus: Die ständige Nachfrage nach Gabeln überlastet einige Scheduler (ein Scheduler, der nicht im Hinblick auf die Verhinderung von Gabelbomben geschrieben wurde, verbringt möglicherweise seine Zeit damit, Gabel für Gabel zu verweigern und kommt fast nie dazu, die nützlichen Prozesse zu planen). .
Gilles 'SO - hör auf böse zu sein'
2

Wenn Sie WIRKLICH verzweifelt sehen möchten, wie die Gabelbombe funktioniert, versuchen Sie, sie als Root auszuführen, z. B. seien Sie sudo :(){ :|:& };:erneut gewarnt. Versuchte es selbst auf Ubuntu. Das System wird einfrieren!

Eine einfache Dissektion für Sie:

:() { #Define a new shell function
  :|:& #Pipe function named ':' through itself, creating two copies of itself, and make them run in the background
} #End of function definition block
;: #Call the ':' function. Note how the function is defined with two calls to itself piped through each other. This starts a chain reaction: those two copies will in turn create two more, and so on, as infinitum

Seien Sie sich dessen bewusst, wenn Sie versuchen, solchen Schaden anzurichten ...

realkstrawn93
quelle
Dieses Skript funktioniert wie unter Linux, aber auf einem MAC entfernen Sie das ';' in der letzten Zeile.
HashHazard
2
Sie können nicht sudoso
dass anderen Typ
1
Dies ist nur vorübergehend und geht bei einem Neustart weg, oder?
Winnemucca
1
@Winnemucca Nun, sobald RAM und CPU überlastet sind, ist das System eingefroren. Starten Sie einfach neu und Ihr Computer startet normal, es sei denn, Sie legen es als Startskript fest. Das ist allerdings keine sehr kluge Idee.
Manchineel
2
Ich würde gerade sudo su rootdann die Gabelbombe tatsächlich als Root-Benutzer ausführen.
sudo
0

Sie können dies tun, aber stellen Sie sicher, dass die Datei file.py heißt

import os 
while True
os.startfile(file.py)
ANNONONY
quelle
1
Vermutlich möchten Sie, dass dies als Python-Skript ausgeführt wird, oder? Würdest du dafür keinen Schebang brauchen? Wie kann dies ausgeführt werden, ohne dass die Datei ausführbar ist und ein #!/usr/bin/pythonShebang hinzugefügt wird ?
Terdon