Sichere Softwareentwicklung nach dem "Security by Design"-Prinzip

Mini-SDL

Institutionalisierung

Microsofts SDL lässt sich als umfassender, reifer und detaillierter Ansatz zur konsequenten Verbesserung der Softwaresicherheit werten. Jedes Programm ist bei Microsoft SDL-konform zu entwickeln. Windows Vista war das erste Produkt, das die Firma von Beginn an so programmiert hatte. Das bedeutet nicht, dass Vista komplett fehlerfrei und ohne Sicherheitsfehler ist, denn hundertprozentige Sicherheit ist in der Praxis nur schwer realisierbar.

Die Einführung eines SDL ist eine komplexe Aufgabe, deren erfolgreiche Umsetzung meist eine Änderung der Softwareentwicklungskultur zur Folge hat. Deshalb empfiehlt es sich, klein zu beginnen und den SDL kontinuierlich auszuweiten.

Im Idealfall beginnt die Umsetzung eines SDL mit einer Software-Sicherheitsinitiative. Sie hat das Ziel, sichere Softwareentwicklung einzuführen. Hierfür benötigt man die Unterstützung des Managements. Ist sie gewährleistet, geht es an die Umsetzung. Microsofts SDL-Modell ist für den Einstieg zu umfangreich, zudem erfordert SDL einen hohen Grad an Individualisierung. Die einfache Übernahme einer existierenden Umsetzung ist daher nicht empfehlenswert.

Die ersten Maßnahmen sind zunächst an einer beschränkten Anzahl von Projekten und in einem reduzierten Umfang durchzuführen. Alternativ ließe sich breitflächig, jedoch mit reduzierten Maßnahmen beginnen. Auch eine Kombination beider Ansätze ist denkbar. Wichtig ist, die Sicherheitsmaßnahmen zu bestimmen, die während der Entwicklungsphase anzuwenden sind.

Einen praxiserprobten Ansatz könnte ein Mini-SDL darstellen, der nur die wichtigsten Sicherheitsmaßnahmen enthält. Wendet man sie in einem Softwareentwicklungsprozess an, lässt sich damit die Sicherheit deutlich verbessern. Mittelfristig sind die Grundansätze zu erweitern und auszubauen.

Der Mini-SDL entspricht dem Microsoft-SDL, reduziert auf die wichtigsten Maßnahmen (Abb. 3).

Die Minimalumsetzung besteht aus fünf Schritten:

  1. Managementunterstützung sicherstellen
  2. Awareness und Schulung
  3. Risikoanalyse
  4. sichere Programmierung anwenden
  5. Test und Review

Schritt 1 ist die Grundlage für ein erfolgreiches Gelingen. Lässt sich die Initiative nicht mit Unterstützung des Managements starten, besteht die Gefahr, dass man unter Zeitdruck Sicherheitsmaßnahmen vernachlässigt. Um das zu verhindern, muss die Sicherheit eine Vorgabe sein, die im Abnahmeprozess geprüft werden muss.

Ist die Unterstützung gewährleistet, sollte man gewährleisten, dass alle Softwareentwickler die Sicherheitsgefahren kennen und wissen, wie sie den Gefahren begegnen können. Im Rahmen von Schulungen lassen sich Awareness und Wissen um sichere Programmierung vermitteln. Daraus hervorgehend sollte man Leitlinien oder Vorgaben definieren. Sie unterstützen später Review und Abnahme sowie erleichtern neuen Mitarbeitern den Einstieg in die sichere Programmierung. Beide Maßnahmen sind vor einem Projekt durchzuführen. Streng genommen gehören sie nicht in den Softwareentwicklungszyklus. Weil sie vor jedem Projekt von neuem zu prüfen und sicherzustellen sind, lassen sie sich einer Initialisierungsphase zuordnen.

Der erste Schritt der Entwicklung besteht in einer Risikoanalyse, die den Softwareentwurf auf Sicherheitsrisiken hin prüft. Dazu eignet sich das Threat Modeling. Das bei Microsoft eingesetzte Verfahren erlaubt die Identifikation von Risiken und Gefahren im Entwurfsstadium. Entdeckt man Sicherheitsrisiken, sind Maßnahmen zu definieren und umzusetzen. Das Durchführen der Sicherheitsmaßnahme ist neben der sicheren Programmierung wohl der effektivste Punkt des Ansatzes.

Hat man Sicherheitsaspekte im Entwurf berücksichtigen und einplanen können, gilt es, die Entwicklung nach den Vorgaben sicherer Programmierung durchzuführen. Die wichtigsten sind – unabhängig von der Programmiersprache – folgende fünf Punkte:

  1. Prüfung von Ein- und Ausgaben
  2. Authentisierung und Zugriffskontrollen
  3. korrektes Handhaben und Schutz von sensitiven Informationen und Daten
  4. Befolgen des "Least Privilege"-Prinzips, das die tiefstmöglichen Privilegien vergibt
  5. Verhindern von Informationspreisgaben

Durch die Befolgung der Prinzipien lassen sich Sicherheitslücken in der Implementierungsphase wie SQL-Injection, Cross-Site Scripting oder Fehler in der Zugriffskontrolle vermeiden.

Der letzte Schritt umfasst Sicherheitstests der fertigen Anwendung, die prüfen sollen, ob die Vorgaben zur sicheren Programmierung eingehalten wurden, und gewährleisten, dass man keine Fehler, speziell keine sicherheitsrelevanten, implementiert hat. Das bedeutet beispielsweise die Prüfung des Sourcecodes. Es lassen sich nicht nur Konventionen und Qualität prüfen, sondern Entwickler können nach Sicherheitslücken suchen, sie dokumentieren und beheben. Geht man bei der Code-Review manuell vor, lassen sich die Resultate der Risikoanalyse aus Schritt 1 zum Identifizieren besonders kritischer Stellen beziehen. Das ermöglicht eine fokussierte und risikogetriebene Vorgehensweise.

Weil viele Sicherheitslücken speziell bei Eingaben auftreten, sind sie besonders abzufangen. Fuzzing ist hierfür eine wirksame und empfehlenswerte Maßnahme. Mit ihr lassen sich Eingabeschnittstellen mit generierten Eingaben beschicken und so lange testen, bis gewährleistet ist, dass das Programm bei unerwarteten Eingaben keine Probleme verursacht.