Pentest 68.1 (LOW) + 68.2 (INFO): PDF-Active-Content-Filter + Modal-Limit
68.1: Magic-Byte-Check prüfte nur %PDF-. PDFs mit /JavaScript, /JS, /Launch, /EmbeddedFile, /RichMedia (Flash) kamen durch und wurden inline ausgeliefert – Browser-Viewer ignorieren JS, Adobe Acrobat nicht. - Neuer Helper assertSafePdf(buf) in utils/sanitize.ts mit case-sensitivem String-Scan auf die fünf Action-Patterns (\b-Word-Boundary verhindert False-Positives bei /JSXForm etc.). - Neue Middleware pdfUploadSafety.ts mit zwei Varianten: requireSafeUploadedPdf (PDF-only) und scanUploadedPdfIfPresent (durchwinkt JPG/PNG, scannt nur PDFs). - Eingehängt in: upload.routes (Magic-Byte-Validator erweitert), gdpr.routes Vollmacht-Upload, pdfTemplate.routes Template-Upload, contract.routes Vertragsdokumente, cachedEmail.controller (saveAttachmentTo, saveAttachmentAsInvoice, saveAttachmentAsContractDocument). - Inline-Vorschau bleibt – Pentester-Empfehlung "disposition=inline abschalten" wurde bewusst nicht umgesetzt (löst Acrobat-Risiko nicht, bricht aber ~20 UI-Stellen). - Smoke-Test: 5 Payload-Typen abgelehnt, clean PDF + Non-PDF + JSXForm durchgewinkt. 68.2: JpgToPdfModal-Self-DoS – MAX_IMAGES=50, MAX_IMAGE_BYTES=25MB.
This commit is contained in:
@@ -12,7 +12,8 @@ import {
|
||||
canAccessBankCard,
|
||||
canAccessIdentityDocument,
|
||||
} from '../utils/accessControl.js';
|
||||
import { validateOptionalIsoDate } from '../utils/sanitize.js';
|
||||
import { validateOptionalIsoDate, assertSafePdf } from '../utils/sanitize.js';
|
||||
import { ApiError } from '../utils/apiError.js';
|
||||
|
||||
// Pentest 56.1 (HIGH, 2026-06-01): Upload-Endpoints prüften nur die
|
||||
// Permission, nicht ob die Ziel-Resource zum Caller passt. Helper-Funktion
|
||||
@@ -140,6 +141,20 @@ function validateUploadedFile(req: AuthRequest, res: Response, next: Function) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Pentest 68.1 (LOW): PDF-Body auf aktive Inhalte scannen.
|
||||
if (detected.mime === 'application/pdf') {
|
||||
try {
|
||||
const fullBuf = fs.readFileSync(req.file.path);
|
||||
assertSafePdf(fullBuf);
|
||||
} catch (e) {
|
||||
try { fs.unlinkSync(req.file.path); } catch { /* ignore */ }
|
||||
const status = e instanceof ApiError ? e.statusCode : 415;
|
||||
const msg = e instanceof Error ? e.message : 'PDF ungültig';
|
||||
res.status(status).json({ success: false, error: msg });
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Filename auf kanonische Extension normalisieren. Multer hat
|
||||
// `<unique>.gif.php` o.ä. geschrieben – wir wollen `<unique>.gif`.
|
||||
const dir = path.dirname(req.file.path);
|
||||
|
||||
Reference in New Issue
Block a user