====== Sicherheitsarchitektur ====== ===== CWE-Matrix ===== ^ Maßnahme ^ CWE ^ Beschreibung ^ | Parametrisierte SQL-Queries | CWE-89 | Alle Werte über '':P0''...'':Pn'' Parameter gebunden | | Identifier-Whitelist | CWE-89 | Tabellen-/Spaltennamen gegen ''[A-Za-z_][A-Za-z0-9_]*'' validiert | | Expression-Blacklist | CWE-89 | Blockiert SELECT, INSERT, DROP, EXEC, ''xp_'' in Ausdrücken | | Enum-Range-Validierung | CWE-20 | Integer-Werte aus JSON gegen gültige Enum-Bereiche geprüft | | Sanitisierte Fehlermeldungen | CWE-209 | ODBC-Details werden aus UI-Meldungen entfernt | | Thread-Safety | CWE-362 | Owner-Form deaktiviert während Background-Operationen | | Keine Credentials im Log | CWE-532 | Benutzername/Passwort nie in Log-Ausgaben | | DPAPI-Verschlüsselung | CWE-256 | SQL-Passwörter user-scoped verschlüsselt | | Heap-Scrubbing | CWE-316 | Credentials vor Freigabe mit Nullbytes überschrieben (CoW-sicher) | | Release-Logging | CWE-390 | Keine leeren catch-Blocks — alle Fehler geloggt | | TOCTOU-Validierung | CWE-367 | Mapping-Daten nach dem Laden nochmals validiert | | Audit-Trail | BSI/NIS2 | SHA-1-Hashkette für manipulationssicheres Protokoll | ---- ===== DPAPI-Design ===== SQL-Authentifizierungspasswörter werden mit **Windows DPAPI** (Data Protection API) verschlüsselt. ==== Verschlüsselungsablauf ==== { Encrypt: user-scoped DPAPI } function EncryptPassword(const APassword: string): string; begin Result := 'DPAPI:' + Base64Encode( CryptProtectData(UTF8Encode(APassword), CRYPTPROTECT_UI_FORBIDDEN) ); end; * **Scope:** User-scoped (''CRYPTPROTECT_UI_FORBIDDEN'') * **Speicherformat:** ''DPAPI:'' + Base64(Ciphertext) * **Entschlüsselung:** Nur auf demselben Windows-Benutzer und -Computer möglich * **Fallback:** Klartext-Passwörter (ohne ''DPAPI:''-Prefix) werden akzeptiert und bei nächster Speicherung automatisch verschlüsselt ==== Re-Encryption ==== Wenn die Entschlüsselung fehlschlägt (anderer Benutzer/Computer): - Passwort-Dialog wird angezeigt - Nach korrekter Eingabe: Automatische Re-Encryption mit aktuellem DPAPI-Schlüssel - Mapping-Datei wird mit neuem Ciphertext gespeichert ---- ===== Heap-Scrubbing (CWE-316) ===== Credentials werden vor der Freigabe sicher aus dem Heap gelöscht: { CWE-316: Heap Inspection — CoW-safe zeroing } procedure SecureZeroString(var S: string); begin if Length(S) > 0 then begin UniqueString(S); { ensure own copy (no CoW sharing) } FillChar(S[1], Length(S) * SizeOf(Char), 0); S := ''; end; end; **Wichtig:** ''UniqueString'' stellt sicher, dass der ''FillChar'' nur die eigene Kopie überschreibt — ohne ''UniqueString'' würde Copy-on-Write (CoW) andere Referenzen auf denselben String beschädigen. ---- ===== SQL-Injection Prevention (CWE-89) ===== ==== Dreistufige Verteidigung ==== - **''IsValidIdent''** — Whitelist-Prüfung aller Tabellen-/Spaltennamen aus Mapping-Dateien gegen ''[A-Za-z_][A-Za-z0-9_]*'' - **''QuoteIdent''** — Klammert validierte Identifier in ''[...]'' für SQL Server - **Expression-Blacklist** — ''fsExpression''-Felder werden gegen gefährliche Schlüsselwörter geprüft (SELECT, INSERT, UPDATE, DELETE, DROP, EXEC, ''xp_'') ==== Betroffene Felder ==== Alle folgenden Felder aus Mapping-Dateien werden vor SQL-Interpolation validiert: * Root: ''rootTable'', ''primaryKeyColumn'' * Relation: ''targetTable'', ''sourceColumn'', ''targetColumn'', ''primaryKeyColumn'' * FieldMapping: ''tableName'', ''columnName'', ''filterColumn'', ''joinColumn'' ---- ===== Audit-Trail Design ===== ==== Format ==== TIMESTAMP|USER|OPERATION|DETAILS|PREV_HASH|ENTRY_HASH ==== Hash-Kette ==== * **ENTRY_HASH** = SHA-1(TIMESTAMP + USER + OPERATION + DETAILS + PREV_HASH) * **PREV_HASH** des ersten Eintrags = ''0000000000...'' (40 Nullen) * Jede Manipulation bricht die Kette → bei Prüfung erkennbar ==== Implementierung ==== { All data-modifying operations MUST be logged via TOutlookSyncAudit.Log() } class procedure TOutlookSyncAudit.Log( const AOperation, ADetails: string); ==== Protokollierte Operationen ==== * ''SYNC_TO_OL'' / ''SYNC_TO_DB'' — Einzelzeilen-Sync * ''BULK_TO_OL'' / ''BULK_TO_DB'' — Massen-Sync (Start/Ende) * ''BIDIR_SYNC'' — Bidirektionaler Sync (Start/Ende) * ''OL_FOLDER_CREATE'' — Outlook-Ordner erstellt → Compliance-Details: [[de:int:olsync:sys:audit|Audit-Trail (BSI/NIS2)]] ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. — Outlook Sync// {{tag>outlooksync entwickler sicherheit cwe dpapi audit sql-injection}}