From a235c43f4042d29cbd7bbcfbb4ae51a68a39e651 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Wed, 3 Jun 2026 15:21:24 +0200 Subject: [PATCH] Pentest 70.1 (INFO): GIF/WebP-Whitelist in contract.routes Multer-Filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit contract.routes Vertragsdokumente: Multer-fileFilter blockte image/gif + image/webp, obwohl validateUploadedFile sie zulässt. Folge: GIF mit korrektem MIME 415, mit gespooftem MIME 201. Kein Sicherheitsproblem (Magic-Byte ist der echte Guard), nur Konsistenz. --- backend/src/routes/contract.routes.ts | 8 ++++++-- docs/todo.md | 10 ++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/backend/src/routes/contract.routes.ts b/backend/src/routes/contract.routes.ts index 6e183381..c6c3b5a7 100644 --- a/backend/src/routes/contract.routes.ts +++ b/backend/src/routes/contract.routes.ts @@ -23,9 +23,13 @@ const docUpload = multer({ }, }), fileFilter: (_req, file, cb) => { - const allowed = ['application/pdf', 'image/jpeg', 'image/png', 'image/jpg']; + // Pentest 70.1: aligned mit validateUploadedFile-Whitelist + // (PDF/JPG/PNG/GIF/WebP). Multer-fileFilter ist nur "fast reject" + // anhand des client-gemeldeten MIME-Types; der echte Guard ist der + // Magic-Byte-Check in validateUploadedFile. + const allowed = ['application/pdf', 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp']; if (allowed.includes(file.mimetype)) cb(null, true); - else cb(new Error('Nur PDF, JPG und PNG Dateien sind erlaubt')); + else cb(new Error('Nur PDF, JPG, PNG, GIF oder WebP erlaubt')); }, limits: { fileSize: 10 * 1024 * 1024 }, }); diff --git a/docs/todo.md b/docs/todo.md index 8fcb82da..151d8cbe 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -97,6 +97,16 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung ## ✅ Erledigt +- [x] **🔒 Pentest 70.1 (INFO): GIF/WebP-Inkonsistenz in contract.routes Multer-Filter** + - `contract.routes.ts` Vertragsdokumente: Multer-fileFilter blockte + `image/gif` und `image/webp`, obwohl `validateUploadedFile` beide + Typen zulässt. Folge: GIF mit korrektem MIME `image/gif` → 415, GIF + mit gespooftem MIME `image/jpeg` → akzeptiert (vom Magic-Byte als + `.gif` erkannt). Kein Sicherheitsproblem (Magic-Byte ist der echte + Guard), aber inkonsistent. + - Fix: Whitelist um `image/gif` + `image/webp` ergänzt → konsistent + zum zentralen `validateUploadedFile` und zu `upload.routes.ts`. + - [x] **🔒 Pentest 69.3 (INFO → Defense-in-Depth): Magic-Byte-Check auf Vertragsdokumente erweitert** - `contract.routes.ts` Vertragsdokumente-Upload hatte bisher nur den PDF-Inhalts-Scan (`scanUploadedPdfIfPresent` aus 68.1). JPG/PNG-