- 1. Teil: Einleitung
- 2. Teil: Analyse der Anwendung
- 3. Teil: Datenfluss-Diagramm
- 4. Teil: Ermittlung und Einstufung von Bedrohungen
- 5. Teil: Security Controls – Maßnahmen zur Bedrohungsabwehr
- 6. Teil: Bedrohungsanalyse – Threat Analysis
- 7. Teil: Einstufung von Bedrohungen – Ranking of Threats
- 8. Teil: Gegenmaßnahmen
- 9. Teil: Zusammenfassung
Table of Contents
Security Controls – Maßnahmen zur Bedrohungsabwehr
Wurden die grundlegenden Bedrohungen und deren Auswirkungen verstanden, sollte das Review-Team versuchen die Security Controls zu identifizieren, so dass diese einen Angriff verhindern können. Dies ist ein sehr zentraler Bestandteil des Threat Modelings, da hier wichtige Bestandteile der realen Abwehrmaßnahmen benannt und bewertet werden. Auch wenn in diesem Beispiel von einer Software-Anwendung ausgegangen wird, kann dies auch auf andere Systeme übertragen werden, beispielsweise Netzwerke, Infrastruktur oder Hardware.
Wir wollen hier aber zunächst beim Beispiel einer Software-Anwendung bleiben. Der primäre Fokus eines Codereviews sollte sein, dass sichergestellt wird, dass Security Controls an allen relevanten Stellen vorhanden sind, dass sie ordnungsgemäß arbeiten und dass sie nicht umgangen werden können. Erst diese 3 Eigenschaften, lassen ein Security Control sinnvoll werden.
Die folgende Checkliste soll bei der Analyse helfen, dass die wahrscheinlichsten Risiken unserem Software-System berücksichtigt werden.
Authentifizierung
- Alle internen- und externen Verbindungen (Benutzer und Systeme) müssen eine angemessene und adäquate Form der Authentifizierung durchlaufen. Diese Maßnahme darf nicht umgangen werden können.
- Wird auf allen Web-Seiten die Authentifizierung geprüft?
- Sicherstellen, dass bei der Übertragung von Authentifizierungsdaten (oder sonstigen sensiblen Daten) nur die HTTP POST Methode verwendet wird, und HTTP GET nicht akzeptiert wird.
- Alle Web-Seiten, die für Entwickler / Admins / Backoffice-Anwender erstellt wurden und keine Authentifizierung brauchen, sollten besonders auf Sicherheitslücken hin überprüft werden.
- Sicherstellen, dass Authentifizierungsdaten nicht unverschlüsselt übertragen werden.
- Sicherstellen, dass Hintertüren zur Authentifizierung für Entwickler zum Debugging nicht im Produktions-Code vorhanden sind.
Autorisierung
- Sicherstellen, dass ein Autorisierungs-Mechanismus eingesetzt wird.
- Sicherstellen, dass die Applikation eine klare Definition von Benutzerrollen hat und deren Berechtigungen definiert sind.
- Sicherstellen, dass das Prinzip der minimalen Berechtigung eingehalten wird (Principle of least privilege). Jeder Benutzer darf nur die Berechtigungen bekommen, die er minimal braucht.
- Sicherstellen, dass die Autorisierungsmechanismen sauber arbeiten, ausfallsicher sind und nicht umgangen werden können.
- Sicherstellen, dass die Autorisierung bei jedem Request überprüft wird.
- Sicherstellen, dass Hintertüren zur Autorisierung für Entwickler zum Debugging nicht im Produktions-Code vorhanden sind.
Cookie Management
- Sicherstellen, dass sensible Informationen nicht in Cookies oder im local Storage des Browsers enthalten sind – und so wenig private Daten wie möglich.
- Sicherstellen, dass unautorisierte Aktionen nicht durch Cookie-Manipulation möglich sind.
- Sicherstellen, dass Cookie-Inhalte adäquat verschlüsselt sind.
- Sicherstellen, dass das Secure-Flag bei Cookies immer gesetzt ist, damit keine unverschlüsselte Übertragung von Cookies stattfinden kann (HTTPS-Downgrade-Attack).
- Sicherstellen, dass bei Zustandsübergängen der Applikation die Cookie-Überprüfung berücksichtigt wird.
- Sicherstellen, dass Session-Daten validiert werden.
- Alle Cookies mit Namen dokumentieren, warum sie von der Applikation gebraucht werden.
Eingabe-Validierung
- Sicherstellen, dass eine Validierung bei der Eingabe von Daten vorhanden ist.
- Sicherstellen, dass alle Eingaben, die von Angreifern modifiziert werden können, adäquat validiert werden: HTTP-Header, Eingabefelder, Hidden Fields, Drop-Down-Listen und andere zur Eingabe verwendete Komponenten auf Webseiten.
- Sicherstellen, dass eine saubere Überprüfung von Eingabe-Grössen bzw. Längen existiert.
- Sicherstellen, dass alle Felder, Cookies, HTTP-Header und -Bodys sowie Formularfelder validiert werden
- Sicherstellen, das alle Eingabedaten in einem gültigen Format vorliegen und nur Zeichen enthalten, die als harmlos einzustufen sind.
- Sicherstellen, dass die Validierung serverseitig stattfindet.
- Untersuchen, wo die Eingabevalidierung stattfindet und ob ein zentralisiertes Modell, oder ein dezentrales Modell verwendet wird.
- Sicherstellen, dass keine Hintertüre existiert, um die Eingabevalidierung zu umgehen.
- Goldene Regel: sämtliche Eingabedaten müssen untersucht und validiert werden, egal was es ist.
Error Handling
- Sicherstellen, dass alle Methodenaufrufe ein adäquates Errorhandling verwenden und die Rückgabewerte geprüft werden.
- Sicherstellen, dass Exceptions und Fehlerfälle sauber gehandelt werden.
- Sicherstellen, dass keine System-Fehlermeldungen dem Benutzer geliefert werden, sondern nur generische Meldungen ohne Details.
- Sicherstellen, dass die Anwendung bei Fehlerfällen in einem sicheren Zustand bleibt.
- Sicherstellen, dass verwendete Ressourcen im Fehlerfall wieder freigegeben werden.
Logging / Auditing
- Sicherstellen, dass keine sensiblen Daten geloggt werden beim Loggen eines Fehlerfalls (Cookies, HTTP GET Methoden, Authentifizierungs Credentials)
- Sicherstellen, dass die Loggingdaten eine definierte, maximale Länge haben, und dass die Logging-Funktion dies prüft.
- Untersuchen, ob die Applikation Aktionen des Clients fürs Audit protokolliert. Insbesondere CUD-Operationen an Daten (Create, Update, Delete).
- Sicherstellen, dass Authentifizierungs-Vorgänge geloggt werden – egal ob die Versuche erfolgreich sind oder nicht.
- Sicherstellen, dass Applikations-Fehler geloggt werden.
- Untersuchen, ob beim Logging im Debug-Level sensible Daten geloggt werden
Kryptographie
- Sicherstellen, dass keine sensiblen Daten unverschlüsselt übertragen werden, intern und extern.
- Sicherstellen, dass die Anwendung gut bekannte, adäquate kryptographische Methoden implementiert.
Sichere Programmierung und -Umgebung – Secure Code Environment
- Untersuchung der Dateien-Struktur. Gibt es Komponenten, die für die Benutzer nicht zugreifbar sein sollten?
- Untersuchung aller Memory Acclocations/De-Allocations (falls anwendbar – hängt von der Programmiersprache ab)
- Untersuchung der Applikation nach dynamischem SQL. Ist dies verwundbar für SQL-Injection?
- Untersuchung der Applikation nach ausführbaren main()-Methoden und Debugging-Möglichkeiten bzw. Hintertüren.
- Suche nach auskommentiertem Code und auch auskommentiertem Test-Code, der möglicherweise sensible Daten enthält.
- Sicherstellen, dass alle logische Bedingungen einen Default-Handler haben.
- Sicherstellen, dass keine Dateien der Entwicklungsumgebung in den Build-Verzeichnissen bzw. Build-Artefakten enthalten sind.
- Suche nach Aufrufen des darunterliegenden Betriebssystems oder Datei-Öffnen-Aufrufen und Auswertung ihrer Fehler-Möglichkeiten
Session Management
- Untersuchen wie und wann eine Session für den Benutzer erstellt wird – unauthentifiziert und authentifiziert.
- Untersuchen der Session-ID und verifizieren, dass sie komplex genug ist, um die Anforderungen der Stärke zu erfüllen.
- Untersuchen wie Sessions gespeichert werden – bzw. in einer Datenbank oder im Speicher, etc.
- Untersuchen wie die Applikation Sessions trackt.
- Die Aktionen untersuchen, die die Applikation vornimmt, wenn eine ungültige Session-Id verwendet wird.
- Die Session-Invalidierung untersuchen.
- Untersuchen wie multithreaded/multi-user Sessionmanagement gemacht wird.
- Das Session-Timeout-Verhalten untersuchen.
- Die Logout-Funktion untersuchen in Bezug auf Session-Invalidierung.