XSS-Sanitization für AppSettings (companyName & Co)

Pentest-Befund (MEDIUM): companyName und weitere Plain-Text-Setting-
Keys nahmen via PUT /api/settings/:key XSS-Payloads wie
<img src=x onerror=alert(1)> ungefiltert entgegen. Nur Admin
triggerbar, aber E-Mail-Templates/PDF-Generatoren hätten den Wert
unescaped rendern können.

Fix in appSetting.service.ts: sanitizeSettingValue(key, value)
strippt HTML außer für die expliziten Editor-Keys (imprintHtml,
privacyPolicyHtml, authorizationTemplateHtml,
websitePrivacyPolicyHtml). Greift in updateSetting + updateSettings.

cleanup-xss-and-mass-assignment.ts bereinigt bestehende dreckige
Werte beim Container-Start (idempotent).

Live-verifiziert auf dev:
- PUT companyName="<img onerror=alert(1)>OpenCRM<script>alert(2)</script>"
  → DB: "OpenCRM"
- Bulk-PUT mit XSS auf companyName + defaultEmailDomain → gestrippt
- imprintHtml mit "<h1>...<p>" → unverändert (HTML-allowed)
- Cleanup-Skript auf dirty value: "EvilCo" statt mit Tags

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-19 12:49:19 +02:00
parent 8ee5c9b07a
commit b3a6620da6
4 changed files with 79 additions and 2 deletions
+18
View File
@@ -120,6 +120,24 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
- **Live-verifiziert**: 4867 Datensätze + 1 Datei in 13.2s
wiederhergestellt, Log-Modal zeigt den vollständigen Verlauf.
- [x] **🛡️ XSS-Sanitization für Plain-Text-AppSettings (Pentest MEDIUM)**
- `companyName` (und weitere Plain-Text-Keys wie `defaultEmailDomain`,
`monitoringAlertEmail`, Schwellenwerte) konnten via PUT
`/api/settings/:key` mit XSS-Payloads befüllt werden das war
nur Admin-triggerbar, aber E-Mail-Templates/PDF-Generatoren
hätten den Wert ungescaped rendern können.
- Fix: neuer `sanitizeSettingValue(key, value)` in
`appSetting.service.ts` strippt HTML außer für die expliziten
HTML-Editor-Keys (`imprintHtml`, `privacyPolicyHtml`,
`authorizationTemplateHtml`, `websitePrivacyPolicyHtml`).
Greift in `updateSetting` (Einzel) und `updateSettings` (Bulk).
- Cleanup-Skript erweitert: bestehende AppSettings mit HTML in
Plain-Text-Keys werden beim Container-Start gestrippt
(idempotent).
- **Live-verifiziert** auf dev: `<img src=x onerror=alert(1)>OpenCRM
<script>alert(2)</script>` via PUT → DB-Wert: `"OpenCRM"`.
`imprintHtml` mit `<h1><p>` → unverändert.
- [x] **🐛 Rollen-Perms-Sync beim Container-Start (Follow-up DSGVO-Fix)**
- Bestehende Installationen liefen weiter mit veraltetem
Permission-Set für die DSGVO-Rolle (audit:read u.a. fehlten),