| 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 |
SQL-Authentifizierungspasswörter werden mit Windows DPAPI (Data Protection API) verschlüsselt.
{ Encrypt: user-scoped DPAPI } function EncryptPassword(const APassword: string): string; begin Result := 'DPAPI:' + Base64Encode( CryptProtectData(UTF8Encode(APassword), CRYPTPROTECT_UI_FORBIDDEN) ); end;
CRYPTPROTECT_UI_FORBIDDEN)DPAPI: + Base64(Ciphertext)DPAPI:-Prefix) werden akzeptiert und bei nächster Speicherung automatisch verschlüsseltWenn die Entschlüsselung fehlschlägt (anderer Benutzer/Computer):
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.
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 ServerfsExpression-Felder werden gegen gefährliche Schlüsselwörter geprüft (SELECT, INSERT, UPDATE, DELETE, DROP, EXEC, xp_)Alle folgenden Felder aus Mapping-Dateien werden vor SQL-Interpolation validiert:
rootTable, primaryKeyColumntargetTable, sourceColumn, targetColumn, primaryKeyColumntableName, columnName, filterColumn, joinColumnTIMESTAMP|USER|OPERATION|DETAILS|PREV_HASH|ENTRY_HASH
0000000000… (40 Nullen){ All data-modifying operations MUST be logged via TOutlookSyncAudit.Log() } class procedure TOutlookSyncAudit.Log( const AOperation, ADetails: string);
SYNC_TO_OL / SYNC_TO_DB — Einzelzeilen-SyncBULK_TO_OL / BULK_TO_DB — Massen-Sync (Start/Ende)BIDIR_SYNC — Bidirektionaler Sync (Start/Ende)OL_FOLDER_CREATE — Outlook-Ordner erstellt→ Compliance-Details: Audit-Trail (BSI/NIS2)
Wolfgang van der Stille @ EMSR DATA d.o.o. — Outlook Sync