Skip to content

fix: prevent upload path traversal (C3)#337

Merged
cola500 merged 1 commit into
stagingfrom
feature/c3-upload-path-traversal
May 18, 2026
Merged

fix: prevent upload path traversal (C3)#337
cola500 merged 1 commit into
stagingfrom
feature/c3-upload-path-traversal

Conversation

@cola500
Copy link
Copy Markdown
Owner

@cola500 cola500 commented May 18, 2026

Summary

C3 — sista CRITICAL i Sprint 3-A.

Hardenar /api/upload-routen mot path traversal:

  • Fix A: Ext härleds från whitelist image/jpeg → jpg, image/png → png, image/webp → webp, application/pdf → pdf (fallback bin) — INTE från file.name.split(".").pop(). Tidigare kunde file.name = "evil.png/../../../etc/passwd" placera filer utanför bucket-namespace.
  • Fix B: Defense-in-depth assertSafeStorageFileName() i supabase-storage.ts (blockerar /, \\, .., \x00, leading dot, tom, >255 chars). Anropas i uploadFile() och i uploadMessageAttachment() (mot leaf, så bucket-segmentet inte påverkas).
  • Fix C: Zod z.string().uuid()entityId — fail-fast 400 "Ogiltigt entityId" innan ownership-check, defense-in-depth innan interpolation i path.

Test plan

  • 6 nya unit-tester för assertSafeStorageFileName (H1-H6)
  • 5 nya regression-tester i upload/route.test.ts (T1-T5: traversal i file.name, null-byte, MIME-baserad ext, traversal i entityId, non-UUID entityId)
  • Befintliga tester uppdaterade till UUID v4 entityIds
  • Angränsande tester gröna: native/provider/upload, messages/attachments
  • npm run check:all 4/4 gröna (typecheck, test:run, lint, check:swedish)

Out of scope

  • V4 — UUID-validering av bookingId i messages/attachments/route.ts (skyddat indirekt av loadBookingForMessaging)
  • Sanering av Upload.originalName (ej path-använt; XSS-vektor om framtida vy renderar otrust)
  • Hardening av deleteFile/createMessageSignedUrl mot ovaliderad path (idag bara DB-källad)

Sprint 3-A status efter merge

CRITICAL: C4 ✅ • C1 ✅ • C2 ✅ • C3 ✅ — alla 4 åtgärdade.

@cola500 cola500 merged commit 30052a3 into staging May 18, 2026
4 checks passed
@cola500 cola500 deleted the feature/c3-upload-path-traversal branch May 18, 2026 16:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant