opencrm/backend
duffyduck 4e91d96b5b Security-Hardening Runde 6: Customer-Liste-Leak + XFF-Bypass + Vollmacht-Validation
Tiefer Live-Pentest deckte 3 weitere Schwachstellen:

🚨 CRITICAL: GET /api/customers leakte komplette Kundendatenbank
- Stage-4 hatte canAccessCustomer auf den Single-Endpoint angewendet,
  der List-Endpoint hatte nur den Daten-Sanitizer (filtert Passwort-Hashes)
  aber keinen Portal-Filter. Folge: Portal-Kunde sah ALLE Kunden mit Namen,
  E-Mails, customerNumber etc. – DSGVO-relevant.
- Fix: getCustomers filtert für Portal-User auf eigene + vertretene IDs.

🚨 HIGH: Rate-Limit-Bypass via X-Forwarded-For
- `trust proxy = 1` hat jedem XFF-Wert vertraut. 12+ Logins mit
  rotierender XFF-IP gingen ohne 429 durch.
- Fix: `trust proxy = 'loopback'` – XFF nur noch von 127.0.0.1 / ::1
  akzeptiert (= lokaler Reverse-Proxy).
- Plus: LISTEN_ADDR-Default 127.0.0.1 in Production, damit das Backend
  nicht von außen direkt ansprechbar ist.

🛡 MEDIUM: Self-Grant + Existence-Disclosure in toggleMyAuthorization
- Portal-User konnte:
  a) sich selbst Vollmacht erteilen (customerId=representativeId=1)
  b) Authorization-Records für nicht-existierende customerIds anlegen
     (scheitert erst am DB-Constraint mit vollem Prisma-Stack-Leak)
  c) Customer-IDs durch 404-vs-403-Differenzen enumerieren.
- Fix: Self-Grant 400. Existenz + aktive CustomerRepresentative-Beziehung
  in einem Query – Non-Existent / Non-Related geben identisch 403.
  Prisma-Error-Stacks generisch ersetzt.

Live-verifiziert: Customer-Liste filtert, Self-Grant 400, Existence-Probing
dicht.

Geprüft + sauber (Runde 6, kein Bug):
- Prototype Pollution Login-Body
- HTTP-Method-Override-Header
- Path-Traversal Backup-Name (Regex blockt)
- Developer-Routes existieren nicht
- Email-Endpoints mit fremder StressfreiEmail-ID → 403
- /api/customers/:id GET liefert 403 statt 404 (kein Leak)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 20:14:20 +02:00
..
factory-defaults docs: Factory-Defaults Import/Export-Anleitung in READMEs 2026-04-23 14:19:02 +02:00
prisma Security-Hardening: IDOR-Fixes, XSS-Sanitizer, CORS+Helmet, Data-Exposure 2026-04-23 22:06:16 +02:00
scripts Factory-Defaults: Export + Import von Stammdaten-Katalogen 2026-04-23 14:10:12 +02:00
src Security-Hardening Runde 6: Customer-Liste-Leak + XFF-Bypass + Vollmacht-Validation 2026-04-26 20:14:20 +02:00
uploads save email as pdf like an attachment 2026-02-04 19:18:32 +01:00
.env first commit 2026-01-29 01:16:54 +01:00
.env.example first commit 2026-01-29 01:16:54 +01:00
.gitignore Factory-Defaults: Export + Import von Stammdaten-Katalogen 2026-04-23 14:10:12 +02:00
package-lock.json chore: helmet korrekt in backend/package.json statt Root 2026-04-23 23:02:12 +02:00
package.json chore: helmet korrekt in backend/package.json statt Root 2026-04-23 23:02:12 +02:00
todo.md Security-Hardening Runde 6: Customer-Liste-Leak + XFF-Bypass + Vollmacht-Validation 2026-04-26 20:14:20 +02:00
tsconfig.json first commit 2026-01-29 01:16:54 +01:00