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. Der primäre Fokus eines Codereviews sollte sein, dass sichergestellt wird, dass diese Security Controls an allen relevanten Stellen vorhanden sind, dass sich ordnungsgemäß arbeiten und dass sie nicht umgangen werden.

Die folgende Checkliste soll bei der Analyse helfen, dass die wahrscheinlichsten Risiken vom 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.
  • Prüfen ob alle Web-Seiten auf Authentifizierung hin geprüft werden.
  • 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).
  • 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 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 stattfinden kann.
  • 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, 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.
  • 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.

Weiter zum 6. Teil