opencrm/backend/src/services
duffyduck 1234e74062 Security-Hardening Runde 2: Zip-Slip, Mass Assignment, weitere IDORs, Path-Traversal
Nach der ersten Runde habe ich parallel 3 Audit-Agents auf die Codebase
angesetzt. Die fanden noch eine Menge: Zip-Slip, Mass Assignment inkl.
Privilege Escalation, 13 weitere IDOR-Stellen, 2x Path-Traversal.

Alles gefixt. Details + Angriffsvektoren in docs/SECURITY-REVIEW.md.

🔴 KRITISCH gefixt:

1. Zip-Slip im Backup-Upload: extractAllTo() entpackte bösartige ZIPs ohne
   Pfad-Validierung. Ein Angreifer mit Admin-Zugang hätte mit einem ZIP
   mit Entries wie ../../etc/crontab das ganze Filesystem überschreiben
   können. Jetzt wird jeder ZIP-Entry einzeln validiert (path.resolve,
   starts-with-Check). Absolute Pfade + Null-Bytes werden abgelehnt.

2. Mass Assignment bei Customer/User Controllers:
   - updateCustomer/createCustomer: req.body ging komplett an Prisma.
     Angreifer konnte portalPasswordHash, portalPasswordResetToken,
     consentHash, customerNumber direkt setzen.
   - updateUser/createUser: roleIds und isActive waren übernehmbar.
     **Privilege Escalation**: normaler Mitarbeiter konnte sich Admin-Rechte
     durch PUT /users/:id mit {"roleIds":[1]} geben, oder andere User
     deaktivieren.
   Fix: Neue Whitelist-Helper pickCustomerCreate/Update, pickUserCreate/Update
   in utils/sanitize.ts. Nur erlaubte Felder werden durchgelassen.

3. IDOR bei 13 weiteren Endpoints (neben denen aus Runde 1):
   - GET /meters/:meterId/readings
   - GET /emails/:emailId/attachments/:filename
   - GET /emails/:emailId/attachments (Liste)
   - GET /customers/:customerId/emails
   - GET /contracts/:contractId/emails
   - GET /emails/:id (einzelne Email)
   - GET /stressfrei-emails/:id (leakte emailPasswordEncrypted)
   - weitere…
   Fix: accessControl.ts ausgebaut um canAccessAddress, canAccessBankCard,
   canAccessIdentityDocument, canAccessMeter, canAccessStressfreiEmail,
   canAccessCachedEmail. In allen betroffenen Endpoints angewendet.

🟡 WICHTIG gefixt:

4. Path-Traversal bei Backup-Name (GET /settings/backup/:name/*): req.params.name
   wurde ohne Filter in path.join. Neuer isValidBackupName() erlaubt nur
   [A-Za-z0-9_-]+ ohne "..".

5. Path-Traversal bei GDPR-Proof-Download: proofDocument-Pfad aus DB wurde
   ohne Validation gejoined. Jetzt path.resolve + starts-with-uploads-Check.

Neue/erweiterte Files:
- backend/src/utils/accessControl.ts - 6 neue can-Access-Helper
- backend/src/utils/sanitize.ts - 4 neue Whitelist-pick-Helper
- docs/SECURITY-REVIEW.md - Runde 2 dokumentiert

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 22:59:28 +02:00
..
emailProvider Fix: Provider-Domain greift sofort + Domain-Validierung 2026-04-23 15:51:16 +02:00
appSetting.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
audit.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
auth.service.ts Security-Hardening: IDOR-Fixes, XSS-Sanitizer, CORS+Helmet, Data-Exposure 2026-04-23 22:06:16 +02:00
authorization.service.ts Datenschutz vollmacht fixed, two time counter added 2026-03-21 16:42:31 +01:00
backup.service.ts Security-Hardening Runde 2: Zip-Slip, Mass Assignment, weitere IDORs, Path-Traversal 2026-04-23 22:59:28 +02:00
birthday.service.ts Fix: Emoji im Plain-Text für Messenger entfernt 2026-04-23 12:55:06 +02:00
birthdayScheduler.service.ts Version 1.0.0: Passwort-Reset + Rate-Limiting + Auto-Geburtstagsgrüße 2026-04-23 17:14:27 +02:00
cachedEmail.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
cancellation-period.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
consent-public.service.ts gdpr audit implemented, email log, vollmachten, pdf delete cancel data privacy and vollmachten, removed message no id card in engergy car, and other contracts that are not telecom contracts, added insert counter for engery 2026-03-21 11:59:53 +01:00
consent.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
contract-duration.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
contract.service.ts Typspezifische Zusatzinfos in Vertragslisten 2026-04-23 10:19:04 +02:00
contractCategory.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
contractCockpit.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
contractHistory.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
contractTask.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
customer.service.ts Fix: Anrede per Du/Sie wird nicht gespeichert 2026-04-23 13:10:03 +02:00
emailLog.service.ts gdpr audit implemented, email log, vollmachten, pdf delete cancel data privacy and vollmachten, removed message no id card in engergy car, and other contracts that are not telecom contracts, added insert counter for engery 2026-03-21 11:59:53 +01:00
factoryDefaults.service.ts Factory-Defaults: Export + Import von Stammdaten-Katalogen 2026-04-23 14:10:12 +02:00
gdpr.service.ts gdpr audit implemented, email log, vollmachten, pdf delete cancel data privacy and vollmachten, removed message no id card in engergy car, and other contracts that are not telecom contracts, added insert counter for engery 2026-03-21 11:59:53 +01:00
imapService.ts Toast-Benachrichtigungen bei IMAP-Sync- und SMTP-Send-Fehlern 2026-04-23 15:16:04 +02:00
invoice.service.ts added place to telecommunication, added contract documents, added invoice to other contracts 2026-03-25 16:55:48 +01:00
pdfService.ts save email as pdf likae attachment version 2 2026-02-04 19:49:09 +01:00
pdfTemplate.service.ts PDF-Auftragsvorlagen-System, Objekttyp/Lage-Felder, Eigentümer-Fallback bei Bankverbindung 2026-04-05 19:16:47 +02:00
platform.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
provider.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
smtpService.ts Fix: IMAP/SMTP mit älteren TLS-Versionen zulassen 2026-04-23 15:05:04 +02:00
stressfreiEmail.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
tariff.service.ts complete new audit system 2026-03-21 18:23:54 +01:00
user.service.ts complete new audit system 2026-03-21 18:23:54 +01:00