Pentest R101.1: Inline-Preview-Pfad refaktoriert + Diagnose-Log

R101.1 INFO/funktional: Pentester sieht Content-Disposition:
attachment auch bei ?disposition=inline. Die Logik im Controller
ist korrekt und liefert beim Direkttest gegen echte PDFs
application/pdf, der Pfad lässt sich aber in Prod nicht
reproduzieren.

Refaktoriert:
- Magic-Byte-Check in detectSafeContentType() extrahiert
- File-Descriptor wird in finally garantiert geschlossen
- Short-Read-Fälle (bytesRead < n) explizit geguardet
- console.warn wenn inline angefragt aber Magic-Byte-Mismatch
  oder Read-Crash – damit der Fall in Prod-Logs sichtbar wird
  falls er wieder auftritt

Sicherheits-Verhalten unverändert: Mismatch → attachment
(Stored-XSS-Schutz aus R30.13).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 20:54:16 +02:00
parent 386d206ff1
commit 818f801939
2 changed files with 76 additions and 34 deletions
+18
View File
@@ -97,6 +97,24 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🔧 Pentest R101.1 Inline-Preview-Pfad refaktoriert + Diagnose-Log**
- Pentester R101.1 (INFO/funktional) berichtet: `?disposition=inline`
bewirkt nichts, Browser zeigt Download-Dialog. Die Logik im
`fileDownload.controller` ist eigentlich korrekt sauberer Magic-
Byte-Check für PDF/PNG/JPEG/GIF/WebP und liefert beim Direkttest
gegen echte Vertrags-PDFs `application/pdf`. Wir können das in Prod
aber nicht reproduzieren.
- Refaktorierung: Magic-Byte-Check in `detectSafeContentType()`
extrahiert, finally-Block schließt File-Descriptor garantiert,
Short-Read-Fälle (`bytesRead < n`) jetzt sauber geguardet.
- Sicherheits-Verhalten unverändert: bei Magic-Byte-Mismatch bleibt
es bei `Content-Disposition: attachment` (Stored-XSS-Schutz aus
R30.13).
- Neu: `console.warn`, wenn `inline` angefragt wurde, aber der
Magic-Byte-Check fehlschlägt oder der Read crasht. Damit fällt
der Fall im Prod-Log auf, falls er nochmal auftritt bisher
war's silent.
- [x] **🔒 Pentest R97 Attachment-Validierung im Send-Handler**
- R97.1 (LOW): malformed `content` (`null`, fehlend, `true`, `""`)
erzeugte 200/500 mit rohem `Buffer.from()`-Fehlertext in der