Security Sicher programmieren - aber wie?

Sicherheit von Software verbessern
Sicherheit von Software verbessern

Rund zwei Drittel aller Sicherheitslücken resultieren aus Programmierfehlern. Also sollte man hier ansetzen, wenn man die Sicherheit von Software verbessern will. Doch das ist leichter gesagt als umgesetzt. Ein paar Tipps gibt es dennoch.

Ende 2013 und Anfang 2014 wurde bekannt, dass infolge von Sicherheitslücken auf der ganzen Welt persönliche Daten von mehr als 100 Millionen Personen entwendet wurden. Nach Angaben des deutschen Bundesamts für Sicherheit in der Informationstechnik (BSI) sind darunter allein 16 Millionen Internetnutzer aus Deutschland. Aufgedeckt wurde die vom BSI bekanntgegebene Sicherheitsverletzung im Rahmen einer Analyse, die von Forschungsinstitutionen und Strafverfolgungsbehörden in illegalen Bot-Netzen durchgeführt wurde. Im Zusammenhang mit der Bekanntgabe erging an die betroffenen Nutzer eine Warnung vor dem Risiko des Identitätsdiebstahls. Die Verwundbarkeit kritischer Infrastrukturen mit Internet-Anbindung rückt mit jeder neu bekannt werdenden Sicherheitsverletzung mehr ins Bewusstsein – ebenso wie der Bedarf an sicheren, gegen Cyber-Attacken immunen Systemkomponenten.

Unter den Systemen, die Opfer der jüngst gemeldeten Attacken wurden, befanden sich auch zahlreiche Embedded-Systeme wie zum Beispiel Kartenzahlungs-Terminals. Das Spektrum der anfälligen Embedded-Geräte beschränkt sich indes nicht allein auf Terminals in Ladengeschäften, denn immer mehr Kreditkarten-Transaktionen werden mit Mobilgeräten wie Smartphones oder Car-Infotainment-Systemen abgewickelt. Die Tatsache, dass sich die Funktion dieser Geräte zunehmend auf die Verfügbarkeit einer Internetverbindung stützt, macht die Notwendigkeit deutlich, die Software sicher zu machen, um Schutz vor derzeit bekannten und künftigen Sicherheitslücken zu gewähren.

Qualität allein genügt nicht

Die Definition, welche Software sicher ist und welche nicht, erweist sich als nicht ganz einfach. Eine vor Jahrzehnten geschriebene Software kann auch dann Sicherheitslücken aufweisen, wenn sie heute auf einer modernen, sicheren Plattform verarbeitet wird. Umgekehrt kann eine neue entwickelte sichere Applikation angreifbar werden, wenn sie auf einer alten Betriebssystem-Plattform läuft, in die keine Sicherheits-Patches eingespielt wurden.

Software-Schwachstellen können vielfältige Ursachen haben. Dazu gehören Programmier- und Konfigurationsfehler ebenso wie Mängel in der Architektur und im Design. Der Großteil der Anfälligkeiten resultiert jedoch aus Programmierfehlern. Deshalb muss das Hauptziel beim Schreiben sicherer Software darin bestehen, die Sicherheit von Anfang an einzubauen. Bei der Software-Entwicklung wird die Betonung großenteils auf das Erstellen qualitativ hochwertiger Software gelegt. Qualitativ hochwertig ist jedoch keineswegs gleichbedeutend mit sicher. Man denke hier nur an die Office-, Medienwiedergabe- oder Internet-Browser-Software, die wir alle tagtäglich nutzen. In diesen Applikationen werden nahezu jede Woche neue Schwachstellen entdeckt. Das liegt daran, dass diese Applikationen geschrieben wurden, um Funktions-Anforderungen zu erfüllen, nicht aber um Sicherheitsvorgaben einzuhalten. Mit Hilfe von Tests wird überprüft, dass die Software die einzelnen Anforderungen erfüllt. Software-Probleme aber können weiter bestehen, auch wenn die funktionalen Anforderungen eingehalten werden. Tatsächlich werden Software-Schwachstellen sogar häufig durch unbeabsichtigte Funktionen des Systems verursacht.

Das Erstellen sicherer Software setzt voraus, dass der bislang auf Qualität fokussierte Software-Entwicklungs-Lebenszyklus durch Sicherheitskonzepte ergänzt wird, wann immer die Sicherheit als Qualitätsattribut der zu entwickelnden Software angesehen wird. Da es beim Schreiben von sicherem Code darum geht, bekannte Schwachstellen und Defekte zu eliminieren, ist sichere Software zwangsläufig auch von hoher Qualität.

Bestandsaufnahme der Risiken

Am Anfang der Entwicklung steht eine Verständigung über die im Einsatzbereich der zu entwickelnden Software existierenden Sicherheitsrisiken. Hierzu werden diese Risiken im Rahmen einer Bestandsaufnahme ermittelt. Mit dieser Vorgehensweise wird sichergestellt, dass das Wesen und die Folgewirkungen einer Sicherheitsverletzung vor dem Deployment begutachtet werden, um daraufhin die Sicherheits-Checks zu identifizieren, die zur Abmilderung der festgestellten Folgewirkungen erforderlich sind. Die so ermittelten Sicherheits-Checks werden anschließend als Systemanforderungen übernommen.

Die Ergänzung der Software-Anforderungen durch den Sicherheitsaspekt bietet die Gewähr, dass die Sicherheit Eingang in die Definition der Korrektheit des Systems findet und auf diese Weise den gesamten Entwicklungsprozess durchdringt. Eine spezifische Sicherheitsanforderung kann die Validierung aller von den Anwendern eingegebenen Zeichenketten verlangen, um sicherzustellen, dass die Strings eine bestimmte Maximallänge nicht überschreiten. Eine allgemeiner gehaltene Sicherheitsanforderung wiederum kann die Abwehr von Denial-of-Service-Angriffen verlangen. Unabhängig davon, welches Ende des Spektrums man betrachtet, kommt es darauf an, dass die Evaluierungskriterien für eine Implementierung festgelegt werden.

Es ist ratsam, bei der Umsetzung der Anforderungen in das Design zu berücksichtigen, auf welche Weise Sicherheitsrisiken durch das Architekturdesign abgemildert werden können. Hierfür kommt die Implementierung von Technologien ebenso in Frage wie die Einbindung sicherheitsorientierter Features, wie zum Beispiel der Umgang mit nicht vertrauenswürdigen Anwender-Interaktionen, indem Eingaben und/oder Systemantworten durch einen unabhängigen Prozess validiert werden, bevor die Weitergabe an die zentralen Prozesse erfolgt.

Die wirkungsvollste Methode für das Erstellen von sicherem Code aber ist die Anwendung sicherer Codierverfahren, unter anderem durch den Einsatz statischer und dynamischer Sicherheitsmaßnahmen. Die lohnendste Investition stellt die Durchsetzung sicherer Programmierregeln mit Hilfe statischer Analyse-Tools dar. Mit der Einbeziehung von Sicherheitskonzepten in den Anforderungsprozess wird dafür gesorgt, dass mit einer dynamischen Absicherung durch sicherheitsorientiertes Testen die korrekte Implementierung der Sicherheits-Features verifiziert wird.