Fork-Bomben (was Re: [FLAME] Re: Consolen Kommandos)

From: Oliver Fromme <olli(at)secnetix.de>
Date: Fri, 9 May 2003 15:10:13 +0200 (CEST)

Thomas Zastrow <chef(at)thomas-zastrow.de> wrote:
> Thorsten Steentjes wrote:
> > On Fri, May 09, 2003 at 08:18:40AM +0200, Andreas Zymny wrote:
> > > Ein
> > >
> > > void main() {
> > > fork;
> > > }
> > >
> > > sollte Probleme bereiten. Habs bisher noch nicht getestet.

Da fehlt noch mindestens ein while(1) oder so. Ansonsten
wird einfach nur ein Child erzeugt, das sich sofort wieder
beendet, und gut isses. :-)

> > Ohne den Compiler zu bemuehen tut es ein
> > perl -e 'while(1){fork();}'

Ohne perl bemühen zu müssen, tut es ein:
echo 'while :; do sh $0 &; done' > foo; sh foo

> Aeh Moment mal, da muss ich jetzt mal nachfragen ... ich habe den
> Perl-Befehl auf meiner RedHat 9.0 laufen lassen - und Absturz.

Wundert mich nicht wirklich. :-)

> Sehe ich es richtig dass genau das hier passiert ist??? Und sowas - doch
> relativ simples - bringt ein *nix zum Absturz?

Nunja, das Problem nennt man Resource-exhaustion. Wenn ein
einzelner Benutzer eine bestimmte, kritische Resource (in
diesem Fall den Prozeß-Scheduler) bis an die Grenze aus-
schöpft, dann handelt man sich zwangsläufig Ärger ein.
In solchen Grenzsituationen machen sich dann auch gelegent-
lich Bugs bemerkbar, die unter normalen Bedingungen nie zu
Tage treten. So ein Bug hat in dem obigen Fall wahrschein-
lich zum Absturz geführt. Anderenfalls hätte das Systems
schlimmstenfalls »nur« quasi einfrieren dürfen, weil alle
Resourcen gebunden waren.

> Ich trau mich nicht dass
> jetzt auch mal unter FreeBSD auszuprobieren ... vielleicht heute Abend
> wenn keiner mehr hier ist ... :-)

FreeBSD hat einen Back-off-Algorithmus, der eigentlich das
Schlimmste verhindern sollte. Probier's aus. Du solltest
die Prozesse nötigenfalls problemlos von einem zweiten
Terminal aus killen können (halte Dir vor dem Start des Ex-
periments lieber eine root-Shell offen, für den Fall der
Fälle).

Außerdem gibt es die Resource-Limits, mit denen man fest-
legen kann, wieviele Resourcen einzelne Benutzer oder Pro-
zesse belegen dürfen; siehe die limits(1) manpage.

Speziell die maximale Anzahl Prozesse pro User zeigt Dir
das Kommando »sysctl kern.maxprocperuid«. Dieser Wert
sollte kleiner sein als der von kernel.maxproc (das ist
das globale Limit).

Gruß
   Olli

-- 
Oliver Fromme, secnetix GmbH & Co KG, Oettingenstr. 2, 80538 München
Any opinions expressed in this message may be personal to the author
and may not necessarily reflect the opinions of secnetix in any way.
One Unix to rule them all, One Resolver to find them,
One IP to bring them all and in the zone to bind them.
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Fri 09 May 2003 - 15:10:17 CEST

search this site