Pentest 2026-05-20 MEDIUM+LOW Follow-ups
MEDIUM – Consent-Mass-Assignment:
PUT /api/gdpr/customer/:id/consents/:type nahm source/documentPath/
version ungefiltert aus dem Body. Portal-User konnte
source="ADMIN_OVERRIDE", version="<script>" oder
documentPath="../../etc/passwd" durchschmuggeln.
Fix: nur status aus Body, source server-seitig auf "portal"
hardcoded, documentPath/version bleiben NULL (werden dediziert
vom Authorization-Upload server-seitig gesetzt). Whitelist
ALLOWED_CONSENT_SOURCES für source-Werte. grantAuthorization
(Admin) erzwingt die Whitelist ebenfalls; notes läuft jetzt
durch stripHtml.
LOW – javascript:-URI in companyName:
stripHtml() entfernte HTML-Tags, ließ aber javascript:/data:/
vbscript:-Schemata stehen. companyName="javascript:alert(1)"
hätte in <a href={companyName}> aktiv werden können.
Fix: stripHtml ersetzt jene Schemata mit "blocked:" – legitimer
Text bleibt unangetastet, das Schema wird unschädlich.
LOW – documentPath ohne Validierung:
Bereits durch obigen Consent-Fix erledigt; Cleanup-Pass strippt
zusätzlich vorhandene dreckige Pfade.
cleanup-xss-and-mass-assignment.ts: neue cleanupConsents() läuft
beim Container-Start, normalisiert source per Whitelist auf
"unknown" + stripHtml über version/documentPath.
Live-verifiziert auf dev (alle drei Payloads geblockt + Cleanup
auf dirty DB greift).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -120,6 +120,34 @@ 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] **🛡️ Pentest 2026-05-20 MEDIUM+LOW: Consent + URI-Sanitization**
|
||||
- **MEDIUM Consent-Mass-Assignment**: PUT `/api/gdpr/customer/:id/consents/:type`
|
||||
nahm `source`, `documentPath`, `version` ungefiltert aus dem Body
|
||||
– Portal-User konnte `source: "ADMIN_OVERRIDE"`, `version:
|
||||
"<script>"` oder `documentPath: "../../etc/passwd"` durchschmuggeln.
|
||||
Fix: nur noch `status` aus Body, source server-seitig hardcoded
|
||||
auf `'portal'`, documentPath/version bleiben NULL (werden vom
|
||||
dedizierten Authorization-Upload-Endpoint server-seitig gesetzt).
|
||||
- Whitelist für `CustomerConsent.source` ergänzt
|
||||
(`portal | public-link | telefon | papier | email | crm-backend`).
|
||||
`grantAuthorization` (Admin) erzwingt sie ebenfalls; `notes`
|
||||
läuft jetzt durch `stripHtml`.
|
||||
- **LOW javascript:-URI**: `stripHtml()` filtert jetzt zusätzlich
|
||||
`javascript:`, `data:`, `vbscript:` – ersetzt durch `blocked:`,
|
||||
damit `<a href={companyName}>` nichts feuert. Verträglich mit
|
||||
legitimem Text, der nicht "javascript:" enthält.
|
||||
- Cleanup-Skript erweitert um `cleanupConsents()`:
|
||||
Whitelist-Reset für source, stripHtml für version/documentPath
|
||||
– idempotent, läuft beim Container-Start automatisch.
|
||||
- **Live-verifiziert** auf dev:
|
||||
- PUT mit `{status:"GRANTED",source:"ADMIN_OVERRIDE",
|
||||
version:"<script>",documentPath:"../../etc/passwd"}` →
|
||||
DB hat `source=portal, documentPath=NULL, version=NULL`.
|
||||
- companyName `javascript:alert(1)` → `blocked:alert(1)`.
|
||||
- companyName `<a href=data:text/html,<script>...>Click</a>` → `Click`.
|
||||
- Cleanup auf dirty DB: source `ADMIN_OVERRIDE` → `unknown`,
|
||||
documentPath/version gesäubert.
|
||||
|
||||
- [x] **🚨 Pentest 2026-05-20 KRITISCH: Backup-Restore ohne Confirm-Body**
|
||||
- `POST /api/settings/backup/:name/restore` startete bei leerem
|
||||
Body sofort den destruktiven Restore. Im Unterschied zu
|
||||
|
||||
Reference in New Issue
Block a user