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