[Security/High] Bild-Upload ohne Groessen- und Typpruefung, Dateien oeffentlich abrufbar #37
Labels
No labels
bug
critical
database
duplicate
enhancement
help wanted
invalid
performance
question
refactoring
security
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Aceless/RecipePlanner#37
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
Controller/RecipeImagesController.csakzeptiert jede Datei, sobald der vom Client gesendeteContent-Typemitimage/beginnt:wwwroot/images/recipesund werden vonapp.UseStaticFiles()ohne Authentifizierung ausgeliefert.Auswirkung
.htmloder.svgwird von derselben Origin ausgeliefert und kann Skripte ausfuehren (Stored XSS gegen ein spaeteres Web-Frontend).Fix
.jpg,.jpeg,.png,.webp) und dazu passenden Content-Type erzwingen, Dateinamen selbst vergeben statt den Originalnamen anzuhaengen.[RequestSizeLimit]setzen undFormOptions.MultipartBodyLengthLimitkonfigurieren.wwwroot, oder mindestensContent-Disposition: attachmentund einen eigenen Static-File-Pfad mitServeUnknownFileTypes = falseverwenden.Upload-Prüfung erledigt, Auslieferung offen.
Geändert (neu:
Infrastructure/RecipeImageStorage.cs).jpg,.jpeg,.png,.webp.FormOptions.MultipartBodyLengthLimit.{guid}{endung}. Damit sind weder Pfadanteile noch Doppelendungen möglich.Damit ist der Weg über eine hochgeladene
.htmloder.svgzu, das war das eigentliche XSS-Risiko.Offen
Bilder werden weiter über
wwwrootohne Authentifizierung ausgeliefert. Eine Umstellung auf einen geschützten Endpunkt braucht auch eine Anpassung in der App, weilImage.networkkeinen Authorization-Header mitschickt. Deshalb bewusst nicht in diesem Schritt.Branch
backend/issue-fixes, Commits026544c.