© saicle/Shutterstock.com
Aber sicher!

Das Gästebuch, bitte!


Bisher ging es im Security-Workshop um die verschiedenen Schwachstellen: Was kann ein Angreifer darüber erreichen, wie können Sie sie erkennen, und welche Möglichkeiten haben Sie, um die Schwachstellen bzw. Angriffe zu verhindern? Jetzt betrachten wir das Problem von der anderen Seite: Wie entwickelt man eine Anwendung so, dass erst gar keine Schwachstellen entstehen? Als Beispiel dafür dient ein Gästebuch.

Es gibt zwei Grundvoraussetzungen, um eine sichere Anwendung zu entwickeln: Erstens müssen Sie natürlich programmieren können, und ich gehe davon aus, dass diese Voraussetzung erfüllt ist. Zweitens müssen Sie ein Grundwissen über mögliche Schwachstellen und Angriffe besitzen, denn nur, wenn Sie wissen, was Sie verhindern müssen, können Sie es auch tun. Dieses Grundwissen besitzen Sie z. B., wenn Sie die bisherigen Folgen des Security-Workshops verfolgt haben. Auch online finden Sie die entsprechenden Informationen, z. B. in vielen Folgen von „About Security“. Eine Übersicht der relevanten Artikel finden Sie auf der Heft-CD.

Vorbereitung: Die Idee

Zunächst müssen wir überlegen, was die Anwendung leisten soll. Ein Gästebuch erlaubt es den Benutzern, Einträge anzulegen und die vorhandenen Einträge zu lesen. Das soll natürlich auch in unserem Gästebuch möglich sein. Außerdem soll der Benutzer beim Erstellen eines Gästebucheintrags seine E-Mail-Adresse angeben können, auf die nur der Administrator Zugriff hat.

Schritt 1: Funktionen und Daten

Die Entwicklung beginnt mit dem grundlegenden Entwurf des Programms: Welche Funktionen gibt es, welche Daten werden benötigt? Das Gästebuch stellt lediglich drei Funktionen bereit, die Benutzereingaben verarbeiten:

  • Eine von allen Benutzern aufrufbare Funktion, die das Einfügen eines neuen Eintrags erlaubt: eintragen([Die Daten])

  • Eine von allen Benutzern aufrufbare Funktion zum Abfragen bestimmter Daten eines vorhandenen Eintrags: anzeigen(ID)

  • Eine nur den Administratoren des Gästebuchs zugängliche Funktion, die das Abfragen aller Daten eines vorhandenen Eintrags erlaubt: admin(ID)

Eine vierte Funktion, auflisten(), gibt eine Übersicht aller Gästebucheinträge aus und verarbeitet keine Parameter. Auf weitergehende Funktionen, z. B. zum Moderieren der Einträge, wird der Einfachheit halber verzichtet. Die Gästebucheinträge enthalten zwei Arten von Daten: die, die allen Benutzern zugänglich sind, und die, auf die nur die Administratoren Zugriff haben. Für alle Benutzer sichtbar sind:

  • Der Titel des Gästebucheintrags $titel

  • Der eigentliche Gästebucheintrag $eintrag

  • Der Name des Eintragenden $name

  • Optional ein URL zur Homepage des Eintragenden $link

Zusätzliche Informationen sind nur den Administratoren zugänglich:

  • Die E-Mail-Adresse des Eintragenden $mail

  • Die IP-Adresse, von der aus der Eintrag vorgenommen wurde, sie kann der globalen Variable $_SERVER['REMOTE_ADDR'] entnommen werden

Dies sind im Wesentlichen auch alle Daten, die vom Programm entgegengenommen und verarbeitet werden. Lediglich eine ID $id zur Auswahl des anzuzeigenden Eintrags kommt noch hinzu. Alle Daten außer der ID werden beim Eintragen eines Gästebucheintrags erfasst und können vom Benutzer manipuliert werden. Auch die IP-Adresse, was leicht übersehen wird. Der Angreifer erhält dann zwar nicht die Antwort des Servers, aber die braucht er ja nicht unbedingt. Damit ergeben sich die vier Funktionsdeklarationen aus Listing 1.

Listing 1

eintragen($titel, $eintrag, $name, $link, $mail, $ip) anzeigen($id) admin($id) auflisten()

Die Datentypen ergeben sich von selbst: $titel, $eintrag, $name, $link, $mail und $ip/$_SERVER['REMOTE_ADDR'] sind Strings, $id Integer.

Schritt 2: Die Angriffsfläche minimieren

Nachdem die Funktionen und ihre Parameter bekannt sind, lohnt es sich, über die Angriffsfläche der Anwendung nachzudenken. Sie besteht aus den Punkten, an denen Daten eingegeben werden. Je kleiner die Angriffsfläche, desto leichter fällt die Verteidigung, wie leicht einzusehen ist. Betrachten wir die Angriffsfläche des Gästebuchs: Sie besteht aus den drei Funktionen, die Parameter entgegennehmen, den vom Benutzer eingegebenen Daten und der (i. A.) vom Webbrowser übertragenen IP-Adresse.

Lässt sich diese Angriffsfläche verkleinern? In diesem Fall kaum. Man könnte höchstens auf einen Teil der erhobenen Daten verzichten, insbesondere die sowieso normalerweise nicht ausgegebene E-Mail- und IP-Adresse, womit auch die Funktion zur Abfrage dieser Daten entfallen könnte. Nun möchte der Betreiber des Gästebuchs aber die Möglichkeit haben, mit den Eintragenden Kontakt aufzunehmen, sodass auf die E-Mail-Adresse nicht verzichtet werden kann. Die IP-Adresse soll helfen, mögliche Angriffe zurückzuverfolgen. Auf sie komme ich später noch zurück.

Schritt 3: Mögliche Angriffe ermitteln

Im nächsten Schritt müssen alle möglichen Angriffe auf die Anwendung erfasst werden. Dazu kann z. B. das sog. STRIDE-Modell verwendet werden. Dabei handelt es sich um ein von Microsoft entwickeltes System zur Einordnung von Bedrohungen in sechs Kategorien [1]. Der Name „STRIDE“ wurde aus den Anfangsbuchstaben dieser Kategorien gebildet:

  • Spoofing, das Vortäuschen z. B. einer falschen Benutzeridentität

  • Tampering, die unbefugte Manipulation von Daten

  • Repudiation, Angriffe auf die Nicht-Abstreitbarkeit (Non-repudiation), z. B. das Abstreiten der Urheberschaft

  • Information Disclosure, die Preisgabe bzw. das Ausspähen von Daten

  • Denial-of-Service-Angriffe

  • Elevation of Privilege, das Erlangen höherer Benutzerrechte

Für jeden Funktionsaufruf und alle vom Benutzer manipulierbaren Daten müssen alle sechs Kategorien des STRIDE-Modells überprüft werden: Welche Angriffe sind möglich? Wie können sie durchgeführt werden? Fangen wir mit dem Eintragen der Daten an, sowohl der Benutzereingaben als auch der (i. A.) vom Webbrowser gelieferten IP-Adresse:

  • Spoofing: Generell kann jeder Besucher der Website beliebige Daten eintragen, ein Fälschen dieser Daten ist daher irrelevant. Die normalerweise vom Webbrowser übermittelte IP-Adresse könnte gefälscht werden, um den Ursprung eines Angriffs zu verschleiern.

  • Tampering: Über alle Parameter können SQL-Injection- und XSS-Angriffe durchgeführt werden. Über die E-Mail-Adresse wäre ein SMTP-Injection-Angriff möglich, wenn sie von der Anwendung zum Versand von E-Mails verwendet würde.

  • Repudiation: Da jeder Besucher der Website eine beliebige Identität angeben kann, ist dieser Punkt irrelevant.

  • Information Disclosure: Da die Daten nur eingetragen werden, ist ein unbefugtes Lesen von Daten nicht m...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang