====== Sicherheits-Checkliste ====== **KRITIS/NIS2-konforme** Sicherheitsprüfung basierend auf CWE-Schwachstellen und Angriffsmustern. Diese Checkliste ist **Pflicht** bei Änderungen an: Netzwerk, Authentifizierung, Kryptographie, Datenbank, externen APIs. ===== Wann anwenden ===== Diese Checkliste anwenden wenn die Änderung betrifft: * Kryptographische Operationen * Authentifizierung / Autorisierung * Netzwerk-Kommunikation * Datenbank-Zugriff * Externe API-Aufrufe * Datei-Uploads * Benutzereingaben ===== Kryptographische Sicherheit ===== ^ Prüfung ^ CWE ^ Beschreibung ^ | [ ] Nonce-Eindeutigkeit | CWE-323 | AES-GCM Nonce muss pro Verschlüsselung eindeutig sein | | [ ] Nonce-Tracking | CWE-323 | Verwendete Nonces tracken, MAX_NONCES_PER_KEY erzwingen | | [ ] Schlüsselrotation | CWE-323 | Schlüssel nach Nonce-Limit rotieren | | [ ] Kryptographischer RNG | CWE-330 | OpenSSL/OS CSPRNG für Schlüssel/Nonces | | [ ] Zufällige IDs | CWE-330 | Keine sequentiellen Schlüssel/Session-IDs | | [ ] Konstante-Zeit-Vergleich | CWE-208 | Für Secrets, MACs, Tokens, API-Keys | | [ ] Replay-Schutz | CWE-294 | Nonce/Timestamp/Sequenz-Tracking | | [ ] Kanal-Verschlüsselung | CWE-300 | mTLS für externe Kommunikation | ==== Beispiel: Konstante-Zeit-Vergleich ==== (* VERBOTEN - Timing-Angriff möglich *) function VerifyToken(const AToken, AExpected: string): Boolean; begin Result := AToken = AExpected; (* Bricht bei erstem Unterschied ab! *) end; (* KORREKT - Konstante Zeit *) function VerifyToken(const AToken, AExpected: string): Boolean; var I: Integer; Diff: Byte; begin if Length(AToken) <> Length(AExpected) then Exit(False); Diff := 0; for I := 1 to Length(AToken) do Diff := Diff or (Ord(AToken[I]) xor Ord(AExpected[I])); Result := Diff = 0; end; ===== Speicher-Sicherheit ===== ^ Prüfung ^ CWE ^ Beschreibung ^ | [ ] Memory Zeroization | CWE-316 | Secrets nach Verwendung löschen | | [ ] Keine Secrets in Logs | CWE-532 | Niemals Schlüssel, Passwörter, Tokens loggen | | [ ] Sichere String-Behandlung | CWE-316 | SecureString (C#), secrecy (Rust) | | [ ] Schlüsselmaterial gelöscht | CWE-316 | try-finally garantiert Cleanup bei Exception | ==== Beispiel: Zeroization ==== procedure ProcessSecret(const ASecret: string); var LocalCopy: string; begin LocalCopy := ASecret; try (* Verarbeitung *) DoSomethingWith(LocalCopy); finally (* Secret löschen - nicht nur freigeben! *) FillChar(LocalCopy[1], Length(LocalCopy) * SizeOf(Char), 0); LocalCopy := ''; end; end; ===== Eingabevalidierung ===== ^ Prüfung ^ CWE ^ Beschreibung ^ | [ ] Größenlimits | CWE-400 | MAX_PAYLOAD_SIZE erzwingen (Standard: 64KB) | | [ ] Integer-Overflow | CWE-190 | SafeAdd(), checked_add(), geprüfte Arithmetik | | [ ] Null-Prüfungen | CWE-476 | An allen API-Grenzen | | [ ] Kein Unwrap bei Input | CWE-248 | Ordentliche Fehlerbehandlung, kein Panic | | [ ] Parametrisierte Queries | CWE-89 | Niemals String-Konkatenation für SQL | | [ ] Zeichen-Validierung | - | Whitelist für Identifier wo angemessen | ==== Beispiel: SQL Injection Prevention ==== (* VERBOTEN - SQL Injection möglich *) procedure GetUser(const AUsername: string); begin Query.SQL.Text := 'SELECT * FROM users WHERE name = ''' + AUsername + ''''; Query.Open; end; (* KORREKT - Parametrisiert *) procedure GetUser(const AUsername: string); begin Query.SQL.Text := 'SELECT * FROM users WHERE name = :username'; Query.ParamByName('username').AsString := AUsername; Query.Open; end; ===== Fehlerbehandlung (Sicherheit) ===== ^ Prüfung ^ CWE ^ Beschreibung ^ | [ ] Sanitisierte Meldungen | CWE-209 | Keine Pfade/Versionen/Stack-Traces an Client | | [ ] Vollständiges Logging | - | Intern vollständigen Fehler loggen vor Sanitisierung | | [ ] Kein Panic im Service | CWE-248 | Graceful Recovery, Service bleibt aktiv | | [ ] Stack-Trace erhalten | - | Re-Throw ohne Wrapping | ==== Beispiel: Sanitisierte Fehlermeldungen ==== (* VERBOTEN - Zu viel Information *) procedure HandleError(E: Exception); begin ShowMessage('Error in C:\Users\Admin\App\src\Database.pas:142: ' + E.Message); end; (* KORREKT - Intern loggen, extern sanitisieren *) procedure HandleError(E: Exception); begin (* Intern vollständig loggen *) Logger.Error('Database error at %s: %s', [E.ClassName, E.Message]); (* Extern nur sanitisierte Meldung *) raise EUserError.Create(rsDatabaseOperationFailed); end; ===== Verfügbarkeit (DoS-Schutz) ===== ^ Prüfung ^ CWE ^ Beschreibung ^ | [ ] Rate Limiting | CWE-400 | Token Bucket pro Client/Endpoint | | [ ] Request-Größenlimits | CWE-400 | Überdimensionierte Payloads früh ablehnen | | [ ] Lock-Sicherheit | CWE-667 | Lock-Recovery-Mechanismus | | [ ] Ressourcen-Cleanup | CWE-772 | try-finally, using, defer, RAII - immer | | [ ] Timeout-Handling | CWE-400 | Timeouts für alle externen Operationen | ===== Thread-Sicherheit ===== ^ Prüfung ^ CWE ^ Beschreibung ^ | [ ] Lock-Poisoning behandelt | CWE-667 | Recovery von vergifteten Locks | | [ ] Keine Race Conditions | CWE-362 | Thread-sichere Datenstrukturen | | [ ] Atomare Operationen | CWE-362 | Für Counter, Flags, Shared State | | [ ] Deadlock-Prävention | CWE-833 | Lock-Reihenfolge, Timeouts | ===== Audit & Compliance ===== ^ Prüfung ^ Standard ^ Beschreibung ^ | [ ] Alle Änderungen geloggt | ISO 27001 A.12.4 | Datenänderungen mit User, Timestamp, Alt/Neu | | [ ] Sicherheitsereignisse geloggt | NIS2 Art. 21 | Fehlgeschlagene Auth, Rate Limiting, verdächtige Eingaben | | [ ] Log-Rotation | - | Inkrementelles Format | | [ ] Keine sensiblen Daten in Logs | CWE-532 | Auf versehentliche Offenlegung prüfen | ===== Schnellreferenz - Nach Angriffstyp ===== ==== Kryptographische Angriffe ==== [ ] Nonce-Wiederverwendung verhindert [ ] Timing-Angriffe mitigiert (konstante Zeit) [ ] Replay-Angriffe blockiert [ ] Schlüssel-Enumeration verhindert (zufällige IDs) ==== Eingabe-Angriffe ==== [ ] Buffer Overflow verhindert (Größenlimits) [ ] Integer Overflow verhindert [ ] Malformed Input behandelt [ ] SQL Injection verhindert ==== Verfügbarkeits-Angriffe ==== [ ] Ressourcen-Erschöpfung verhindert (Rate Limiting) [ ] Lock-Poisoning behandelt [ ] Speicher-Erschöpfung verhindert ==== Information Disclosure ==== [ ] Fehlermeldungen sanitisiert [ ] Secrets nach Verwendung gelöscht (Zeroization) [ ] Keine sensiblen Daten in Logs ===== OWASP Top 10 Referenz ===== ^ Rang ^ Schwachstelle ^ Prävention in WvdS ^ | 1 | Broken Access Control | Autorisierung an allen Endpunkten prüfen | | 2 | Cryptographic Failures | Moderne Algorithmen, Zeroization | | 3 | Injection | Parametrisierte Queries, Input-Validierung | | 4 | Insecure Design | Threat Modeling, Defense in Depth | | 5 | Security Misconfiguration | Sichere Defaults, keine Debug in Prod | | 6 | Vulnerable Components | Abhängigkeiten aktuell halten | | 7 | Auth Failures | MFA, Rate Limiting, Session-Management | | 8 | Data Integrity Failures | Signaturen, Integritätsprüfung | | 9 | Logging Failures | Strukturiertes Logging, Alerting | | 10 | SSRF | URL-Validierung, Netzwerk-Segmentierung | ===== Siehe auch ===== * [[.:qualitaetssicherung|Qualitätssicherung Übersicht]] * [[.:sicherheit|Sicherheitsrichtlinien (allgemein)]] * [[.:audit-core|Core-Checkliste]] * [[.:debugging|Debugging]]