Firefox-Sicherheitsrichtlinien
Zweck
Dieses Dokument skizziert eine Reihe von Sicherheitsrichtlinien, die im Allgemeinen für alle Client-Anwendungen wie Firefox und Thunderbird gelten.
Sichere Programmierprinzipien
Stellen Sie sicher, dass die Anwendung den OWASP Secure Coding Principles folgt:
- Angriffsfläche minimieren
- Sichere Standardwerte festlegen
- Prinzip der geringsten Privilegien
- Prinzip der mehrfachen Verteidigung
- Sicheres Versagen
- Vertrauen Sie Diensten nicht
- Halten Sie die Sicherheit einfach
- Beheben Sie Sicherheitsprobleme korrekt
Eingabevalidierung
-
Akzeptiert die Anwendung Benutzereingaben?
- Überprüfen Sie eine Stichprobe von Eingabelokationen, um sicherzustellen, dass vernünftige Maximalwerte beim Akzeptieren von Benutzerdaten festgelegt sind
- Überprüfen Sie eine Stichprobe von Eingabelokationen, um sicherzustellen, dass die Anwendung nur einen definierten Satz akzeptabler Zeichen zulässt
- Stellen Sie sicher, dass Whitelisting anstelle von Blacklisting verwendet wird
-
Akzeptiert die Anwendung Benutzereingaben, die auf irgendeine Weise angezeigt werden?
- Überprüfen Sie eine Stichprobe von Eingabe- und Ausgabestellen, um sicherzustellen, dass vom Benutzer bereitgestellte Inhalte in der Antwort ordnungsgemäß codiert sind
Chrome JS - Gefährliche Funktionen
Werden eine der folgenden Funktionen verwendet?
Wenn ja, stellen Sie sicher, dass sie sicher sind und dass keine besseren Alternativen verfügbar sind.
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 | Funktioniert wie eval | Verwenden Sie setTimeout(function, time, param1, param2, …) |
C++ - Gefährliche Funktionen
Werden eine der folgenden Funktionen verwendet?
Wenn ja, stellen Sie sicher, dass sie sicher sind und dass keine besseren Alternativen verfügbar sind.
Name | Risikostufe | Problem | Lösung |
---|---|---|---|
gets | Sehr hoch | Keine Überprüfung der Grenzen | Verwenden Sie gets nicht. Verwenden Sie stattdessen fgets. |
strcpy | Sehr hoch | Keine Überprüfung der Grenzen | strcpy ist nur sicher, wenn der Quellstring eine Konstante ist und das Ziel groß genug ist, um ihn aufzunehmen. Andernfalls verwenden Sie strncpy. |
sprintf | Sehr hoch | Keine Überprüfung der Grenzen, Format-String-Angriffe | sprintf ist sehr schwer sicher zu verwenden. Verwenden Sie stattdessen snprintf. |
scanf, sscanf | Hoch | Möglicherweise keine Überprüfung der Grenzen, Format-String-Angriffe | Stellen Sie sicher, dass alle %-Direktiven den entsprechenden Argumenttypen entsprechen. Verwenden Sie keine '%s'-Direktiven ohne Grenzenprüfung. Verwenden Sie '%xs', wobei x die Puffergröße des entsprechenden Arguments ist. Verwenden Sie keine unzuverlässigen, nicht validierten Daten im Formatstring. |
strcat | Hoch | Keine Überprüfung der Grenzen | Wenn Eingabegrößen nicht gut bekannt und festgelegt sind, verwenden Sie strncat anstelle. |
printf, fprintf, snprintf, vfprintf, vsprintf, syslog | Hoch | Format-String-Angriffe | Verwenden Sie keine unzuverlässigen, nicht validierten Daten im Formatstring. Wenn der Formatstring durch Web-Inhalte oder Benutzereingaben beeinflusst werden kann, validieren Sie ihn auf die richtige Anzahl und den richtigen Typ der %-Direktiven, bevor Sie diese Funktionen aufrufen. Stellen Sie sicher, dass die Zielgrößenargumente korrekt sind. |
strncpy, fgets, strncat | Niedrig | Möglicherweise keine Nullterminierung | Terminieren Sie den Zielpuffer immer explizit mit Null. Stellen Sie sicher, dass das Größenargument korrekt ist. Stellen Sie sicher, dass im Zielpuffer Platz für das Hinzufügen des Nullzeichens bleibt! |
URLs
-
Verwendet die Anwendung unzuverlässige Daten, um URLs zu erstellen?
- Stellen Sie sicher, dass solche Daten vor der Verwendung angemessen bereinigt und codiert werden.
- Stellen Sie sicher, dass Daten, die aus diesen URLs erhalten werden, vor der Verwendung oder Speicherung überprüft werden.
-
Verfolgt die Anwendung Weiterleitungen?
- Stellen Sie sicher, dass Sicherheitsüberprüfungen sowohl bei Weiterleitungen als auch bei der ursprünglichen Anforderungs-URI durchgeführt werden.
Sicherheitskontrollen
-
Implementiert die Anwendung geeignete Berechtigungsprüfungen?
- Stellen Sie sicher, dass die richtigen APIs verwendet werden, wo verfügbar (z.B. shouldLoad etc.)
- Stellen Sie sicher, dass die Anwendung sicher fehlschlägt.
Zugriff auf Remote-Systeme
- Greift die Anwendung auf Remote-Systeme zu?
- Stellen Sie sicher, dass TLS verwendet wird, es sei denn, es gibt einen sehr guten Grund, dies nicht zu tun.
- Stellen Sie sicher, dass keine Benutzerinformationen ohne Zustimmung des Benutzers übertragen werden.
Informationsspeicherung
-
Dateispeicherung
-
Stellen Sie sicher, dass die Anwendung überprüft, dass alle erstellten Dateien unter erlaubten Pfaden liegen
-
Werden Dateinamen aus unzuverlässigen Daten generiert?
- Stellen Sie sicher, dass die Daten entsprechend codiert sind
-
Überprüfen Sie, dass Dateien einen akzeptablen Typ haben
-
Überprüfen Sie, dass Dateien vernünftige Größenbeschränkungen nicht überschreiten können
-
-
Datenbankspeicherung
- Stellen Sie sicher, dass alle unzuverlässigen Informationen, die an die Datenbank gesendet werden, angemessen bereinigt werden
- Verwenden Sie, wo möglich, typensichere Parametrisierung, um Injection-Angriffe zu verhindern
-
Sensible Informationen
- Stellen Sie sicher, dass alle sicherheitsrelevanten oder persönlichen Informationen angemessen geschützt sind (siehe Verschlüsselungsabschnitt)
- Besondere Sorgfalt ist bei Anmeldeinformationen (Passwörter, etc.) geboten - Wenn Sie mit Informationen dieser Art arbeiten und nicht wissen, was zu tun ist, lohnt es sich immer zu fragen
-
Protokollierung
- Vergessen Sie nicht, dass die obigen Regeln sowohl für Protokolle als auch für Ihre üblichen Anwendungsdaten gelten
Verschlüsselung
- Verwendet die Anwendung irgendeine Form der Verschlüsselung?
- Sind die verwendeten Algorithmen anerkannte Standards?
Denial of Service
-
Stellen Sie sicher, dass die Anwendung Schutz gegen die Erschöpfung von:
- Systemspeicher
- Speicherplatz
Sicherheitswarnungen
-
Präsentiert die Anwendung dem Benutzer irgendwelche Sicherheitswarnungen?
-
Sind diese klar verständlich und angemessen?
-
Kann unzuverlässige Daten die Bedeutung der Nachrichten für den Benutzer ändern?
- Kann Benutzereingaben die Bedeutung der Nachrichten ändern?
- Kann Benutzereingaben Systemnachrichten vom sichtbaren Bildschirm verdrängen?
- Kann Benutzereingaben Sonderzeichen enthalten, die die Bedeutung der Nachrichten ändern können (z.B. Unicode-Rechts-nach-Links-Override U+202E)
-
Kann ein Angreifer das Timing von Dialogen nutzen, um den Benutzer dazu zu verleiten, etwas anzuklicken, das er nicht beabsichtigt hat?
Informationsweitergabe
- Gibt die Anwendung Informationen weiter, die den Benutzer kompromittieren könnten?
- Gibt die Anwendung Informationen weiter, die sie nicht weitergeben muss?
- Gibt die Anwendung etwas weiter, das den Benutzer überraschen oder verärgern könnte?
Frontend
-
Werden sichere Mechanismen zum Erstellen von XUL- und HTML-UI-Elementen verwendet?
- z.B. verwenden Sie createTextNode anstelle von innerHTML oder ähnlichem
-
Erstellt die Anwendung eigene docshells (Registerkarten, iframes)?
- Stellen Sie sicher, dass Sie den Typ dieser explizit angeben, z.B. iframe.setAttribute("type", "content")