Firefox Sicherheitsrichtlinien
Zweck
Dieses Dokument skizziert eine Reihe von Sicherheitsrichtlinien, die allgemein für alle Client-Anwendungen wie Firefox und Thunderbird gelten.
Sichere Programmierprinzipien
Stellen Sie sicher, dass die Anwendung den OWASP Secure Coding Principles folgt:
- Minimieren der Angriffsfläche
- Etablieren von sicheren Standardwerten
- Prinzip der minimalen Rechte
- Prinzip der Tiefenverteidigung
- Sicheres Scheitern
- Dienstleistungen nicht vertrauen
- Sicherheit einfach halten
- Sicherheitsprobleme korrekt beheben
Eingabeverifizierung
-
Akzeptiert die Anwendung Benutzereingaben?
- Überprüfen Sie eine Auswahl an Eingabestellen, um sicherzustellen, dass vernünftige Maximalwerte bei der Annahme von Benutzerdaten vorhanden sind
- Überprüfen Sie eine Auswahl an Eingabestellen, um sicherzustellen, dass die Anwendung nur eine definierte Menge akzeptabler Zeichen zulässt
- Stellen Sie sicher, dass das Allowlisting anstelle des Denylisting verwendet wird
-
Akzeptiert die Anwendung Benutzereingaben, die auf irgendeine Weise angezeigt werden?
- Überprüfen Sie eine Auswahl an Eingabe- und Ausgabestellen, um sicherzustellen, dass vom Benutzer bereitgestellte Inhalte korrekt im Antwortinhalt kodiert sind
Chrome JS - Gefährliche Funktionen
Werden eine der folgenden Funktionen verwendet?
Falls ja, stellen Sie sicher, dass sie sicher sind und keine besseren Alternativen zur Verfügung stehen.
Name | Risikostufe | Problem | Lösung |
---|---|---|---|
eval | Sehr Hoch | Ruft den JavaScript-Parser auf - gefährlich bei unzuverlässigen Eingaben | Vermeiden Sie eval wenn möglich. |
setTimeout(string, time) | Sehr Hoch | Handelt wie eval | Verwenden Sie setTimeout(function, time, param1, param2, …) |
C++ - Gefährliche Funktionen
Werden eine der folgenden Funktionen verwendet?
Falls ja, stellen Sie sicher, dass sie sicher sind und keine besseren Alternativen zur Verfügung stehen.
Name | Risikostufe | Problem | Lösung |
---|---|---|---|
gets | Sehr Hoch | Keine Grenzenprüfung | Verwenden Sie nicht gets. Nutzen Sie stattdessen fgets. |
strcpy | Sehr Hoch | Keine Grenzenprüfung | strcpy ist nur sicher, wenn der Quellstring konstant ist und das Ziel groß genug ist, um ihn aufzunehmen. Andernfalls nutzen Sie strncpy. |
sprintf | Sehr Hoch | Keine Grenzenprüfung, Format-String-Angriffe | sprintf ist sehr schwer sicher zu verwenden. Nutzen Sie snprintf stattdessen. |
scanf, sscanf | Hoch | Möglicherweise keine Grenzenprüfung, Format-String-Angriffe | Stellen Sie sicher, dass alle %-Direktiven den entsprechenden Argumenttypen entsprechen. Verwenden Sie keine '%s'-Direktiven ohne Grenzenprüfung. Nutzen Sie '%xs', wobei x die Puffergröße des entsprechenden Arguments ist. Verwenden Sie keine unzuverlässigen, ungeprüften Daten im Format-String. |
strcat | Hoch | Keine Grenzenprüfung | Wenn die Eingabegrößen nicht wohlbekannt und festgelegt sind, verwenden Sie strncat stattdessen. |
printf, fprintf, snprintf, vfprintf, vsprintf, syslog | Hoch | Format-String-Angriffe | Verwenden Sie keine unzuverlässigen, ungeprüften Daten im Format-String. Falls der Format-String durch Webinhalt oder Benutzereingaben beeinflusst werden kann, validieren Sie ihn auf die richtige Anzahl und Typ der %-Direktiven, bevor Sie diese Funktionen aufrufen. Stellen Sie sicher, dass die Puffergrößen korrekt sind. |
strncpy, fgets, strncat | Niedrig | Möglicherweise keine Null-Terminierung | Stellen Sie immer explizit sicher, dass der Zielpuffer null-terminiert wird. Stellen Sie sicher, dass das Größenargument korrekt ist. Achten Sie darauf, im Zielpuffer Platz für das Null-Zeichen zu lassen! |
URLs
-
Verwendet die Anwendung unzuverlässige Daten, um URLs zu konstruieren?
- Stellen Sie sicher, dass solche Daten vor der Verwendung ausreichend bereinigt und kodiert werden.
- Stellen Sie sicher, dass Daten, die aus diesen URLs abgeleitet werden, vor der Verwendung oder Speicherung geprüft werden.
-
Folgt die Anwendung Weiterleitungen?
- Stellen Sie sicher, dass Sicherheitsprüfungen sowohl bei Weiterleitungen als auch bei der ursprünglichen Anfrage-URI durchgeführt werden.
Sicherheitskontrollen
- Implementiert die Anwendung geeignete Berechtigungsprüfungen?
- Stellen Sie sicher, dass die korrekten APIs genutzt werden, wenn verfügbar (z.B. shouldLoad, etc.)
- Stellen Sie sicher, dass die Anwendung sicher scheitert.
Zugriffe auf entfernte Systeme
- Greift die Anwendung auf irgendwelche entfernten Systeme zu?
- Stellen Sie sicher, dass TLS verwendet wird, es sei denn, es gibt einen sehr guten Grund dagegen.
- Stellen Sie sicher, dass keine Benutzerinformationen ohne die Zustimmung des Benutzers übertragen werden.
Informationsspeicherung
-
Dateispeicherung
-
Stellen Sie sicher, dass die Anwendung überprüft, dass alle erstellten Dateien unter erlaubten Pfaden gespeichert werden
-
Werden Dateinamen aus unzuverlässigen Daten generiert?
- Stellen Sie sicher, dass die Daten geeignet kodiert sind
-
Überprüfen Sie, dass Dateien von einem akzeptablen Typ sind
-
Überprüfen Sie, dass Dateien vernünftige Größenlimits nicht überschreiten
-
-
Datenbankspeicherung
- Stellen Sie sicher, dass alle an die Datenbank gesendeten, unzuverlässigen Informationen ausreichend bereinigt werden
- Wenn möglich, verwenden Sie typsichere Parametrisierung zur Vermeidung von Injection-Angriffen
-
Sensible Informationen
- Stellen Sie sicher, dass alle sicherheitsrelevanten oder personenbezogenen Informationen ausreichend geschützt sind (siehe Abschnitt Verschlüsselung)
- Besondere Vorsicht ist bei Anmeldedaten (Passwörter etc.) geboten - Wenn Sie mit solchen Informationen arbeiten und unsicher sind, was zu tun ist, lohnt es sich immer nachzufragen
-
Protokollierung
- Vergessen Sie nicht, dass die obigen Regeln auch für Protokolle sowie Ihre üblichen Anwendungsdaten gelten
Verschlüsselung
- Verwendet die Anwendung irgendeine Form von Verschlüsselung?
- Sind die verwendeten Algorithmen anerkannte Standards?
Denial of Service
- Stellen Sie sicher, dass die Anwendung gegen die Erschöpfung von:
- Systemspeicher
- Speicherplatz
Sicherheitswarnungen
-
Präsentiert die Anwendung dem Benutzer irgendwelche Sicherheitswarnungen?
-
Sind sie klar verständlich und angemessen?
-
Kann unzuverlässige Daten die Bedeutung von Nachrichten für den Benutzer ändern?
- Kann Benutzereingaben die Bedeutung von Nachrichten ändern?
- Kann Benutzereingaben Systemnachrichten außerhalb des sichtbaren Bildschirms erzwingen?
- Kann Benutzereingaben Sonderzeichen enthalten, die die Bedeutung von Nachrichten ändern können (z.B. Unicode-Rechts-nach-Links-Override U+202E)
-
Kann ein Angreifer das Timing von Dialogen verwenden, um den Benutzer zu täuschen, sodass er auf etwas klickt, was er nicht beabsichtigt hat?
Informationsweitergabe
- Gibt die Anwendung Informationen weiter, die den Benutzer gefährden könnten?
- Gibt die Anwendung Informationen weiter, die sie nicht muss?
- Gibt die Anwendung etwas weiter, das den Benutzer überraschen oder verärgern könnte?
Front-End
-
Werden sichere Mechanismen verwendet, um XUL- und HTML-UI-Elemente zu erstellen?
- Zum Beispiel verwenden Sie createTextNode anstelle von innerHTML oder ähnlichem
-
Erstellt die Anwendung eigene Docshells (Tabs, iframes)?
- Stellen Sie sicher, dass Sie ausdrücklich den Typ dieser angeben, z.B. iframe.setAttribute("type", "content")