Pentest R110: Mass-Assignment-Whitelist auf 7 Katalog-Endpunkten
MEDIUM: PUT /api/stressfrei-emails/:id und 6 weitere Update- Endpunkte (platform, tariff, contractCategory, cancellationPeriod, contractDuration, email-providers) reichten req.body ungefiltert an Prisma. Gleiche Bug-Klasse wie das gefixte M1-Finding, sieben Stellen mehr. Nachgewiesen via provisionError-Feld ausserhalb des TS-Types. Fix: sieben Whitelists + pickXxxUpdate()-Helper in sanitize.ts, in den jeweiligen Controllern eingehängt. Reuse der bewährten pick()-Infrastruktur (Customer/User seit Runde 7). EmailProvider bewusst OHNE stripHtmlFromStrings, weil Passwörter und API-Keys legitim Sonderzeichen enthalten dürfen. Doku: SECURITY-HARDENING.md § Runde 110 + docs/todo.md. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -654,6 +654,39 @@ Modus hängt sowieso an einer schon validierten Email-Stammdate
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Runde 110 – Mass-Assignment-Whitelist auf 7 Katalog-Endpunkten
|
||||
|
||||
**Finding (MEDIUM):** Der Pentester hat live nachgewiesen, dass
|
||||
`PUT /api/stressfrei-emails/:id` beliebige Model-Felder ausserhalb
|
||||
des TS-Types (z.B. `provisionError`, `isProvisioned`,
|
||||
`emailPasswordEncrypted`) durchschrieb. Beim „Rumstochern" derselbe
|
||||
Bug auf sechs weiteren Update-Endpunkten gefunden: `platform`,
|
||||
`tariff`, `contractCategory`, `cancellationPeriod`,
|
||||
`contractDuration`, `email-providers`. Gleiche Bug-Klasse wie
|
||||
das schon gefixte M1-Finding (Settings Mass Assignment), nur an
|
||||
sieben weiteren Stellen.
|
||||
|
||||
Praktische Ausnutzung braucht Staff mit der entsprechenden
|
||||
Update-Permission – kein Portal-User-Vektor, kein Cross-Customer-
|
||||
Leak. Aber ohne Whitelist könnte ein kompromittierter Staff-Token
|
||||
z.B. `emailPasswordEncrypted` überschreiben, ohne einen sichtbaren
|
||||
Audit-Trail durch den regulären Passwort-Set-Flow.
|
||||
|
||||
**Fix:** Sieben Field-Whitelists + `pickXxxUpdate()`-Helper in
|
||||
[`backend/src/utils/sanitize.ts`](../backend/src/utils/sanitize.ts),
|
||||
eingehängt in die jeweiligen Update-Controller. Nur die vom
|
||||
Service-Interface deklarierten Felder passieren. Reuse der schon
|
||||
bewährten `pick()`-Infrastruktur (Customer/User haben denselben
|
||||
Mechanismus seit Runde 7).
|
||||
|
||||
**Ausnahme EmailProvider:** `stripHtmlFromStrings` ist dort AUS.
|
||||
Grund: das Payload enthält Passwörter und API-Keys, die legitime
|
||||
Sonderzeichen wie `<`/`>` enthalten dürfen. Whitelist-Filter greift
|
||||
weiterhin – XSS-Risiko minimal, da der Endpunkt admin-only ist und
|
||||
die Werte in Server-Config-Feldern landen, nicht in User-Notes.
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Runde 102 – Interne Vertragsnummer nachziehen
|
||||
|
||||
**Finding (INFO, kein Security-Impact ohne Admin-Login):**
|
||||
|
||||
@@ -97,6 +97,19 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
|
||||
|
||||
## ✅ Erledigt
|
||||
|
||||
- [x] **🔒 Pentest R110 – Mass-Assignment-Whitelist auf 7 Update-Endpunkten**
|
||||
- MEDIUM-Finding: `PUT /api/stressfrei-emails/:id` und 6 weitere Update-
|
||||
Endpunkte (`platform`, `tariff`, `contractCategory`,
|
||||
`cancellationPeriod`, `contractDuration`, `email-providers`) reichten
|
||||
`req.body` ungefiltert an Prisma – gleiche Bug-Klasse wie M1
|
||||
(Settings Mass Assignment). Nachgewiesen war es via
|
||||
`provisionError`-Feld ausserhalb des TS-Types.
|
||||
- Fix: sieben Whitelists + `pickXxxUpdate()`-Helper in `sanitize.ts`,
|
||||
in den jeweiligen Controllern eingehängt. Nur die vom Service-
|
||||
Interface deklarierten Felder passieren.
|
||||
- EmailProvider: bewusst ohne `stripHtmlFromStrings`, weil das
|
||||
Passwörter/API-Keys mit Sonderzeichen mutiliert hätte.
|
||||
|
||||
- [x] **🐞 Kündigungsdatum: Cursor sprang beim Tippen aus dem Feld**
|
||||
- `<input type=date>` feuerte `onChange` bei jedem Tastendruck; sobald
|
||||
z.B. `18.08.0002` ein gültiges Datum ergab, feuerte die PUT-Mutation,
|
||||
|
||||
Reference in New Issue
Block a user