14.06.2026

Iluzoryczne bezpieczeństwo II. Kiedy przypadek okazuje się schematem operacyjnym

← Wróć do artykułów
Iluzoryczne bezpieczeństwo II. Kiedy przypadek okazuje się schematem operacyjnym


Wstęp



W pierwszej części tego studium przypadku opisałem środowisko, w którym publiczny formularz zbierający dane o podwyższonej wrażliwości został osadzony poza główną architekturą systemu i pozbawiony kluczowych warstw ochrony.



Na pierwszy rzut oka taki przypadek można uznać za jednostkowy incydent wynikający z lokalnych zaniedbań. Pogłębiona analiza innych wdrożeń tego samego wykonawcy pokazała jednak coś znacznie poważniejszego: błędy z pierwszego środowiska nie były wyjątkiem, lecz częścią powtarzalnego schematu operacyjnego.



Metodologia



Analiza objęła kilka niezależnych środowisk produkcyjnych obsługujących różne typy organizacji: placówkę edukacyjną, portal samorządowy oraz firmę sektora B2B.



Badanie opierało się wyłącznie na informacjach publicznie dostępnych: kodzie źródłowym HTML, nagłówkach HTTP, wersjach bibliotek, publicznych ścieżkach zasobów oraz bazach znanych podatności CVE. Nie wykonywano prób exploitacji ani nie uzyskiwano nieautoryzowanego dostępu do żadnego systemu.



Środowisko A: placówka edukacyjna



Pierwsze środowisko zostało opisane szerzej w części I. W skrócie: publiczny formularz służący do przesyłania danych osobowych został osadzony poza główną logiką aplikacji, a jego implementacja nie dawała podstaw, by zakładać istnienie rygorystycznej walidacji backendowej i wielowarstwowej ochrony przed nadużyciem.



Najważniejszy wniosek z tego środowiska pozostaje bez zmian: problem nie wynikał wyłącznie z lokalnej prowizorki, lecz z faktu, że system bazowy nie przewidywał bezpiecznego modelu obsługi tego typu procesów.



Środowisko B: portal samorządowy



Drugie analizowane środowisko opierało się na WordPressie w konfiguracji white-label. Warstwa wizualna panelu została zmodyfikowana, jednak sama platforma pozostawała łatwa do rozpoznania po zasobach ładowanych na stronie i śladach pozostawionych w kodzie.



Nieaktualne komponenty i podatna warstwa formularzy



W portalu znajdował się moduł formularzy korzystający z wersji komponentu, dla której istniała publicznie opisana podatność typu Stored XSS. To oznacza, że złośliwy payload mógł zostać zapisany w systemie i wykonać się w przeglądarce administratora przeglądającego zgłoszenia.



W praktyce taka luka może prowadzić do przejęcia sesji panelu, modyfikacji treści lub dalszego osadzenia złośliwego kodu na stronie publicznej.



Narzut i brak kontroli nad zależnościami



Strona ładowała dużą liczbę zasobów frontendowych, w tym skrypty związane z formularzami również tam, gdzie nie były potrzebne. Jednocześnie w kodzie pojawiały się różne wersje bibliotek JavaScript, co wskazuje na brak spójnego zarządzania zależnościami i negatywnie wpływa na czas odpowiedzi serwera oraz ogólną przewidywalność wdrożenia.



Środowisko C: firma B2B



Trzecie środowisko wracało do autorskiego systemu tego samego wykonawcy i ujawniało problem jeszcze bardziej fundamentalny: brak izolacji rdzenia aplikacji od warstwy publicznej.



Publicznie dostępne pliki systemowe



Część ścieżek prowadzących do plików systemowych odpowiadała kodem 200 OK zamiast 403 lub 404. Oznacza to, że serwer nie blokował dostępu do zasobów, które nie powinny być publicznie dostępne.



Dodatkowo możliwe było mapowanie katalogów i szablonów, co ułatwia zrozumienie architektury systemu przez automatyczne skanery i osoby analizujące strukturę wdrożenia.



Przestarzałe biblioteki



W kodzie ładowane były bardzo stare wersje bibliotek JavaScript, dla których istnieją publicznie opisane podatności. Sam fakt obecności takich zależności w środowisku produkcyjnym świadczy o braku procesu aktualizacji i utrzymania bezpieczeństwa po wdrożeniu.



Błędy routingu i fallbacków



W niektórych przypadkach żądania kierowane do technicznych ścieżek systemu nie kończyły się poprawnym błędem, lecz niepełnym renderem strony głównej bez części zasobów. To objaw braku poprawnej separacji między routingiem publicznym a strukturą wewnętrzną aplikacji.



Powtarzalny schemat



Po zestawieniu tych środowisk wyłania się powtarzalny model pracy:



  • brak jednej spójnej strategii technologicznej,

  • pozostawianie w produkcji przestarzałych komponentów mimo znanych podatności,

  • brak izolacji plików systemowych od warstwy publicznej,

  • brak natywnych mechanizmów bezpieczeństwa dla formularzy i punktów wejścia,

  • przerzucanie ryzyka operacyjnego na klienta końcowego.



Kontrast między deklaracją a rzeczywistością



Najbardziej uderzający jest rozdźwięk między formalną warstwą komunikacyjną a techniczną rzeczywistością. Z zewnątrz wszystko wygląda poprawnie: polityki prywatności, oficjalne formularze, deklaracje bezpieczeństwa i zgodności z wymogami ochrony danych.



Pod spodem działa jednak infrastruktura, która nie spełnia podstawowych standardów bezpieczeństwa aplikacyjnego: nieaktualne biblioteki, publicznie widoczne elementy architektury, podatne rozszerzenia i brak jednolitego modelu ochrony warstwy wejścia.



Wnioski



Błędy z pierwszego środowiska nie były incydentem. Były objawem modelu wdrożeniowego, w którym system trafia do produkcji bez realnego planu utrzymania, aktualizacji i audytu bezpieczeństwa.



Dla organizacji powierzających budowę strony zewnętrznemu wykonawcy oznacza to konieczność weryfikacji nie tylko warstwy wizualnej, ale przede wszystkim:



  • aktualności komponentów i zależności,

  • obecności walidacji backendowej,

  • stosowania mechanizmów takich jak rate limiting i polityki nagłówków bezpieczeństwa,

  • izolacji plików systemowych od warstwy publicznej,

  • istnienia rzeczywistego procesu utrzymania systemu po wdrożeniu.



Bezpieczeństwo strony WWW nie jest deklaracją. Jest stanem infrastruktury, który można ocenić technicznie - niezależnie od tego, jak profesjonalnie wygląda warstwa wizualna.



Powiązane artykuły
Kontakt
Zainteresował Cię temat?

Porozmawiajmy

Wypełnij formularz, zadzwoń lub napisz do mnie.

Skontaktuj się