Bomben legen …

Doch holen wir ein bischen weiter aus: Jeder der Peter kennt und stolzer Linux / Unix User ist kennt bestimmt auch diesen Hübschen Smily:

1
 :(){ :|:& };:

Doch das ist eigentlich kein Smily, sonder eine sogenannte Fork-Bombe. Und der Peter findet:
[…] Forkbomben machen Spaß […]

Guuut, dagegen hab ICH jetzt nix einzuwenden, aber die Ahnungslosen, die diesen Text auch noch in Ihre Konsole kleben finden das meist nicht so toll:

<Vlad_Tepecz> Gib das mal in ne Konsole ein
<schwarzheit> och nö nach abtippern is mir jetzt nich
<Vlad_Tepecz> : ( ) {  : | : &  } ; :
schwarzheit [schwarzhei@schwarzheit.users.insiderZ.DE] hat den Server verlassen: Ping timeout

Lokal dürfte bei schwarzheit noch ein Could not allocate 2 bytes zu sehen gewesen sein, danach bedurfte es wohl eines Hardresets.

Wer aus dem Gewirr aus Klammern und Punkten nicht schlau wird, dem erkläre ich nun was da eigentlich geschieht.

  • : ( ) Wir definieren eine neue Funktion in der Shell „:“
  • { : | : & } Diese Funktion ruft sich selbst – also „:“ – auf, und leitet seine Ausgabe an eine weitere Instanz von „:“, natürlich im Hintergrund
  • ; Trenner zwischen 2 Befehlen, um es einzeilig zu halten
  • : Öffnet die Büxe der Pandora – ruft „:“ auf

Jede Instanz braucht in diesem Fall zwar nur 4 Kilobyte Arbeitsspeicher, jedoch kann bei fast jedem 10ten Takt der CPU die Anzahl der Prozesse verdoppelt werden:
1,2,4,8,16,32,64,128,256,512,1024,…
Wie man sehen kann sind bereits nach 11 Iterationen 4MB Speicher verbraucht!
Darraus folgt: Je schneller das System läuft, um so schneller gegen die Wand.

Wie kann man sich davor schützen?

Nun, die wohl einfachste Möglichkeit ist: Trau nie dem Peter.

Oder wir beschränken den nicht-root Benutzern die Systemressourcen. Und genau dafür ist auf modernen Systemen pam_limits zuständig.

Also, ab ans Eingemachte!

Arbeiten an PAM sind wie das Wechseln von Türschlössern: Man sollte zum testen immer die Tür offen lassen, sonst kommt man nicht mehr rein, wenn was nicht passt.
Deshalb IMMER eine Session auf dem System offen halten und mit einer zweiten testen wie das geht. Wenn ihr nicht wisst, wie ihr das tun sollt: Finger weg!

Zunächst müssen wir die Notwendigen Ressourcen ermitteln.

Die Werte die es zu bestimmen gilt sind:

  • memlock
    Maximal benutzbarer Arbeitsspeicher.
    Dieser Wert hängt stark von dem vorhandenen Arbeitsspeicher ab. Einem Desktop System sollten wärend der normalen Benutzung mindestens noch 500MB zur Verüfung stehen.
    Ich habe z.B. in meinem Notebook 4GB RAM verbaut, Benutzer dürfen bis zu 3GB nutzen, somit hab ich noch genug Ressourcen für meine lokale Datenbank, mein Apache, usw …
  • nproc
    Maximale Anzahl von Prozessen.
    Dies gibt an, wieviele Prozesse von einem Benutzer zeitgleich laufen dürfen. Als Richtwert empfehle ich die Anzahl der aktuell laufenden Prozesse du verdoppeln. Die Anzahl der aktuellen Prozesse eines Benutzers kann mit dem Befehl

    1
    ps -fu $USER | wc -l

    ermittelt werden.

Wichtig ist zu wissen, dass diese Werte nur lokal für jede Session gültig sind. Wenn also ein Benutzer 3 Sessions öffnet, kann er 3x so viel Ressourcen beanspruchen. Ebenso natürlich, wenn mehrere Benutzer zur selben Zeit angemeldet sind. Um einen Benutzer daran zu hindern mehr als eine Session zu öffnen (auf einem Desktopsystem in der Regel ausreichend) kann man noch den Parameter „maxlogins“ setzen.

Diese Werte müssen nun noch in der Konfigurationsdatei für pam_limits verewigt werden (in der Regel „/etc/security/limits.conf“).

Hier ist eine Beispieleintrag für die Gruppe „users“:

1
2
3
4
5
6
# Maximaler Arbeitsspeicher je User/Session in KB (3GB)
@users    -    memlock        3145728
# Maximale Anzahl Prozesse je User/Session
@users     -     nproc        150
# Maximal 2 Logins je User (ich will ja evt. auch mal fix über ssh drauf)
@users  -       maxlogins    2

Wer mehr zu dem Thema wissen möchte sollte seine Lokale Fach-Bücherei konsultieren:

1
man limits.conf

Wer sich sicher ist alles richtig gemacht zu haben, kann nun eine NEUE Session öffnen, und Peters Lieblingsbombe da rein werfen. Geht wirklich alles richtig, sollte sich die Bombe schnell in Luft auflösen.

Bis zum nächsten Mal
Euer Thomas „the Nerd“

7 Meinungen zu “Lokale Linuxssicherheit, oder: wie entschärf ich die Bombe?

  1. Gemeine Sache.
    Ich weiß noch, als wäre es gestern gewesen. Das erste mal Linux installiert. Debian war es, Woody um genauer zu sein.
    Im IRC bat ich um einen Crashkurs, und den bekam ich auch ;-)
    Zuerst durfte ich oben stehendes ausführen. Kein Problem, das geht ja vorbei.. und nachdem ich das komplette System eingerichtet und mit Daten gefüllt hatte, wurde mir bei gebracht, wie das mit „rm -rf /“ funktioniert ;-)

    Oben genannte Methode wende ich schon länger an, wenn ich zum Beispiel Büros ausstatte.
    Bin mal gespannt was von dir hier in Zukunft noch so zu lesen sein wird. :-)

  2. Hallo
    Toller Artikel! Die Forkbomb kannte ich schon, aber nun weiß ich wie ich mein System davor schützen kann. Mal nachher testen, ob ich mit deiner Anleitung klar komme, ohne mich selber auszusperren :-)

  3. Ich kenne mich mit dem Thema leider nicht aus. Trotzdem möchte ich die Gelegenheit nicht verpassen, den neuen Autor auf dem Blog zu begrüßen. Ich hoffe, wir können Dich jetzt regelmässig hier sehen und vielleicht ist ja irgendwann mal was dabei, das auch ich kapiere ;)

    Sei Willkommen, lieber Thomas.

Schreibe einen Kommentar

Ihre Email-Adresse wird nicht veröffentlicht. Pflichtfelder sind durch * markiert.

Sie können folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>