Sicherheit fängt beim Entwickeln an

20.09.2005
Von Kurt Aigner
Wer eigene Web-Anwendungen einsetzt, sollte von Anfang an besonders sorgfältig vorgehen.
Probeläufe, automatisierte Analysen, und die Tool-gestützte Simulation gehören zu den Maßnahmen, die dabei helfen, sicheren Code zu entwickeln.
Probeläufe, automatisierte Analysen, und die Tool-gestützte Simulation gehören zu den Maßnahmen, die dabei helfen, sicheren Code zu entwickeln.

Obwohl Anwender in den letzten Jahren ihre Netze immer besser gesichert haben, gelingt es Angreifern immer wieder, in unternehmenseigene Anwendungen einzubrechen und Daten zu verändern. Die Zahl erfolgreicher Attacken spricht eine deutliche Sprache. Warum reichen die bisherigen Abwehrmaßnahmen nicht aus? Das Problem liegt nicht in der Infrastruktur, sondern in der Software, die diese Infrastruktur nutzt. Besonders gravierend ist dies bei Web-basierenden Anwendungen. Derartige Applikationen, insbesondere diejenigen, die für den Einsatz außerhalb des Unternehmens bestimmt sind, sind für Angreifer leicht zugänglich und vereinfachen durch ihre Art und ihren Aufbau häufig den Zugriff auf den zugrunde liegenden Programmcode.

Hier lesen Sie …

• welche Rolle die Sicherheit der Anwendungen in Unternehmensumgebungen spielt;

• welche Konsequenzen Schwachstellen innerhalb der Software haben können;

• welche Fehler während der Entwicklung zu Problemen führen können;

• worauf Programmierer achten sollten, um Applikationen sicherer zu machen.

So werden Programme sicherer

Das Prüfen der vom Anwender einzugebenden Daten etwa im Hinblick auf Plausibilität oder das korrekte Datenformat hat oberste Priorität.

Zu Beginn eines Softwareprojekts müssen Sicherheitsziele formuliert werden.

Rechtzeitige Analyse des Risikos und der Bedrohungen, idealerweise ebenfalls zu Beginn des Projekts.

Bedrohungen müssen priorisiert werden: Risiko = Schadenspotenzial mal Erfolgschance.

Gegenmaßnahmen sind zu implementieren, wie Bedrohungen zu begegnen ist.

Überwachungs- und Reaktionsmaßnahmen müssen entworfen, implementiert und getestet werden.

Frühzeitiges Erkennen und Beheben von Sicherheitslücken während der Codierung durch statische Analysen (Entwicklungsphase).

Prüfung auf Sicherheitslücken während der Runtime (Debug-Phase).

Tests mit bekannten Eindringmechanismen (Pre-Deploy-Phase).

Bei jeder Änderung an der Software sind sämtliche Sicherheitsmaßnahmen zu wiederholen.

Die zehn schlimmsten Fehler und Gefahren

Der größte Fehler ist, sich sicher zu fühlen! Es ist unmöglich, absolut sichere Anwendungen zu schreiben.

Schutzmaßnahmen in der Kryptografie oder das Einrichten von Firewalls alleine garantieren keine Sicherheit.

Der Anwender, der die Applikation nutzt, hat zu viele Rechte.

Die Prozesse, die von der Anwendung genutzt werden, haben zu viele Rechte.

Zu schwache Authentifizierung, das heißt keine Kryptografie und Mehr-Faktoren-Authentifizierung.

Angriffe werden gar nicht oder zu spät erkannt.

Angriffe können nicht bewiesen werden.

Ein Angreifer sieht Daten, die er nicht sehen soll (zum Beispiel lokale Dateien; Daten, die zwischen Rechnern übertragen werden; unautorisierte Datenbankzugriffe; Informationen über die Infrastruktur; Fehlermeldungen, die vertrauliche Informationen herleiten).

Ein Angreifer ist in der Lage, die Verfügbarkeit der Anwendung zu stören (generelles Ziel ist das Aufbrauchen von Bandbreite, Speicher und CPU- Zyklen).

Ein Angreifer findet einen Weg, seine Privilegien zu erhöhen.

Mehr zum Thema

www.computerwoche.de/go/

*72804: Security-Report: Keine Entwarnung bei Internet-Gefahren;

*60594: Web-Anwendungen - Achillesferse der IT;

*57249: Website-Analyse mit Hacker-Methoden;

152510: Flugschreiber für Programme.

Entwickler verwenden außerdem oft Verfahren, die zwar korrekt und funktional sind, aber ungewollt Möglichkeiten für Angreifer bieten, auf einer hohen Berechtigungsstufe auf die Anwendung zuzugreifen.

Die Entwicklung auch an Sicherheitskriterien auszurichten ist eine anspruchsvolle technische Aufgabe. Ziel muss sein, es Unbefugten so schwer wie möglich zu machen, in die Anwendung einzudringen. Das lässt sich am besten mit Hilfe eines methodischen Ansatzes erreichen, den die Entwickler strikt einhalten müssen.

Ein solches Konzept sollte die folgenden Maßnahmen umfassen:

• Frühzeitiges Erkennen und Beheben von Sicherheitslücken während der Codierung;

• Prüfung auf Sicherheitslücken während der Runtime;

• Tests mit verschiedenen bekannten Infiltrationsmechanismen.

Wenn man sich an diese Best Practices hält, erzeugt man eine wesentlich höhere Sicherheit, als es einfache Firewall-Konzepte können.

Idealerweise sollte schon bei der Codierung auf mögliche Sicherheitslücken geachtet werden. Manche Codiertechniken liefern zwar funktional einwandfreie Resultate, ermöglichen aber Unbefugten, sich über die Anwendung oder das Betriebssystem unerlaubt Zugang zu anderen Ressourcen zu verschaffen.

Die Verwendung sicherer Programmiertechniken bietet die beste Gelegenheit, um zu einem frühen Zeitpunkt der Entwicklung Sicherheitsmerkmale in eine Anwendung zu integrieren. Bessere Codierverfahren lassen sich am besten durch Überprüfungen des Sicherheitscodes implementieren. So kann das ganze Team seine Erfahrung einbringen, um Sicherheitsmängel zu erkennen und zu beheben. Die Automatisierung der Codeüberprüfung erlaubt eine effiziente Erkennung von Sicherheitsmängeln. Dabei lernen auch die Entwickler.

Viele unsichere Codierverfahren lassen sich feststellen, indem man bei der Programmierung nach Best-Practice-Richtlinien vorgeht und fortlaufend den Code überprüft. Manche Schwächen in der Codierung fallen aber auch beim Probelauf der Anwendung auf - wenn man über deren Funktions- und Wirkungsweise Bescheid weiß.

Vorsicht vor Schreibzugriffen

Ein gutes Beispiel für Sicherheitslücken, die sich während der Runtime erkennen lassen, sind fehlerhafte Berechtigungen. Wenn die Anwendung eine Datei öffnet, für die sowohl eine Lese- als auch eine Schreibberechtigung definiert sind, sie in der Praxis jedoch nur lesend auf die Datei zugreift, sind an dieser Stelle unnötige Schreibberechtigungen vorhanden. Warum ist dies kritisch für die Sicherheit? Eine Datei, auf die normalerweise kein Schreibzugriff erfolgen soll, die dies aber zulässt, bietet einem Eindringling die Möglichkeit zu einer Operation, die normalerweise nicht durch die Applikation vorgenommen wird. So kann er unter Umständen Daten verfälschen oder gar Berechtigungen im System erlangen. Eine gute Möglichkeit, um unsichere Praktiken zu identifizieren, ist zudem das Beobachten der laufenden Anwendung: Leicht zu erratende Passwörter, geöffnete und nicht wieder geschlossene Datenbankverbindungen und sogar unbehandelte Ausnahmezustände innerhalb der Anwendung können dabei auffallen.

Analysen dieser Art lassen sich automatisieren. Fertige Lösungen werden dazu benutzt, interne Aufrufe und Datentransfers innerhalb der Anwendung sowie im Betriebssystem und in der betreffenden Softwareumgebung festzuhalten. Eine gute automatisierte Analyse geht schneller und fällt umfassender aus, als es der beste Entwickler von Hand schaffen könnte.

Einbrüche simulieren

Kein Sicherheitskonzept kann als vollständig betrachtet werden, bevor nicht versucht wurde, in die laufende Anwendung einzudringen. Auch hierbei empfiehlt sich eine automatisierte Vorgehensweise. Eine spezielle Software erzeugt und simuliert unterschiedliche Attacken, die bekannten Mustern folgen. So lässt sich sicherstellen, dass die Anwendung zumindest auf diese Art nicht zu knacken ist. Stößt man dabei auf eine Sicherheitslücke, kann das Problem behoben und überprüft werden, bevor die Anwendung in Produktion geht.

Buffer Overflows

Zu den Schwachstellen, die sich auf diese Weise feststellen lassen gehören die berüchtigten Buffer Overflows. Dabei hat ein Eindringling die Möglichkeit, den für einen Eingangswert reservierten Speicher zu überschreiben und damit die Anwendung zum Absturz zu bringen. Ein weiteres Beispiel für eine Attacke ist die Eingabe von Escape-Zeichen (zum Beispiel "%") in ein Feld in einer Anwendung. Dieser Trick wird auch als Parametermanipulation bezeichnet. Wenn hier kein Schutz vorgesehen ist, können Eindringlinge die Anwendung verlassen und Befehle an das Betriebssystem oder die Datenbank schicken, Scripts ausführen oder Werte in Cookies verändern.

Daneben gibt es eine Reihe von weniger bekannten, aber sehr wirksamen Attacken, die auf bereits produktiv gesetzte Anwendungen verübt werden können. Nur durch die vorbeugende Suche nach Sicherheitslücken bereits während der Entwicklung lassen sich solche Angriffe verhindern. (ave)