Christian Kruse: PHP und phpBB-Wurm

Tag zusammen,

Vor kurzem wurde ein phpBB-Wurm entdeckt. Ich hatte das erst als harmlos abgetan,
aber interessanterweise haeufen sich die Befallen-Meldungen und es befinden sich
mehrere Abwandlungen des Wurms im Umlauf.

Interessanter ist allerdings, dass inzwischen der erste PHP-Wurm im Umlauf ist. Er
durchsucht das brasilianische Google und versucht, die Variablen mit ausfuehrbarem
Code zu ueberschreiben.

Das ganze zeigt mal wieder, wie verdammt wichtig es ist, mit User-Input richtig
umzugehen (sprich: es zu validieren und zu maskieren, und niemals direkt damit
zu arbeiten).

Interessant ist auch, dass das Script keinerlei Perl-Scripte sucht ;-))

再见,
 CK

--
Zu wissen, was wir nicht wissen, ist die Quelle der Weisheit.
http://wwwtech.de/
  1. Moin,

    Das ganze zeigt mal wieder, wie verdammt wichtig es ist, mit User-Input richtig
    umzugehen (sprich: es zu validieren und zu maskieren, und niemals direkt damit
    zu arbeiten).

    Hm das mal jemand so etwas programmiert, dass war fast klar.
    Nun ist doch die eigentliche frage, was sollte man denn alles tun um USereingaben zu validieren?
    Hat da jemand ein gutes Tutorial zur Hand?
    Ich stelle mir da so eine Art Checkliste vor, die auch Handlungsanweisungen enthält.
    Es geht hier weniger um mich, sondern, dass ich hier recht häufig Quelltexte sehe, die jegliche Mindestanforderungen an die Sicherheit nicht erfüllen.
    Häufig sehen die Leute dann nicht einmal ihre Fehler, sondern versuchen Ihren Buggi Code durch Änderungen an der php.ini zum laufen zu bringen.
    Das andere Extrem sind dann wieder die Leute, die auch nicht mehr Ahnung haben, aber glauben nur weil Register_Gloabals off sind, kann Ihnen nichts passieren.

    Das PHP jetzt davon betroffen ist würde ich als Microsoft Syndrom bezeichnen, oder auch als Ergebniss einer Evolution.
    Besonders verbreitete Systeme sind eben auch besonder anfällig für solche Sachen.
    In der letzten Zeit ist der Einsatz von PHP nahzu als inflationär zu bezeichnen, das führt natürlich dazu, dass wirklich jeder 12 jährige Schüler glaubt, er könne programmieren, nur weil er in Informatik 1 mal die Woche 2 Stunden was von PHP gehört hat.
    Und Papa noch dazu die HP in die Hände des Sohnes gelegt hat.
    Wozu Profis engaieren wenns der Kleine auch kann.
    Kann nur hoffen, dass sich diese Dinger möglichst schnell verbreiten werden, dann ist endlich auch mal ne Marktbereinigung in dem Sektor zu spühren.

    TomIRL

    1. Huhu!

      Kennt denn jemand ein betroffenes Forum?

      1. 你好 Jamba,

        Kennt denn jemand ein betroffenes Forum?

        Mehrere, sind inzwischen aber alle offline.

        再见,
         CK

        --
        Microsoft: Where do you want to go today?
        Linux: Where do you want to go tomorrow?
        FreeBSD: Are you guys coming, or what?
        http://wwwtech.de/
        1. Ja, es gab schwere Sicherheitslücken auch bei PHP und Updates, welche man downloaden konnte, wurden zur Verfügung gestellt! Die neu entdeckten Sicherheitslecks konnten von potentiellen Angreifern genutzt werden um mit Hilfe von Trojanern oder Viren einen eigenen Code auf dem befallenen System ohne das Wissen des Eigentümers auszuführen. Es sollen neun Schwachstellen in den Versionen 4.3.9 und 5.0.2 von PHP entdeckt worden sein, die erlauben die Code-Ausführung durch Speicherüberläufe, Manipulation an Datei-Pfaden oder das Umgehen von Sicherheitsrestriktionen um Manipulationen auszuführen. Glücklicherweise stehen im Gegensatz zu Windows-Sicherheitslecks unverzüglich auf PHP.net bereits aktualisierte Programmversionen 4.3.10 und 5.0.3 bereit, in denen die Fehler nicht mehr vorhanden sind.
          Das Problem konnte in kürzester Zeit wieder gelöst werden!

          1. Moin,

            Glücklicherweise stehen im Gegensatz zu Windows-Sicherheitslecks unverzüglich auf PHP.net bereits aktualisierte Programmversionen 4.3.10 und 5.0.3 bereit, in denen die Fehler nicht mehr vorhanden sind.

            Das Problem konnte in kürzester Zeit wieder gelöst werden!

            Scheinbar weißt Du nicht genau worüber Du sprichst und hast auch nicht die verlinkten Dokumente gelesen, der Wurm nutzt nicht etwa Sicherheitslöcher von PHP aus. Sondern nutzt die Unfähigkeit vieler Programmierer aus, Ihre Skripte vernünftig zu programmieren.
            http://www.heise.de/newsticker/meldung/54623
            TomIRL

          2. 你好 Lucas,

            Ja, es gab schwere Sicherheitslücken auch bei PHP und Updates, welche man
            downloaden konnte, wurden zur Verfügung gestellt!

            Es ging weniger um die Sicherheitsluecke in PHP, sondern viel mehr um
            die in phpBB und diversen anderen Scripten. Hast du denn mein
            Ausgangsposting und die verlinkten Mails nicht gelesen?

            再见,
             CK

            --
            Sobald dir ein Gedanke kommt, lache über ihn.
            http://wwwtech.de/
    2. Guten Morgen,

      Das ganze zeigt mal wieder, wie verdammt wichtig es ist, mit User-Input richtig
      umzugehen (sprich: es zu validieren und zu maskieren, und niemals direkt damit
      zu arbeiten).

      Hm das mal jemand so etwas programmiert, dass war fast klar.
      Nun ist doch die eigentliche frage, was sollte man denn alles tun um USereingaben zu validieren?
      Hat da jemand ein gutes Tutorial zur Hand?
      Ich stelle mir da so eine Art Checkliste vor, die auch Handlungsanweisungen enthält.

      Zusammenfassend: Traue niemandem. Validiere allen Input oder stirb.

      12.11. Prüfe importierte Parameter. Traue niemandem
      [Link:http://www.php-faq.de/q/q-sicherheit-parameter.html]

      12.1. Wie unterscheide ich böse Variablen von guten?
      [Link:http://www.php-faq.de/q/q-security-variablen.html]

      Gruß

  2. An die Wissenden:

    Heisst das, dass ich alle Anweisungen in meinen Scripten, die irgendwie auf $_GET- oder $_POST-Variablen ansetzen, auf diese Angriffsmöglichkeiten untersuchen müsste?

    Es sieht ja so aus, als ob spezielle "board"-Systeme davon betroffen seien, also nicht unbedingt das ein oder andere Script auf einer privaten Homepage, das per URL?variable=parameter irgendwelche Reaktionen zeigt.

    Oder muss ich mir _gerade_ in diesem Falle Gedanken machen?

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Moin,

      Heisst das, dass ich alle Anweisungen in meinen Scripten, die irgendwie auf $_GET- oder $_POST-Variablen ansetzen, auf diese Angriffsmöglichkeiten untersuchen müsste?

      Du solltest grundsätzlich solche Eingaben auf Ihre Gültigkeit untersuchen

      Es sieht ja so aus, als ob spezielle "board"-Systeme davon betroffen seien, also nicht unbedingt das ein oder andere Script auf einer privaten Homepage, das per URL?variable=parameter irgendwelche Reaktionen zeigt.

      Oder muss ich mir _gerade_ in diesem Falle Gedanken machen?

      Wenn Du es bisher nicht getan hast, dann solltest Du Dir grundsätzlich Gedanken über dieses Problem machen.
      Deshalb frgate ich ja nach einer Art Checkliste mit Handlungsanweisung.
      Wenn es so etwas nicht gibt, sollte man die Gelgenheit nutzen und dieses Thema in diesem Thread ausführlich erörtern.
      TomIRL

      1. Hello,

        Deshalb fragte ich ja nach einer Art Checkliste mit Handlungsanweisung.
        Wenn es so etwas nicht gibt, sollte man die Gelgenheit nutzen und dieses Thema in diesem Thread ausführlich erörtern.

        Diese "Würmer" suchen ja nicht Zugang über die sichtbaren Parameter in $_GET, $_POST, $_COOKIE. Die sind meistens nicht gefährdet, da sie i.d.R. im Script mit etwas festgelegtem verglichen werden.

        Wie werden aber Werte festgelegt?

        In welcher Reihenfolge werden Parmeter in Scriptvariablen übertragen?

        Besonders gefährdet sind diejenigen Scripte, die mit NICHT INITIALISIERTEN VARIABLEN arbeiten, es also auf eine Notice ankommen lassen würden. Wenn nun diese Variable durch einen externen Paramter beschrieben wird (der eigentlich gar nicht vorgesehen war), dann schleppt man sich eben unbekannte Werte oder sogar Code ein.

        Besonders gefährdet sind da die "Includer", die Scriptteile aufgrund einer externen Filename-Angabe dazuladen.

        index.php?site=start

        und dann im Script stehen haben:

        echo $header;
           if (isset($site))
           {
             include "$site.php";
           }
           else
           {
             include $standard;
           }

        echo $footer;

        Nur so kurz angedeutet, was da eben gerne bei den gebastelten "CMS" gerne gemcht wird. Und wenn man dann darauf hinweist, bekommt man oft die Antwort "... wieso denn, funktioniert doch ...".

        Mesitens ist fopen als Wrapper erlaubt, und man kann auf diese Weise wunderbar Code von einem externen Server dazuladen. Der kann dann leicht ein Universal-Install-Script (Upload) auf dem Server hinterlassen und schon ist das Ding vorbereitet für spätere Verwendung.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Diese "Würmer" suchen ja nicht Zugang über die sichtbaren Parameter in $_GET, $_POST, $_COOKIE.

          Doch, der phpBB-Wurm gelangt über $_GET["highlight"], dessen Inhalt indirekt mit eval() ausgeführt wird, auf das System (soviel zum Thema eval=evil). Sein angeblicher Nachfolger (der mit dem Ersten außer etwas PHP nicht viel zu tun hat) nutzt anscheinend $_GET-Parameter, die von außen Code importieren (wie Du es weiter unten beschreibst).

          Die sind meistens nicht gefährdet, da sie i.d.R. im Script mit etwas festgelegtem verglichen werden.

          Meistens ist nicht immer, wie an dem phpBB-Beispiel eindrucksvoll demonstriert wurde.

          Besonders gefährdet sind diejenigen Scripte, die mit NICHT INITIALISIERTEN VARIABLEN arbeiten, es also auf eine Notice ankommen lassen würden. Wenn nun diese Variable durch einen externen Paramter beschrieben wird (der eigentlich gar nicht vorgesehen war), dann schleppt man sich eben unbekannte Werte oder sogar Code ein.

          Das Problem mit nicht-initialisierten Variablen liegt eher im Bereich unerlaubter Zugriff auf geschützte Bereiche oder dem Skript originäre Funktionen als im Einschmuggeln von zusätzlichem Code. Klassisches Beispiel:

          if ($passwort="geheim") {
            $login=true;
          }
          if ($login) {
            usw.
          }

          Mit seite.php?login=1 liessen sich solche Prüfungen ohne weiteres umgehen, was dann dazu führte, dass die für den Variablenimport verantwortliche PHP-Option standardmäßig ausgeschaltet wurde.

          Besonders gefährdet sind da die "Includer", die Scriptteile aufgrund einer externen Filename-Angabe dazuladen.

          index.php?site=start

          und dann im Script stehen haben:

          include "$site.php";

          Das oder

          Mesitens ist fopen als Wrapper erlaubt,

          dies dürfte das Einfallstor für den Virus sein, der hier angesprochen wurde. Das hat aber weniger mit nicht-initalisierten Variablen zu tun als mit der Frage, warum der Inhalt von $site nicht vor Benutzung geprüft wird. Dabei gilt die Regel, auf exakt das zu prüfen, was drinstehen darf, nicht umgekehrt zu prüfen, ob etwas nicht drinsteht. Mit einer Prüfung auf eine unerlaubte eine URL (http://...) kann man immer noch Systemdateien ausgeben lassen (index.php?site=/etc/passwd). Wird die Datei durch fopen gelesen, könnte man sogar den Code der PHP-Skripte anzeigen lassen.

          1. Hello,

            Wenn ich hier vorher

            $login = false;   ## Initialisierung

            if ($passwort="geheim") {
              $login=true;
            }
            if ($login) {
              usw.
            }

            Mit seite.php?login=1 liessen sich solche Prüfungen ohne weiteres umgehen, was dann dazu führte, dass die für den Variablenimport verantwortliche PHP-Option standardmäßig ausgeschaltet wurde.

            durchgeführt habe, kann  'seite.php?login=1'  nichts mehr ausrichten, da

            • Parameter übernehmen in der vorgeschriebenen Reihenfolge: meistens GPC
            • die im Script vorgesehenen Aktionen ausführen, also z.B.
              • Includes,
              • Konstanten,
              • Variablen-Deklaration/Initialisierung,
              • Session-Start,
              • usw.

            Dann könnte nichts passieren.

            Besonders gefährdet sind da die "Includer", die Scriptteile aufgrund einer externen Filename-Angabe dazuladen.

            index.php?site=start

            und dann im Script stehen haben:

            include "$site.php";

            Das oder

            Mesitens ist fopen als Wrapper erlaubt,

            dies dürfte das Einfallstor für den Virus sein, der hier angesprochen wurde. Das hat aber weniger mit nicht-initalisierten Variablen zu tun als mit der Frage, warum der Inhalt von $site nicht vor Benutzung geprüft wird. Dabei gilt die Regel, auf exakt das zu prüfen, was drinstehen darf, nicht umgekehrt zu prüfen, ob etwas nicht drinsteht. Mit einer Prüfung auf eine unerlaubte eine URL (http://...) kann man immer noch Systemdateien ausgeben lassen (index.php?site=/etc/passwd). Wird die Datei durch fopen gelesen, könnte man sogar den Code der PHP-Skripte anzeigen lassen.

            In meinem Beispiel hatte ich ja schon eine Endung dazugestanzt. Das würde (unter Normalumständen) schon mal verhindern, dass irgendwelche dateien vom System gelesen werden.
            Wenn man nun noch den Basename() des Parameters ermittelt und mit dem Parameter vergleicht (!) und bei Abweichung sofort das Script abbricht bzw. in eine Standardausgabe laufen lässt, hat man die nächste Unsicherheitsstufe verlassen. Schließlich sollte man dann noch die zu includende Datei aus einem fest vorschriebenen Verzeichnis holen, und wenn sie dort nicht vorhanden ist, ebenfalls intern die rote Lampe anknipsen und nach außen Standardausgaben tätigen.

            Include() ist die am häufigsten eingebaute Sicherheitslücke in PHP-Scripten. Da eval() i.d.R. schon beim Coden Zicken macht (wenn man nicht weiß, wie es funktioniert), wir es seltener benutzt. Es ist aber keinesfalls gefährlicher als include().

            Weitere wesentliche Methoden sind die der Session-Entführung, die bei vielen Großprovidern anstandslos funktioniert. Dagegen kann ein Hosting-Kunde nichts unternehmen. Das ist ein Fehler in der Systemkonfiguration, weshalb ich immer wieder behaupte, dass eine vServer-Zelle sicherer ist, als ein Massen-Account.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
      2. Hallo Tom,

        Deshalb frgate ich ja nach einer Art Checkliste mit Handlungsanweisung.
        Wenn es so etwas nicht gibt, sollte man die Gelgenheit nutzen und dieses Thema in diesem Thread ausführlich erörtern.

        Hier nur mal ein paar Sachen, die mir gerade einfallen und von denen ich meine, dass man sie beachten muss.

        * register_globals deaktivieren, sofern dies möglich ist. Zwar sollten alle
          Scripte so geschrieben sein, dass auch mit register_globals keine Gefahr
          besteht, aber einen Fehler kann man immer machen.
        * Alle Variablen vor ihrem Gebrauch initialisieren, es kann ja sein, dass das
          Script auch mal auf einem Server ausgeführt wird, wo register_globals
          aktiviert ist.
        * _Niemals_ User-Eingaben über $_GET, $_POST, $_REQUEST, $_COOKIE oder andere
          Wege vertrauen. Das heißt insbesondere, diese Daten...
            * Nicht als Parameter für fopen, include oder andere Operationen mit Dateien
              verwenden.
            * Nicht als Parameter für eval verwenden.
            * Wenn die Daten in eine Datenbank geschrieben werden, müssen sie vorher
              mit den entsprechenden Funktion (mysql_escape_sting, pg_escape_string,
              sqlite_escape_string, ...) behandelt werden.
            * Daten, die entweder direkt oder indirekt (zum Beispiel als gespeicherte
              Daten) vom Besucher eingeben wurden, vor der Ausgabe immer mit
              htmlspecialchars oder strip_tags behandeln. Soll der User trotzdem die
              Möglichkeit haben, den Text zu formatieren, besser eine eigene
              Syntax wie BB-Code verwenden.

        Das sind jetzt erstmal nur die Sachen, die mir in der Schnelle in Bezug auf dieses Thema eingefallen sind. Die Liste erhebt natürlich deshalb keinen Anspruch auf Vollständigkeit ;-) Wenn noch jemanden mehr einfällt, bitte hinzufügen.

        Schöne Grüße und euch allen noch frohe Weihnachten,

        Johannes

        --
        Das sage ich deshalb, weil ich Hompagebauer bin und Ahnung davon .
        ss:| zu:) ls:[ fo:) de:] va:) ch:) n4:| rl:) br:< js:| ie:{ fl:( mo:}
    2. An die Wissenden:

      Danke ;-)

      Heisst das, dass ich alle Anweisungen in meinen Scripten, die irgendwie auf $_GET- oder $_POST-Variablen ansetzen, auf diese Angriffsmöglichkeiten untersuchen müsste?

      Nicht nur das. Ich habe während meiner MaTA-Ausbildung ein Referat zum Thema "Web-Sicherheit" halten müssen, nachdem ich über eine XSS-Schwachstelle das Gästebuch eines Projekt-Teams gehackt hatte. Schau mal unter http://schueler.freepage.de/robertbienert/dokumente/web/PHPMySQLSicherheit.html vorbei. Zum Thema XSS (Cross-Site-Scripting war in der iX 8/2004 ein interessanter Artikel.

      Es sieht ja so aus, als ob spezielle "board"-Systeme davon betroffen seien, also nicht unbedingt das ein oder andere Script auf einer privaten Homepage, das per URL?variable=parameter irgendwelche Reaktionen zeigt.

      Prinzipiell ist jedes Script davon betroffen, gleichgültig davon, ob auf www.ebay.de oder www.cooler-provider.com/private-homepages/hans-mueller. Nur bei bekannteren Webseiten und/oder Forensystemen gibt es natürlich mehr Leute, die dort nach Schwachstellen suchen.

      Oder muss ich mir _gerade_ in diesem Falle Gedanken machen?

      Mach dir generell Gedanken, das erspart dir im Ernstfall viel Ärger und evtl. sogar Geld (Schadensersatz, weil _dein_ Script z.B. die Microsoft-Seite lahmgelegt hat).

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      Gruß, Robert

  3. Mahlzeit,

    Das ganze zeigt mal wieder, wie verdammt wichtig es ist, mit User-Input richtig
    umzugehen (sprich: es zu validieren und zu maskieren, und niemals direkt damit
    zu arbeiten).

    Benutzereingaben sind schon immer die Geisel der Programmierer ;-)

    Schönen Sonntag!

    Rolf

    1. Hallo Rolf,

      Benutzereingaben sind schon immer die Geisel der Programmierer ;-)

      s/eingaben// >;-)

      Frohe Weihnachten,

      Johannes

      --
      Das sage ich deshalb, weil ich Hompagebauer bin und Ahnung davon .
      ss:| zu:) ls:[ fo:) de:] va:) ch:) n4:| rl:) br:< js:| ie:{ fl:( mo:}
    2. Hello Rolf,

      Benutzereingaben sind schon immer die Geisel der Programmierer ;-)

      wie meinst Du das jetzt?
      Ich schlage diesen Ausspruch mal als Zitat vor. Ist Dir das Recht?

      hostage <--> scourge

      In diesem Kontext absolut konträre Bedeutung, oder?
      Also eine typische Politiker-Sprechweise.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Helo lieber Tom,

        Benutzereingaben sind schon immer die Geisel der Programmierer ;-)

        wie meinst Du das jetzt?

        Beispiel:

        1996 hab ich mal 1 DIN A4 Seite in c geschrieben womit es dem User möglich war, ein Datum, bestehend aus Zahlen, und nichts weiter aus Zahlen der Form /01 01 1970/ einzugeben um den zugehörigen Wochentag zu diesem Datum herauszukriegen. Letzteres tat eine Funktion, die war eine halbe Seite lang.

        Aufwand 'Filter User' : 'Eigentliches Program' = > 2:1

        Kürzlich schrieb ich ein Zeiterfassungs - Script womit der User Kommen- und Gehenzeiten in unterschiedlichen Zeitarten eingeben kann. Was soll ich sagen, das Speichern der Zeiten in einer Datenbank ist ja banal, aber die Prüfung, dass es da keine überlappenden Zeiten gibt ist so ein richtiger Krebs geworden, was einen Großteil des Scripts ausmacht.

        ***

        Du schreibst, dass Du mich zitieren willst. Natürlich darfst Du das, aber sei bitte sogut und schicke mir eine Referenz, wo Du das machst.

        Viele Grüße, Rolf

        ***

        Ulbricht war auf dem Brocken und wurde gefragt was er von da oben gesehen hat. Seine Antwort war kurz und knapp: Elend und Sorge!

        1. Hello,

          Du schreibst, dass Du mich zitieren willst. Natürlich darfst Du das, aber sei bitte sogut und schicke mir eine Referenz, wo Du das machst.

          Bitteschön: http://zitatesammlung.andreas-lindig.de

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau