Bezpieczny upload plików wymaga kilku kontroli stosowanych łącznie, a wymienia je OWASP File Upload Cheat Sheet. Ten artykuł przechodzi przez tę listę, wskazuje punkty, które łatwo pominąć, i zamienia ją w testy, które możesz uruchomić na każdym endpoincie uploadu.
Przed czym się bronisz
Cheat sheet grupuje zagrożenia pod hasłem "złośliwe pliki". Pierwsze to atak na oprogramowanie, które obsługuje plik. Atakujący dostarcza plik wykorzystujący podatność w parserze lub module przetwarzającym, a jako przykłady cheat sheet podaje exploit ImageTrick oraz XXE.
Drugie to phishing. Jako przykład cheat sheet podaje formularz rekrutacyjny, czyli upload staje się sposobem na podsunięcie wrogiego pliku osobom, które go otworzą.
Trzecie to dostępność. Bomby ZIP, bomby XML (atak billion laughs) i po prostu ogromne pliki mogą zapełnić przestrzeń dyskową serwera i pogorszyć jego dostępność.
Waliduj, zanim zaakceptujesz
Cheat sheet ustala kolejność: zastosuj walidację danych wejściowych przed walidacją rozszerzenia. Następnie pracuje na allowliście.
- Wypisz dozwolone rozszerzenia. Zezwalaj tylko na bezpieczne, których wymaga funkcja biznesowa. Formularz zdjęcia profilowego nie ma powodu przyjmować niczego poza kilkoma typami obrazów.
- Waliduj typ pliku. Nie polegaj na deklarowanym
Content-Type, ponieważ można go sfałszować. Zwaliduj typ pliku i jego sygnaturę, zanim zaakceptujesz upload. - Ustaw limit długości nazwy pliku i, jeśli to możliwe, ogranicz dozwolone znaki.
- Ustaw limit rozmiaru pliku.
Jeśli plik nie przejdzie którejkolwiek z tych kontroli, odrzuć go.
Zadbaj o nazwę i lokalizację
Cheat sheet zaleca zmianę nazwy pliku podanej przez użytkownika na nazwę generowaną przez aplikację. Rób to przy każdym uploadzie, niezależnie od typu pliku.
Miejsce przechowywania pliku jest równie ważne jak jego zawartość. Jeśli możesz, przechowuj uploady na innym serwerze. Jeśli to niemożliwe, trzymaj je poza webroot.
Gdy pliki muszą być publicznie dostępne, użyj handlera wewnątrz aplikacji, który mapuje identyfikator na plik (someid na file.ext), zamiast ujawniać ścieżkę do magazynu.
Dwa kolejne punkty z listy łatwo zapomnieć:
- Pliki powinni móc wgrywać tylko uwierzytelnieni i uprawnieni użytkownicy.
- Zabezpiecz upload przed atakami CSRF.
Skanuj i przetwarzaj to, co zachowujesz
Walidacja sprawdza, czy plik wygląda poprawnie. Cheat sheet dodaje kolejny krok: jeśli to możliwe, przepuść plik przez silnik antywirusowy lub sandbox, aby potwierdzić, że nie zawiera złośliwych danych.
Dla odpowiednich typów dokumentów, takich jak PDF i DOCX, rozważ CDR (Content Disarm & Reconstruct) jako dodatkowy etap przetwarzania.
Cheat sheet mówi też, że wszystkie używane biblioteki muszą być bezpiecznie skonfigurowane i aktualizowane. Skoro podatności parserów należą do wymienionych zagrożeń, ten punkt przypisz konkretnej osobie i ustal termin przeglądu.
Testuj każdy endpoint
Cheat sheet wymienia kontrole, a nie przypadki testowe. Każdy wiersz poniżej to nasza własna pochodna jego listy kontrolnej, a trzecia kolumna wskazuje, z którego punktu wynika. Uruchom testy na każdym endpoincie uploadu, także w narzędziach administracyjnych i w tych dodanych na potrzeby jednego klienta.
| Test | Jak wygląda wynik pozytywny | Podstawa |
|---|---|---|
| Wgraj plik skryptu ze zmienionym rozszerzeniem na dozwolone | Odrzucony po walidacji typu pliku | Wyprowadzone: walidacja typu pliku |
Wyślij niedozwolony plik z dozwolonym Content-Type | Nadal odrzucony | Wyprowadzone: nie ufaj nagłówkowi Content-Type |
| Prześlij bardzo długą nazwę pliku | Odrzucona lub zastąpiona wygenerowaną nazwą | Wyprowadzone: limit długości nazwy pliku, generowane nazwy plików |
| Wgraj plik przekraczający limit rozmiaru | Odmowa | Wyprowadzone: limit rozmiaru pliku |
| Spróbuj pobrać zapisany plik, zgadując jego ścieżkę | Niedostępny inaczej niż przez handler | Wyprowadzone: lokalizacja przechowywania, mapujący handler |
| Wgraj plik bez sesji lub bez tokenu CSRF | Odmowa | Wyprowadzone: uprawnieni użytkownicy, ochrona przed CSRF |
| Wgraj bombę ZIP lub XML w środowisku testowym | Usługa pozostaje dostępna | Wyprowadzone: zagrożenie dla dostępności |
Jako szerszy punkt odniesienia służy OWASP Web Security Testing Guide, który określa się jako najważniejsze źródło wiedzy o testowaniu bezpieczeństwa dla twórców aplikacji webowych i specjalistów ds. bezpieczeństwa. OWASP Application Security Verification Standard zawiera numerowane wymagania, względem których możesz weryfikować aplikację. Jeśli powołujesz się na któreś z nich w zgłoszeniu lub raporcie, podaj wersję, na przykład v5.0.0-1.2.5, ponieważ identyfikatory mogą zmieniać się między wersjami standardu.
Od czego zacząć
- Wypisz każdy endpoint, który przyjmuje plik, w tym narzędzia administracyjne, funkcje importu i stare wtyczki.
- Dla każdego z nich określ dozwolone rozszerzenia, maksymalny rozmiar pliku i maksymalną długość nazwy pliku oraz zastosuj walidację danych wejściowych przed sprawdzeniem rozszerzenia.
- Zastąp nazwy plików podane przez użytkownika nazwami generowanymi. Przenieś magazyn na osobny serwer lub poza webroot, a pliki publiczne udostępniaj przez handler mapujący identyfikatory na nazwy plików.
- Dodaj walidację typu i sygnatury pliku, krok z antywirusem lub sandboxem oraz CDR dla przyjmowanych typów dokumentów. Sprawdź, czy biblioteki do parsowania są aktualne i bezpiecznie skonfigurowane.
- Zamień tabelę testów w skryptowane kontrole i uruchamiaj je przed każdym wydaniem. Jeśli chcesz niezależnej oceny wyniku, nasza usługa testów penetracyjnych przetestuje endpointy, a nasze wsparcie w bezpiecznym wytwarzaniu oprogramowania pomoże, jeśli funkcja jest jeszcze na etapie projektowania. Wytyczne OWASP dotyczące uploadu plików sprawdzą się w obu przypadkach jako lista kontrolna do przeglądu.
