Warum funktionieren C-Forkbombs nicht wie Bash-Bomben?

Lesezeit: 4 Minuten

Benutzeravatar von peoro
Junge

Wenn ich die klassische Bash-Forkbomb ausführe:

:(){ :&:&};:

mein system hängt nach ein paar sekunden.

Ich habe versucht, eine Forkbomb in C zu schreiben, hier ist der Code:

#include <unistd.h>

int main( )
{
    while(1) {
        fork();
    }
    return 0;
}

Wenn ich es ausführe, reagiert das System weniger, aber ich kann diesen Prozess (auch nach Minuten) beenden, indem ich einfach drücke ^C.


Der obige Code unterscheidet sich von der ursprünglichen Bash-Forkbomb, die ich gepostet habe: Es ist eher so etwas wie:

:( )
{
    while true
    do
        :
    done
}

(Ich habe es nicht getestet; weiß nicht, ob es das getan hätte aufhängen das System).

Also habe ich auch versucht, die Originalversion zu implementieren; hier der code:

#include <unistd.h>

inline void colon( const char *path )
{
    pid_t pid = fork( );
    if( pid == 0 ) {
        execl( path, path, 0 );
    }
}

int main( int argc, char **argv )
{
    colon( argv[0] );
    colon( argv[0] );
    return 0;
}

Aber immer noch nichts: Ich kann es ausführen und es dann einfach töten. Es ist nicht hängend mein system.


Wieso den?

Was ist das Besondere an Bash Forkbombs? Liegt es daran, dass Bash viel mehr Speicher/CPU verbraucht? Weil Bash-Prozesse viel mehr Systemaufrufe aufrufen (z. B. um auf das Dateisystem zuzugreifen) als meine?

  • Wie das Sprichwort sagt, werden wissenschaftliche Durchbrüche selten von „Heureka!“ begleitet, häufig begleitet von „Hmm, das ist seltsam“.

    – Camille Goudeseune

    13. Januar 2014 um 22:45 Uhr

Das C-Programm ist sehr klein, ernsthaft winzig. Außerdem ist das Forken () eines solchen Programms sehr, sehr effizient. Ein Interpreter wie Bash ist jedoch in Bezug auf die RAM-Nutzung viel teurer und muss ständig auf die Festplatte zugreifen.

Versuchen Sie, es viel länger laufen zu lassen. 🙂

  • Außerdem neigen moderne Unixe dazu, Copy-on-Write für virtuellen Speicher zu verwenden. Sofern nicht jeder Prozess tatsächlich in einen Speicherort schreibt, verwenden sie alle dieselben physischen Seiten, auch nach dem exec. Setzen Sie ein paar zufällige Mallocs ein und schreiben Sie in den mallocierten Speicher. Ich denke, das wird die Maschine töten.

    – JeremyP

    22. November 2010 um 9:54 Uhr

  • Ja, ich habe diese Dinge bereits zitiert, aber welche davon hängen das System auf und warum? Wenn ich für einen beliebigen Prozess, den ich spawne, 1 MB Speicher auf dem Heap/Stack zuweise, wird mein System hängen bleiben? Oder wenn irgendein Prozess 1 Sekunde intensiver Berechnung durchführt? Oder wenn ein Prozess einige Systemaufrufe aufruft?

    – Junge

    22. November 2010 um 12:17 Uhr

  • @peoro: Technisch gesehen hast du das nicht. Mein Punkt war nicht, dass jeder neue Prozess wenig Speicher verbraucht, sondern dass er tatsächlich keinen zusätzlichen Speicher benötigt (abgesehen von Kernel-Strukturen). Wenn Sie einen Fork ausführen, verwendet der untergeordnete Prozess genau dieselben physischen Seiten wie der übergeordnete Prozess, bis er etwas in den Speicher schreibt. Auch bei exec wird das ausführbare Image geteilt. Eine neue Stack-Seite wird erstellt, aber der große Performance-Killer ist das Austauschen, und dies wird nicht passieren, es sei denn, Sie führen einige Schreibvorgänge durch.

    – JeremyP

    22. November 2010 um 13:31 Uhr


  • Nein, das ist nicht die wahre Ursache für ein solches Verhalten. Hier ist, was ist: stackoverflow.com/a/19322116/585725

    – Schnatsel

    11. Oktober 2013 um 15:42 Uhr

  • @SudipBhandari: Du liest zu viel in die Antwort hinein. Um Ihre Frage zu beantworten: Ein winziges Programm, das in C ohne Garbage Collector auf einem Betriebssystem implementiert ist, das COW-Seiten (Copy On Write) implementiert, wie dies bei den meisten Linux-Systemen der Fall ist, verursacht nur sehr wenig Overhead. Ein anderer Prozess, der mehrere GB Speicher benötigt, wird auf einem solchen System immer noch effizient forken, da der Speicher nicht kopiert wird, bis er geändert wird. Dies ist bei Windows oder Programmen mit Mark-and-Sweep- (oder ähnlichem) GC nicht der Fall. Aber das gezeigte C-Programm war das einfachste mögliche Szenario, das effizient sein wird.

    – Arafangion

    6. Juni 2017 um 6:24 Uhr

Das real Ursache dafür ist, dass in BASH der von Ihnen erstellte Prozess vom übergeordneten Prozess getrennt ist. Wenn der übergeordnete Prozess (der, den Sie ursprünglich gestartet haben) beendet wird, leben die restlichen Prozesse weiter. Aber in den C-Implementierungen, die Sie aufgelistet haben, sterben die untergeordneten Prozesse, wenn der übergeordnete Prozess beendet wird. Es reicht also aus, den ursprünglichen Prozess herunterzufahren, mit dem Sie begonnen haben, den herunterzufahren ganz Baum sich ständig verzweigender Prozesse.

Ich habe noch keine C-Forkbomb-Implementierung entwickelt, die untergeordnete Prozesse trennt, damit sie nicht getötet werden, wenn der übergeordnete Prozess stirbt. Links zu solchen Implementierungen wären willkommen.

In Ihrer Bash-Forkbomb fügen Sie neue Prozesse in neue Hintergrundprozessgruppen ein, sodass Sie dies nicht können ^C Sie.

Das liegt vor allem an der Größe. Wenn Sie die Bash-Fork-Bombe ausführen, lädt sie große Monsterprogramme in den Speicher (in Bezug auf Ihr C-Programm), und jedes von ihnen beginnt, Ihre CPU-Ressourcen zu belasten. Wenn große Monster anfangen, sich zu reproduzieren, treten Probleme definitiv schneller auf, als wenn Bienen anfangen, dasselbe zu tun . Der Computer hängt sich also sofort auf. Wenn Sie jedoch Ihre ausführbare C-Datei lange laufen lassen, wird auch das System hängen bleiben. Nur dass die Zeit viel länger sein wird. Wenn Sie die Größe von bash mit der Größe des c-Programms vergleichen möchten, schauen Sie sich /proc//status an. zuerst mit pid einer beliebigen laufenden Instanz von bash und dann mit pid einer beliebigen laufenden Instanz eines ac-Programms

1410270cookie-checkWarum funktionieren C-Forkbombs nicht wie Bash-Bomben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy