| Termin | Definicja |
|---|---|
| brak walidacji pól (XSS / injection) | Brak walidacji pól, pod kątem XSS lub injection, to poważna luka bezpieczeństwa umożliwiająca wstrzyknięcie złośliwego kodu do systemu. Brak walidacji pól – czym jest problem XSS i injectionBrak walidacji pól oznacza sytuację, w której dane wpisywane przez użytkownika nie są odpowiednio sprawdzane przed zapisaniem, przetworzeniem albo wyświetleniem. Pole formularza może przyjmować nazwę, adres, komentarz, numer zgłoszenia, treść wiadomości lub inny parametr, a aplikacja przekazuje taką wartość dalej bez upewnienia się, że ma ona właściwy format i bezpieczną zawartość. Sam fakt, że dane pochodzą z formularza widocznego w przeglądarce, nie oznacza, że można im ufać. Kontrolę można ominąć między innymi przez zmodyfikowane żądanie HTTP, narzędzia deweloperskie, własny skrypt albo bezpośrednie wywołanie punktu końcowego. W kontekście XSS problem polega na tym, że wprowadzony tekst może zostać potraktowany jako kod wykonywany w przeglądarce. W przypadku injection dane mogą zostać odczytane jako fragment polecenia przeznaczonego dla innego komponentu aplikacji, na przykład mechanizmu zapytań, interpretera, systemu plików albo narzędzia przetwarzającego treść. Nie każda nieprawidłowa wartość prowadzi od razu do przejęcia konta, jednak brak kontroli tworzy warunki, w których zwykłe pole tekstowe staje się drogą do niepożądanego działania. Walidacja nie jest pojedynczym filtrem dodanym w jednym miejscu. Powinna obejmować określenie dozwolonego typu danych, długości, zestawu znaków, zakresu wartości oraz sposobu użycia danej wartości w dalszej części programu. Wymagane jest także bezpieczne kodowanie danych przy wyświetlaniu oraz stosowanie mechanizmów ochronnych właściwych dla konkretnego kontekstu. Odrzucenie wartości na ekranie formularza nie wystarcza, ponieważ żądanie może zostać wysłane z pominięciem interfejsu. XSS a injection – kontekst techniczny i najważniejsze porównaniaXSS najczęściej dotyczy miejsca, w którym dane użytkownika trafiają do kodu strony lub dokumentu zwracanego przeglądarce. Szczególnie ryzykowne bywają komentarze, opisy profili, wiadomości, pola wyszukiwania oraz parametry umieszczane w adresie strony. Jeżeli treść zostanie wstawiona do dokumentu bez właściwego kodowania, przeglądarka może zinterpretować ją inaczej, niż zakładał twórca aplikacji. Skutkiem może być wykonanie skryptu w kontekście odwiedzanej witryny, modyfikacja elementów strony, przekierowanie albo próba odczytu danych dostępnych dla bieżącej sesji. Injection jest pojęciem szerszym. Obejmuje przypadki, w których dane wejściowe mieszają się z instrukcjami kierowanymi do innego języka lub komponentu. W praktyce analizuje się między innymi zapytania do baz danych, polecenia systemowe, wyrażenia używane przez interpretery, szablony i ścieżki plików. Wspólnym mechanizmem jest brak wyraźnego rozdzielenia danych od instrukcji. Aplikacja nie powinna budować poleceń przez proste sklejanie tekstu pochodzącego z formularza. Warto odróżnić walidację od sanityzacji. Walidacja odpowiada na pytanie, czy wartość spełnia określone reguły, na przykład czy numer ma wymagany format albo czy pole nie przekracza ustalonej długości. Sanityzacja próbuje usunąć lub zmienić niebezpieczne elementy, lecz jej skuteczność zależy od kontekstu i użytych narzędzi. Kodowanie kontekstowe zmienia sposób interpretacji danych w miejscu ich użycia. Najbezpieczniejsze podejście polega na połączeniu tych mechanizmów z parametryzowanymi zapytaniami, bezpiecznymi interfejsami programistycznymi i ograniczeniem uprawnień. Nie należy utożsamiać obecności znaków specjalnych z atakiem. Apostrof, nawias, znak mniejszości czy cudzysłów mogą występować w prawidłowej treści. Reguły muszą wynikać z przeznaczenia pola, a nie z przypadkowej listy znaków. Nadmiernie ogólne filtry bywają omijane przez różne kodowania, warianty wielkości liter, nietypowe separatory oraz różnice między komponentami. Analiza powinna więc obejmować cały przepływ danych: od formularza, przez serwer, po bazę, szablon i odpowiedź dla przeglądarki. Typowe problemy wynikające z braku walidacji pól XSS i injectionJednym z częstych problemów jest walidacja wykonywana tylko po stronie przeglądarki. Taki mechanizm poprawia wygodę obsługi, ale nie stanowi zabezpieczenia, ponieważ komunikat może zostać zmieniony albo całkowicie pominięty. Jeżeli serwer przyjmuje wartość bez własnej kontroli, pole pozostaje podatne mimo obecności reguł w kodzie interfejsu. Podobne ryzyko powstaje, gdy zabezpieczenie działa w formularzu tworzenia danych, lecz nie działa przy ich imporcie, edycji, wyszukiwaniu lub przetwarzaniu przez inne wejście. Inny przypadek dotyczy danych zapisanych wcześniej. Treść może wyglądać niegroźnie w bazie, ale stać się niebezpieczna dopiero w chwili wyświetlenia w określonym miejscu. Dlatego sprawdzanie wyłącznie podczas zapisu nie zastępuje bezpiecznego renderowania. Należy ustalić, w jakim kontekście wartość zostanie użyta: jako zwykły tekst, fragment atrybutu, element adresu, dane strukturalne czy część dokumentu. Każdy z tych kontekstów wymaga osobnego sposobu kodowania. W przypadku injection problem może wynikać z ręcznego konstruowania zapytań, przekazywania danych do poleceń systemowych lub dynamicznego tworzenia ścieżek. Szczególnie niebezpieczne jest łączenie kilku parametrów w jeden ciąg bez rozdzielenia ich od instrukcji. Ryzyko zwiększa się, gdy proces aplikacji ma szerokie uprawnienia, może zapisywać pliki, odczytywać poufne zasoby albo wykonywać działania niezwiązane z jego podstawowym zadaniem. Ograniczenie uprawnień nie usuwa błędu, lecz może ograniczyć jego skutki. Na uwagę zasługują także błędy pośrednie: niejednoznaczne kodowanie znaków, automatyczne konwersje typów, różne reguły walidacji w poszczególnych modułach oraz brak logowania odrzuconych żądań. W aplikacjach rozwijanych przez długi czas może powstać kilka niezależnych ścieżek obsługi tego samego pola. Poprawka w jednym formularzu nie musi zabezpieczać pozostałych miejsc. Przegląd powinien uwzględniać również interfejsy API, zadania wykonywane w tle, import plików i mechanizmy integracyjne. Praktyczne wskazówki dla ochrony przed XSS i injection w polachNajpierw warto sporządzić mapę wszystkich danych wejściowych. Obejmuje ona formularze, parametry adresów, nagłówki, pliki, ciasteczka, dane zewnętrznych integracji oraz wartości pobierane z innych modułów. Dla każdego pola powinno zostać określone przeznaczenie, oczekiwany typ, minimalna i maksymalna długość, dopuszczalny format oraz reakcja na błąd. Reguły powinny być egzekwowane po stronie serwera, a komunikat zwracany użytkownikowi nie powinien ujawniać szczegółów implementacji. Dla zapytań do baz danych należy stosować parametry zamiast sklejania tekstu. Dla poleceń zewnętrznych najlepiej używać wyspecjalizowanych interfejsów, które przekazują argumenty jako odrębne wartości, oraz całkowicie eliminować możliwość przyjmowania poleceń tam, gdzie nie jest to konieczne. Przy tworzeniu ścieżek plików powinno się korzystać z dozwolonych identyfikatorów lub z ustalonego katalogu bazowego, a nie z dowolnych fragmentów przesłanych przez użytkownika. Przy wyświetlaniu danych należy stosować kodowanie właściwe dla miejsca użycia. Zwykły tekst powinien być traktowany jako tekst, a nie jako gotowy kod. Jeżeli aplikacja musi obsługiwać ograniczony zakres formatowania, potrzebny jest kontrolowany parser z listą dozwolonych elementów i atrybutów. Przydatne bywają również nagłówki ochronne przeglądarki, odpowiednie ustawienia ciasteczek sesyjnych oraz polityka ograniczająca źródła skryptów. Są to warstwy uzupełniające, a nie zamienniki poprawnej obsługi danych. Testy powinny obejmować zarówno poprawne wartości, jak i dane nietypowe: bardzo długie ciągi, puste pola, znaki specjalne, różne kodowania, nieoczekiwane typy oraz wielokrotne przesyłanie tych samych parametrów. Warto sprawdzać, czy odrzucona wartość nie trafia mimo wszystko do logów, komunikatów, tabel administracyjnych lub wiadomości e-mail w formie możliwej do wykonania. Po wdrożeniu zmian należy ponownie przetestować wszystkie miejsca, w których dana wartość jest zapisywana i wyświetlana. Kiedy zgłosić brak walidacji pól XSS lub injection do serwisuDo serwisu warto zgłosić problem, gdy formularz przyjmuje treści, których nie da się usunąć, strona wyświetla nieoczekiwane elementy, aplikacja przekierowuje do obcych witryn albo panel administracyjny zachowuje się inaczej po zapisaniu komentarza lub innej wartości. Niepokój powinny wzbudzić również nagłe komunikaty o błędach zapytań, powtarzające się odrzucenia danych, nieznane wpisy w logach oraz sytuacje, w których określone pole działa inaczej w różnych częściach systemu. Przed przekazaniem zgłoszenia zaleca się zachować adres strony, opis kolejnych czynności, czas wystąpienia zdarzenia i informację o tym, czy problem pojawia się na jednym urządzeniu, w jednej przeglądarce czy w wielu środowiskach. Nie powinno się przesyłać haseł, tokenów sesyjnych ani pełnych danych klientów. Jeżeli istnieje podejrzenie aktywnego wykorzystania luki, można czasowo wyłączyć wadliwy formularz, ograniczyć dostęp do panelu i zabezpieczyć kopie logów do dalszej analizy. W Warszawie takie zgłoszenia można przekazać do firmy Warszawskie Pogotowie Komputerowe 24/7, gdzie diagnoza laptopa jest bezpłatna. Przed rozpoczęciem prac przydatne będzie wskazanie, czy chodzi o stronę internetową, panel, formularz lokalnego programu czy urządzenie wykorzystywane do obsługi systemu. Pozwala to uporządkować objawy, sprawdzić podstawowe przyczyny i ustalić, czy potrzebna jest analiza konfiguracji, aktualizacji, logów lub sposobu przetwarzania danych. Sama zmiana komunikatu błędu nie rozwiązuje problemu, jeżeli źródłem pozostaje brak rozdzielenia danych od instrukcji. |