Tipps und Tricks für mehr Softwaresicherheit Security-Spickzettel für Entwickler

Autor / Redakteur: Mykola Mozgovy * / Stephan Augsten

Mit dem Thema Sicherheit sollten sich auch „einfache“ Entwickler beschäftigen. Da wäre es doch gut, eine Art Erinnerungs- oder Spickzettel zu haben? Hier folgt eine Liste, um welche Dinge man sich bei der Software-Sicherheit kümmern sollte.

Wer Software absichern muss, muss einige wichtige Problemfelder im Blick behalten.
Wer Software absichern muss, muss einige wichtige Problemfelder im Blick behalten.
(Bild: Maksim Pasko / stock.adobe.com)

Nicht jedes Development-Projekt kann sich einen Sicherheitsspezialisten leisten. Sicherheit ist aber ein entscheidendes Merkmal von Software. Dies gilt vor allem dann, wenn es sich um Software-gesteuerte Geräte handelt, von denen Leben und Gesundheit abhängen, oder Systeme, die personenbezogene Daten verarbeiten.

Software-Sicherheit unterscheidet sich der Bedeutung nach von den allgemeinen funktionellen Anforderungen und ist dadurch weniger intuitiv. Das gewünschte Programmverhalten wird normalerweise als vorrangiges Ziel angesehen, im Gegensatz dazu ist das, was das Programm nicht tun sollte, das Hauptanliegen von Sicherheit, mit anderen Worten – die Vermeidung des unerwünschten Verhaltens.

Sicherheitsmerkmale

Durchaus denkbar, dass Sie derjenige sind, der die Last der sicheren Software auf die eine oder die andere Art zu tragen hat. Deshalb haben wir diesen Security-Spickzettel für Sie erstellt. Im Folgenden zunächst einmal die drei Hauptmerkmale von Software, die wir mit Blick auf die Sicherheit bewahren wollen:

  • Vertraulichkeit: bedeutet, dass sensible Informationen nicht an Unbefugte gelangen dürfen;
  • Integrität: heißt, dass gespeicherte Informationen nicht durch Unbefugte modifiziert werden dürfen;
  • Verfügbarkeit: impliziert, dass ein System auf die Anfragen reagieren muss (gemäß der vereinbarten Bedingungen).

Während die Verfügbarkeit intuitiv mit dem Schutz vor DoS-Angriffen assoziiert wird, ist sie nicht darauf beschränkt. Man denke nur an folgende ebenso relevante Probleme: Anwendungs-Upgrades, Erneuerung der IP-Adressen-Zuteilung oder der Domain-Namen-Zuteilung oder der Rollover von Verschlüsselungs- und Authentifizierungszertifikatem.

Wenn diese Eigenschaften verletzt werden, gilt die Software als sicherheitsanfällig. Der Begriff der Sicherheitsanfälligkeit beschreibt einen sicherheitsrelevanten Software-Defekt, der ausgenutzt werden kann, um das unerwünschte Verhalten herbeizuführen. Wird die Anfälligkeit durch einen Design- und nicht Code-Defekt verursacht, so ist es ein Mangel.

Sicherheitsgrundsätze

Es gibt eine Reihe allgemeiner Grundsätze, die Sie beim Erstellen sicherer Software befolgen sollten. Im Allgemeinen können diese Grundsätze in folgende Kategorien unterteilt werden:

Prävention

Vollständige Fehlereliminierung; beispielweise ist es möglich, ganze Fehlersätze zu eliminieren, wenn man speichersichere Programmiersprachen wie Java oder C# anstatt von C/C++ verwendet.

Minimierung

Verringerung des Schadens, der durch die Ausnutzung eines unbekannten Fehlers entstehen könnte; beispielweise könnte man den Schaden einer gehackten Datenbank deutlich minimieren, wenn die gespeicherten Daten verschlüsselt sind. Ein weiteres Beispiel ist das Sperren von Konten mit verdächtigem Verhalten und die Anforderung der zusätzlichen Bestätigung über potentiell schädliche Aktionen.

Erkennung

Identifizieren und Verstehen des Angriffs (d. h. Überwachung); es ist erforderlich, so schnell wie möglich über potentiell böswillige Aktionen informiert zu werden. Umfangreiche Echtzeit-Telemetrie ist in solchen Fällen sehr hilfreich.

Wiederherstellung

Schaden rückgängig machen; es ist immer erforderlich, Daten zu sichern und extra Ressourcen für den Notfall bereit zu halten. Darüber hinaus ist es äußerst wichtig, über die Verfahren zur Wiederherstellung von gehackten Benutzer-Konten zu verfügen.

Beim Entwerfen, bei der Implementierung oder beim Warten der Software sollten Sie folgende Grundregeln beachten:

Einfachheit (Prävention)

  • 1. Bevorzugen Sie einfaches Design:Keep it simple, stupid“, ist ein bekanntes Meme, das in unserem Kontext absolut anwendbar ist. Überlegen Sie es sich gut, wenn Sie sich zwischen einem altmodischen monolithischen System und hochgejubelten Microservices entscheiden. Berücksichtigen Sie verfügbare Kapazitäten und Kompetenzen.
  • 2. Benutzen Sie Fail-Safe-Defaults: Verwenden Sie niemals Standard-Kennwörter, wenden Sie branchenübliche Verschlüsselungsmechanismen an, ziehen Sie Whitelisting dem Blacklisting vor, usw.
  • 3. Erwarten Sie keine erfahrenen Benutzer: Je mehr Macht Sie uneingeschränkt geben, desto höher ist die Wahrscheinlichkeit des Machtmissbrauchs. Zum Beispiel erfordert die Installation von Anwendungen aus nicht vertrauenswürdigen Quellen auf Android (APK-Dateien) explizite Aktivierung dieser Funktion in den Geräteeinstellungen, was eine angemessene narrensichere Lösung darstellt.
  • 4. Bevorzugen Sie einfache Benutzeroberflächen: Noch einmal, Komplexität ist ein Feind der Sicherheit. Eine komplexe Benutzeroberfläche erhöht die Wahrscheinlichkeit eines Fehlers sowohl bei dem Entwickler als auch bei dem Benutzer.
  • 5. Geben Sie den Benutzern keine Möglichkeit, Sicherheitsentscheidungen zu treffen: Man kann nicht davon ausgehen, dass die Benutzer die Verschlüsselungsprogramme oder auch nur die Regeln des sicheren Online-Verhaltens verstehen, lassen Sie daher keine Verschlüsselungsalgorithmen und Verschlüsselungscodes oder unsichere Passwörter auswählen.

Zurückhaltendes Vertrauen (Prävention, Minimierung)

1. Nutzen Sie eine kleine Trusted Computing Base: Je mehr Komponenten das System umfasst (sowohl Hardware als auch Software), desto größer ist die Angriffsfläche. In diesem Sinne sollte jede neue Plattform, die Sie unterstützen, und jeder Service, den Sie einbeziehen, als eine Risiko-und Gefahrenquelle betrachtet werden.

2. Verwenden Sie keine eigene Verschlüsselung: Verschlüsselung ist eine keinesfalls triviale Angelegenheit, so dass der Versuch ihre Aspekte selbst umzusetzen, nichts anderes als eine Einbildung ist, es sei denn Sie sind ein Fachmann. Der richtige Ansatz besteht darin, offene branchenübliche Protokolle und Algorithmen zu verwenden.

3. Least-Privilege-Prinzip für Komponenten und Benutzer: Seien Sie vorsichtig, wenn Sie Ihrer Anwendung und Benutzern Berechtigungen erteilen (auch indirekt). Benötigt Ihre Anwendung wirklich den Zugriff auf ein Dateisystem? Müssen Lesevorgänge für eine Datenbank unter einem Konto mit höheren Berechtigungen durchgeführt werden?

4. Eingabevalidierung: Füttern Sie Ihr System nicht mit fehlerhaften Daten. Definieren Sie eindeutig die Grenzen der gültigen Daten und setzen Sie diese durch Whitelisting durch.

5. Fördern Sie die Privatsphäre: Begrenzen Sie den Zugriff auf die personenbezogenen Daten; Die formale Definition der privaten/personenbezogenen Daten kann je nach lokalem Recht unterschiedlich sein, während das gemeinsame Merkmal der privaten Daten eine direkte oder eine indirekte Möglichkeit ist, die eigentliche Person zu ermitteln, zu der diese Daten gehören.

6. Unterteilung: Nutzen Sie Prozesse, Container und Sandboxen, um Komponenten oder sogar bestimmte Vorgänge voneinander zu trennen.

7. Defense in Depth:

   a. Sicherheit durch Vielfalt (HTTPS + sichere Sprache + Datenverschlüsselung + VPN); Kombinieren Sie alle Ihnen zur Verfügung stehenden Sicherheitsmechanismen. Unterlassen Sie gleichzeitig die Verwendung von Tools, mit denen Sie sich nicht auskennen, und engagieren Sie gegebenenfalls einen Fachmann.

   b. Nutzen Sie Standard- und Open-Source-Lösungen (vermeiden Sie Sicherheit durch Unklarheit); Sie müssen von dem Gedanken wegkommen, dass proprietäre Software oder Protokolle (vor allem Ihre eigenen) Schutz bieten, da sie keiner kennt. Nur von öffentlich verfügbaren und untersuchten Tools und Protokollen kann man behaupten, dass sie sicher sind.

8. Überwachung und Rückverfolgbarkeit (Prävention/Wiederherstellung):

   a. Sammeln Sie Protokolle, Telemetrie. Denken Sie daran, Warnmeldungen bei gefährlichen/verdächtigen Vorfällen zu erstellen.

   b. Erstellen Sie Backups/Snapshots. Bewahren Sie sie auf separaten Servern auf und stellen Sie sicher, dass Sie über Wiederherstellungsmechanismen verfügen.

Natürlich ist es möglich, weitere Grundsätze dieser Art zu entwickeln, dabei sollte die Befolgung der bereits definierten in den meisten Fällen genügen.

Der sichere Entwicklungsprozess

Es kommt nicht selten vor, dass die Sicherheitsfragen reaktiv behandelt und aufgeschoben, bis sie unzumutbar werden. Dies ist ein falscher Ansatz. Ein sicherer Entwicklungsprozess bedeutet, dass die erforderlichen Tätigkeiten und Verfahren für jede Entwicklungsstufe eingeführt werden:

Anforderungen

  • 1. Definieren Sie die Sicherheitsanforderungen (Missbrauchsfall): Ein Missbrauchsfall ist das Gegenteil vom Anwendungsfall (oder der funktionellen Anforderung). Was das System nicht tun sollte, sollte explizit definiert werden.
  • 2. Definieren Sie die Sicherheitseigenschaften der Systemkomponenten (z.B. Vertraulichkeit, Integrität, Verfügbarkeit): Bestimmen Sie explizit, welche Teile der gespeicherten Daten vertraulich sind. Bestimmen Sie, welche Rollen im System vorhanden sind, und welche Daten sie bearbeiten sollen. Vereinbaren Sie die Verfügbarkeitsanforderungen.
  • 3. Definieren Sie die Sicherheitsmechanismen zur Unterstützung dieser Merkmale (Authentifizierung, Autorisierung, Audit): Das Vorhandensein dieser drei Au*-Mechanismen wird oft als "Der goldene Sicherheitsstandard" angesehen. Ein System kann nicht als sicher angesehen werden, wenn eines davon fehlt.
  • 4. Definieren Sie die Bedrohungsmodelle: Es ist notwendig, den Angreifer und mögliche Angriffsflächen zu definieren (z.B. Netzwerkverkehr, lokale Dateien, oder auch angezeigte Daten, etc.).

Design

  • 5. Bedrohungsorientiertes Design (reagiert auf die zuvor definierten Bedrohungsmodelle im Systemdesign);
  • 6. Risikoanalyse/Bewertung der Architektur (Erkennen der potentiellen Design-Fehler);
  • 7. Wenden Sie die oben definierten Sicherheitsgrundsätze an (Prävention, Minimierung, Erkennung, Wiederherstellung).

Umsetzung

1. Befolgen Sie die besten Kodierstandards-und Richtlinien.

2. Führen Sie vorgeschriebene Code-Überprüfungen durch.

3. Wenden Sie Automatisierungstools an, um die höchste Codequalität zu gewährleisten.

   a. Statistische Analyse

   b. Symbolische Ausführung

   c. Concolische Ausführung

4. Testen

   a. Risiko-basierte Sicherheitstests: Diese Tests betreffen die wichtigsten Teile des Systems, die durch Bedrohungsmodellierung festgestellt werden.

   b. Penetrationstest: Sicherheitsspezialosten übernehmen die Rolle eines Eindringlings und versuchen, die Sicherheitsmechanismen zu überwinden.

   c. Fuzz Testing: Versorgung des Systems mit zufälligen und fehlerhaften Daten kann oft unerwünschte Verhaltensweisen aufdecken.

Häufige Design- und Implementierungsfehler

Wenn Sie einen sicheren Entwicklungsprozess verfolgen, denken Sie immer an Irrtümer, die den Entwicklern oft unterlaufen:

  • Annahme des Vertrauens, anstatt es explizit zu geben;
  • Verwendung eines Authentifizierungsmechanismus, den man umgehen kann;
  • Autorisierung ohne ausreichenden Kontext;
  • Verwechselung von Daten und Steueranweisungen; Das ist genau die Quelle der berüchtigten SQL-Injections, XSS-Angriffe, und Remote-Code-Ausführungen.
  • Fehlende Datenvalidierung;
  • Keine richtige Verschlüsselungsanwendung;
  • Keine Identifizierung sensibler Daten;
  • Integration der externen Komponenten ohne Berücksichtigung deren Angriffsfläche;
  • Strenge Beschränkung der künftigen Veränderungen.

OWASP und die 10 wichtigsten Sicherheitslücken

Das Open Web Application Security Project ist eine Non-Profit-Organisation, die sich mit der Verbesserung der Software-Sicherheit beschäftigt. Und Sie können ihre Ressourcen optimal nutzen. Diese Organisation bietet nützliche Empfehlungen und „Spickzettel“ für beliebte Entwicklungsplattformen wie. Net und Java. OWASP ist in erster Linie für ihre „Top Ten“-Liste bekannt, die die häufigsten Schwachstellen in verschiedenen Bereichen beschreibt:

Sicherheit für Entwickler: die Quintessenz

Behandeln Sie die Sicherheitsbelange zuerst, schieben Sie sie keinesfalls bis zum bitteren Ende auf. Planen und führen Sie alle erforderlichen Tätigkeiten während jeder Entwicklungsphase durch, um Ihre Kunden und Ihr Ansehen zu schützen.

Beachten Sie, dass es sich bei diesem Artikel nur um einen allgemeinen Spickzettel handelt. Es erfordert viel Lernen und Übung, um ein kompetenter Spezialist zu werden. Sie müssen unbedingt Ihre Zeit und Ressourcen investieren und an entsprechenden Lehrgängen teilnehmen oder sogar eine Zertifizierung in Ihrem besonderen Interessenfeld erhalten.

* Mykola Mozgovy ist Senior Software Developer bei Sigma Software.

(ID:47374223)