Skip to content

Craty v1.2.2

Choose a tag to compare

@cyryllo cyryllo released this 09 Oct 19:08
· 6 commits to main since this release

Wydanie poświęcone bezpieczeństwu. Po przeglądzie działającej instalacji i kodu aplikacji poprawiono dwie realne luki, dołożono kilka warstw ochrony i zestaw automatycznych testów, które pilnują, żeby te problemy nie wróciły. Zalecana aktualizacja dla wszystkich instalacji. Zbiera też drobne zmiany z wersji 1.2.1.

Poprawki bezpieczeństwa

Załączniki przyjmują tylko bezpieczne typy plików
Do tej pory jako załącznik przedmiotu można było wgrać dowolny plik, także skrypt .php, a załączniki trafiają do publicznie dostępnego katalogu /storage/. Zalogowany użytkownik mógł więc wgrać skrypt i uruchomić go na serwerze. Teraz załącznik musi być plikiem PDF, dokumentem biurowym (Word, Excel, LibreOffice, RTF), obrazem, plikiem tekstowym, CSV albo archiwum ZIP, a typ jest rozpoznawany po zawartości pliku, nie po jego nazwie. Dodatkowo serwer nie uruchomi ani nie wyświetli jako strony żadnego skryptu czy pliku HTML z katalogu /storage/, nawet gdyby taki się tam znalazł.

Wyłączone konto naprawdę traci dostęp
Konto wyłączone przez administratora wciąż mogło się zalogować i przeglądać pulpit oraz listę przedmiotów (blokada działała tylko przy zmianach danych). Teraz logowanie na wyłączone konto jest odrzucane, a osoba zalogowana w chwili wyłączenia konta zostaje wylogowana przy następnym kliknięciu.

Brak listingu katalogów i porządek w /storage/
Na części serwerów katalog /storage/ pokazywał listę wszystkich plików, czyli zdjęcia wszystkich przedmiotów, także tych niewystawionych na sprzedaż. Wyłączenie listingu było dotąd uzależnione od modułu serwera, którego wiele hostingów nie ma. Teraz jest włączone zawsze, a z /storage/ dostępne są wyłącznie zdjęcia, kody QR i logo. Migracja przy aktualizacji usuwa też stare, prywatne katalogi, które przy dawnej zmianie układu plików mogły trafić do publicznego magazynu (w tym kopie kodu z usuniętej funkcji cofania aktualizacji). Zdjęcia, kody QR i logo zostają nietknięte.

Nagłówki bezpieczeństwa
Aplikacja wysyła teraz nagłówki chroniące przed osadzaniem strony w ramce na obcej witrynie, przed zgadywaniem typu plików przez przeglądarkę i przed wyciekiem pełnych adresów stron do zewnętrznych serwisów, a dostęp do aparatu ogranicza do samej aplikacji. Wysyła je sama aplikacja, a nie plik .htaccess, bo na niektórych hostingach nagłówki dodane w .htaccess po drodze znikają.

Mniejsze wzmocnienia

  • Favicon i logo nie przyjmują już plików SVG (SVG może zawierać skrypt), tylko PNG, ICO, JPG, WebP i GIF.
  • Zablokowany dostęp do ukrytych plików i katalogów (np. .git) oraz plików dokumentacji .md, co ma znaczenie przy instalacji przez git clone prosto na serwer.
  • Wyłączono nieużywane trasy Laravela do serwowania i wgrywania plików prywatnych.

Testy i narzędzia

Automatyczne testy bezpieczeństwa (tests/Feature/Security/): mapa uprawnień sprawdza każdą stronę aplikacji, czyli kto ma do niej dostęp (gość, magazynier, administrator), i nie przejdzie, jeśli ktoś doda nową stronę bez przemyślenia uprawnień. Kolejne testy sprawdzają wgrywanie złośliwych plików, wstrzykiwanie kodu w nazwach przedmiotów, próbę nadania sobie roli administratora, wyłączone konta i blokadę logowania po pięciu błędnych hasłach.

Skrypt security-check sprawdza działającą instalację z zewnątrz: ./security-check https://twoja-domena.pl. Wykonuje wyłącznie zapytania odczytu, bez logowania, więc można go bezpiecznie uruchamiać na produkcji, np. po każdej aktualizacji. Sprawdza, czy nie da się pobrać plików z kodem i hasłami, czy nie ma listingu katalogów, czy panel wymaga logowania, czy strona błędu nie zdradza szczegółów, oraz nagłówki, ciasteczka i przekierowanie na HTTPS.

Zgłaszanie luk: lukę bezpieczeństwa można teraz zgłosić prywatnie przez GitHub Security Advisories, zamiast w publicznym zgłoszeniu.

Pozostałe zmiany (1.2.1)

  • „Ustawienia sklepu” nazywają się teraz „Opcje sprzedaży”, bo Craty to program magazynowy, a nie sklep.
  • README opisuje założenia projektu, plany na przyszłość, jak pomóc i jak dbać o bezpieczeństwo. Projekt ma też stronę na GitHub Pages i formularze do zgłaszania błędów oraz pomysłów.

Aktualizacja

Panel administratora → Ustawienia → Aktualizacje → wgraj paczkę poniżej. Aktualizacja uruchamia jedną migrację (sprzątanie starych katalogów z publicznego magazynu plików) i nadpisuje plik .htaccess w katalogu głównym nową wersją. Jeśli wprowadzałeś w nim własne zmiany, zapisz je przed aktualizacją. Jak zawsze: zrób kopię plików i bazy danych przed wgraniem. Po aktualizacji warto uruchomić ./security-check dla swojej domeny.


Paczka do wdrożenia: craty-1.2.2.zip (SHA-256: 1f3e46b3a1d7dde06cdf53d70b50516dcd84ab724039e7e1bdfd0ec67e372cad)