====== 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]]