OWASP Top 10 2025 – najważniejsze Zagrożenia I Porady Bezpieczeństwa

securitybeztabu.pl 1 miesiąc temu

OWASP Top 10 w praktyce: krótki kontekst zanim przejdziemy dalej

OWASP Top 10 to globalny standard opisujący 10 najpoważniejszych ryzyk bezpieczeństwa aplikacji webowych. Najnowsza edycja – OWASP Top 10 2025 – została właśnie opublikowana (po raz ósmy, poprzednio w 2021 roku) i przynosi ważne zmiany. Dla studentów i początkujących specjalistów cyberbezpieczeństwa znajomość tej listy jest kluczowa.

W tym artykule w stylu technicznie i przystępnie wyjaśniamy, czym jest OWASP Top 10, dlaczego jest ważne, jakie nowości pojawiły się w 2025 (vs 2021) oraz przedstawiamy checklistę bezpieczeństwa aplikacji zgodną z OWASP. Dowiesz się także, jak wykorzystać tę wiedzę w praktyce – od analizy logów po wdrożenie zasady najmniejszych uprawnień.

Czym jest OWASP Top 10?

OWASP Top 10 (The Open Web Application Security Project Top Ten) to cyklicznie aktualizowany projekt społeczności OWASP, który identyfikuje dziesięć najpoważniejszych i najpowszechniejszych kategorii problemów bezpieczeństwa aplikacji webowych. Lista tworzona jest na podstawie analizy globalnych danych z milionów incydentów i testów bezpieczeństwa, zebranych dzięki firmom partnerskim, badaczom oraz społeczności OWASP. Stanowi ona punkt odniesienia dla programistów, testerów, architektów i specjalistów IT – pomaga zwiększać świadomość zagrożeń i promować dobre praktyki przy tworzeniu bezpiecznego oprogramowania.

Każda z dziesięciu kategorii OWASP Top 10 opisuje pewien typ podatności (np. brak kontroli dostępu, błędy konfiguracji, iniekcje kodu itp.), podaje przykłady ataków oraz rekomendacje, jak im przeciwdziałać. Deweloperzy i zespoły bezpieczeństwa wykorzystują Top 10 jako podstawową listę kontrolną – jeżeli aplikacja jest zabezpieczona przed tymi ryzykami, to znaczy, iż chronimy się przed najczęstszymi wektorami ataku.

Dlaczego to ma znaczenie?

Projekt OWASP Top 10 pokazuje, iż zagrożenia ewoluują wraz z rozwojem technologii – na podstawie danych z ~3 milionów aplikacji widać nowe trendy (np. rosnąca rola AI, chmury, architektury mikroserwisów). W wydaniu 2025 dodano dwie nowe kategorie zagrożeń i połączono jedną z istniejących (atak SSRF połączono z kategorią Broken Access Control). To sygnał, iż pojawiają się nowe priorytety: coraz większe znaczenie mają ataki na łańcuch dostaw oprogramowania (supply chain) oraz problemy z obsługą błędów i wyjątków. Świat IT się zmienia – dziś powszechnie korzystamy z kontenerów, chmury, API (API Security) i szybkich cykli DevOps, co stwarza nowe wektory ataku. OWASP Top 10 pomaga nadążyć za tymi zmianami.

Techniczne konsekwencje zignorowania tych zagrożeń są poważne. Przykładowo brak kontroli dostępu może pozwolić atakującemu przejąć cudze konto lub dane, a atak SQL Injection może odsłonić całą bazę danych aplikacji. Błędy w konfiguracji (np. pozostawienie domyślnych haseł) ułatwiają włamania, a dziura w popularnej bibliotece (łańcuch dostaw) może posłużyć do masowego ataku na tysiące firm jednocześnie. Dla ilustracji, w słynnym ataku na SolarWinds złośliwa aktualizacja systemu trafiła do ~18 000 organizacji – właśnie dlatego bezpieczeństwo łańcucha dostaw jest w tej chwili na celowniku. Zaniedbanie mechanizmów logowania i alertów powoduje, iż incydenty mogą pozostać niewykryte przez długi czas, co zwiększa szkody. Innymi słowy: każdy z Top 10 to potencjalny scenariusz poważnego incydentu, od wycieku danych osobowych po całkowity kompromis systemu.

Jak się chronić? Poznanie OWASP Top 10 to pierwszy krok, by takim incydentom zapobiegać. Organizacje powinny wdrażać bezpieczeństwo już na etapie projektowania (secure by design), stale edukować programistów w zakresie bezpiecznego kodowania oraz przeprowadzać regularne testy bezpieczeństwa (pentesty, audyty) ukierunkowane na te najczęstsze ryzyka. W praktyce przydatne są listy kontrolne – takie jak poniższa checklista OWASP – które umożliwiają systematyczną weryfikację aplikacji pod kątem podatności. Stosując podstawowe zasady (np. zasada najmniejszych uprawnień, walidacja danych wejściowych, aktualizacja bibliotek, monitorowanie logów), można znacząco zmniejszyć powierzchnię ataku. Krótko mówiąc, OWASP Top 10 ma znaczenie, bo wskazuje gdzie najczęściej “boli” bezpieczeństwo aplikacji i jak temu zaradzić – a ignorowanie tych wskazówek to proszenie się o kłopoty.

OWASP Top 10 2025 – lista najważniejszych zagrożeń

Poniżej przedstawiamy listę kategorii OWASP Top 10:2025 wraz z omówieniem. Każda kategoria obejmuje grupę pokrewnych podatności (mapowanych do CWEs) i odpowiada pewnej klasie zagrożeń w aplikacjach webowych. W nawiasach podano polskie tłumaczenia nazw kategorii.

A01:2025 – Broken Access Control (błędy w kontroli dostępu)

Broken Access Control przez cały czas zajmuje 1. miejsce jako najpoważniejsze ryzyko. Obejmuje wszystkie przypadki, gdy aplikacja nieprawidłowo egzekwuje polityki dostępu – użytkownicy mogą uzyskać dostęp do funkcji lub danych, do których nie powinni mieć dostępu. Przykłady to brak weryfikacji uprawnień przy odwołaniu do obiektu (IDOR, ang. Insecure Direct Object Reference), możliwość modyfikacji parametrów w URL, brak kontroli dostępu do API administacyjnego itp. W praktyce takie błędy prowadzą do przejęcia cudzych danych lub kont.

Przykład: jeżeli API nie sprawdza, czy dany użytkownik ma prawa do zasobu, można odczytać cudze dane, podając w zapytaniu cudzy identyfikator (tzw. horizontal privilege escalation)

OWASP Top 10 2025 wskazuje, iż średnio 3,73% przebadanych aplikacji miało co najmniej jedną podatność z tej kategorii – to dużo, biorąc pod uwagę krytyczny charakter tych błędów. W nowej edycji SSRF (Server-Side Request Forgery) – atak polegający na wysyłaniu zapytań przez serwer do wewnętrznych usług – został włączony w tę kategorię (wcześniej SSRF stanowił osobną kategorię w 2021).

Konsekwencje: Broken Access Control często skutkuje eskalacją uprawnień lub kradzieżą wrażliwych danych, dlatego priorytetem jest implementacja ścisłych mechanizmów kontroli dostępu (np. weryfikacja uprawnień na każdym żądaniu do chronionego zasobu).

A02:2025 – Security Misconfiguration (błędy w konfiguracji bezpieczeństwa)

Security Misconfiguration awansowała z 5. (w 2021) na 2. miejsce w 2025. To bardzo szeroka kategoria obejmująca wszelkie nieprawidłowe konfiguracje systemów, aplikacji, serwerów czy usług, które osłabiają bezpieczeństwo. Według danych OWASP każda przebadana aplikacja miała przynajmniej jedną wadę konfiguracji – trudno się dziwić, bo współczesne systemy (szczególnie w chmurze) bywają niezwykle złożone. Przykładowe błędy konfiguracyjne to m.in.:

  • Pozostawienie testowych lub przykładowych aplikacji na serwerze produkcyjnym
  • Korzystanie z domyślnych kont/adminów i haseł (nawet w 2025 ciągle spotykane)
  • Wyświetlanie zbyt szczegółowych komunikatów błędów (ujawniających np. strukturę systemu, wersje, stack trace)
  • Brak ważnych nagłówków bezpieczeństwa HTTP (np. Strict-Transport-Security, Content Security Policy)
  • Niewłaściwe konfiguracje usług chmurowych, np. zasobów S3 z publicznym zapisem/odczytem dla wszystkich użytkownika

Takie luki konfiguracyjne często bywają banalne do wykorzystania – atakujący może np. zalogować się znanym domyślnym hasłem, odnaleźć ukryty panel testowy, albo wywołać błąd aplikacji i uzyskać cenne informacje o środowisku. W erze automatyzacji DevOps należy szczególnie uważać na skrypty i szablony IaC (Infrastructure as Code), by nie wprowadzały niebezpiecznych domyślnych ustawień.

Rekomendacja: stosuj zasadę secure defaults – domyślnie wszystko zablokowane, dostęp tylko explicite; usuwaj zbędne funkcje/usługi, a konfiguracje regularnie przeglądaj i testuj pod kątem bezpieczeństwa.

A03:2025 – Software Supply Chain Failures (błędy w łańcuchu dostaw oprogramowania) – NOWOŚĆ

Nowa kategoria w Top 10 2025, Software Supply Chain Failures, zajmuje 3. miejsce i jest rozwinięciem dawnej kategorii “Vulnerable and Outdated Components”. Obejmuje szerszy zakres problemów związanych z bezpieczeństwem ekosystemu zależności i procesu wytwarzania oprogramowania. Chodzi m.in. o podatne lub nieaktualne biblioteki i moduły, ale też o ataki na repozytoria, kompilacje, CI/CD, menedżery pakietów itp.. Skala problemu jest ogromna – według OWASP społeczność jednogłośnie uznała supply chain za topowe zagrożenie (100% uczestników ankiety umieściło je w Top 3, a połowa na 1. miejscu). Głośne incydenty z ostatnich lat w pełni to uzasadniają: np. włamanie do łańcucha dostaw SolarWinds (złośliwa aktualizacja oprogramowania, która dotknęła tysiące organizacji) czy ataki przez podatne biblioteki jak Log4Shell (dziura w popularnym komponencie logowania, która umożliwiła zdalne wykonanie kodu w niezliczonych aplikacjach).

Co ważne, tego typu podatności są trudniejsze do wykrycia automatycznie – często narzędzia skanujące nie obejmują np. zaufanych zależności albo ingerencji w proces buildowania. Niemniej jednak skutki zaniedbań mogą być katastrofalne: atakujący, znajdując furtkę w jednym komponencie, może kompromitować setki aplikacji jednocześnie.

Przykład: w 2021 wykryto szereg ataków typu dependency confusion, gdzie podszywano się pod wewnętrzne pakiety firm, publikując złośliwe biblioteki o tych samych nazwach w publicznych repozytoriach – gdy programiści pobrali je przypadkiem, atakujący uzyskiwał dostęp do infrastruktury.

Wniosek: bezpieczeństwo aplikacji to nie tylko własny kod, ale cały łańcuch dostaw. Należy używać aktualnych, zaufanych bibliotek, monitorować ogłoszenia o CVE, wdrożyć narzędzia SCA (Software Composition Analysis) i weryfikować integralność komponentów (np. podpisy cyfrowe pakietów).

A04:2025 – Cryptographic Failures (błędy kryptograficzne)

Cryptographic Failures spadły z 2. na 4. miejsce rankingu, ale wciąż stanowią niezwykle krytyczne zagrożenie. W tej kategorii mieszczą się wszelkie błędy w implementacji kryptografii i ochrony danych – od stosowania słabych algorytmów (np. przestarzałych funkcji hashujących MD5/SHA-1, niezalecanych trybów szyfrowania RSA PKCS#1 v1.5) po niewłaściwe zarządzanie kluczami czy brak szyfrowania tam, gdzie to konieczne. Częstym błędem jest np. brak szyfrowania danych wrażliwych “w spoczynku” (na dysku, w bazie) lub w tranzycie (transmisja bez SSL/TLS). Konsekwencją może być ujawnienie poufnych informacji – atakujący pozyskuje dane w postaci jawnej albo łamie słabe szyfry.

Według OWASP ~3,8% aplikacji ma przynajmniej jedną podatność kryptograficzną, co często prowadzi do ekspozycji danych lub kompromitacji systemu.

Przykład: o ile aplikacja używa domyślnego klucza szyfrującego JWT albo słabego algorytmu, napastnik może sfałszować token uwierzytelniający i uzyskać dostęp (to już aspekt JWT i uwierzytelniania, o czym za chwilę).

Zalecenia: zawsze używaj sprawdzonych, silnych algorytmów i protokołów (np. AES-256, TLS 1.3), eliminuj przestarzałe mechanizmy, używaj salt/hashing dla haseł, a klucze trzymaj bezpiecznie (w HSM lub przynajmniej dobrze zabezpieczonych magazynach, nie w kodzie).

A05:2025 – Injection (atak typu „wstrzyknięcie” kodu)

Injection spadło z 3. na 5. miejsce, ale przez cały czas jest jedną z najbardziej znanych kategorii (i jedną z najczęściej testowanych). Obejmuje całą gamę ataków polegających na wstrzyknięciu niepożądanego kodu lub poleceń do aplikacji. Klasyczne przykłady to SQL Injection, Cross-Site Scripting (XSS), LDAP Injection, OS Command Injection i inne. Injection to bardzo powszechna podatność – testy bezpieczeństwa pokazują ogromną liczbę wariantów (OWASP przypisał do niej aż 38 CWEs). Charakterystyczne jest to, iż niektóre iniekcje występują często, ale są mniej groźne (np. XSS – wysokie ryzyko nadużyć, ale zwykle nie krytyczne), podczas gdy inne są rzadsze, ale druzgoczące (np. SQL Injection – rzadziej spotykane, ale jak już są, to mogą dać pełen dostęp do bazy).

Injection wynika zwykle z braku walidacji lub oczyszczenia danych wejściowych. Gdy aplikacja ślepo włącza dane od użytkownika do zapytań (SQL, OS, XML, itp.), atakujący może wstrzyknąć własną składnię i zmienić logikę zapytania.

Przykład podatnego kodu: tworzenie zapytania SQL z użyciem danych użytkownika bez ich oczyszczenia:

// Niebezpieczny przykład (podatny na SQL Injection): $user = $_GET['username']; $query = "SELECT * FROM users WHERE username = '$user'"; mysqli_query($conn, $query);

Jeśli ktoś w parametrze username poda wartość admin' OR '1'='1, to zapytanie SQL stanie się logicznie zawsze prawdziwe (pomijając uwierzytelnienie). Skutki: od wycieku lub modyfikacji danych, poprzez ominięcie zabezpieczeń (np. zalogowanie bez hasła), aż po zdalne wykonanie kodu na serwerze w ekstremalnych przypadkach.

Jak się bronić? Należy walidować i filtrować wszystkie dane wejściowe, używać bezpiecznych API (np. prepared statements z parametrami zamiast składania ciągów SQL), enkodować dane wyjściowe adekwatnie do kontekstu (np. escapowanie znaków w HTML, by zapobiec XSS), a także stosować whitelisty dozwolonych wartości tam, gdzie to możliwe.

A06:2025 – Insecure Design (niebezpieczne projektowanie systemu)

Insecure Design spadło z 4. na 6. miejsce. Jest to kategoria wprowadzona w 2021 roku, kładąca nacisk na braki w zabezpieczeniach już na etapie projektowania aplikacji. Obejmuje sytuacje, gdzie system nie uwzględnia zasad bezpieczeństwa w architekturze i logice działania.

Przykłady: brak uwzględnienia modelowania zagrożeń podczas projektowania modułu, nieuwzględnienie ograniczeń częstotliwości (brak rate limiting, co pozwala na DoS/bruteforce), projektowanie mechanizmu bez uwierzytelniania tam, gdzie powinno być (bo “nie przewidziano takiego scenariusza”). W odróżnieniu od innych kategorii, Insecure Design to bardziej procesowe/architektoniczne niedociągnięcia niż konkretne błędy w kodzie.

Dobra wiadomość: od 2021 zauważono poprawę w branży – coraz częściej stosuje się threat modeling i myśli o bezpieczeństwie z góry. Niemniej kategoria pozostaje istotna.

Praktyka: Zanim napiszesz kod, zapytaj “jak może to zostać zaatakowane?”. Wdrażaj zasady bezpieczeństwa od podstaw: np. zasada najmniejszego uprzywilejowania (każdy komponent ma tylko tyle dostępu, ile potrzebuje), separacja obowiązków, obrona warstwowa (defense-in-depth). Dokument OWASP Top 10 rekomenduje budowanie świadomości zagrożeń wśród architektów i developerów, tak by typowe problemy (np. brak walidacji, brak logowania zdarzeń, brak obsługi wyjątków) były wyłapywane na etapie planowania funkcjonalności, a nie dopiero podczas testów bezpieczeństwa.

A07:2025 – Authentication Failures (błędy uwierzytelniania)

Authentication Failures pozostają na 7. miejscu (wcześniej nazywane Identification and Authentication Failures, nazwa skrócona dla jasności). Ta kategoria obejmuje wszelkie luki w mechanizmach uwierzytelniania użytkowników i zarządzania sesjami. Typowe problemy to: możliwość zgadywania haseł (brak ograniczeń na login, brak 2FA), przechowywanie haseł w formie niezahashowanej, błędy w implementacji JWT lub innych tokenów (np. brak weryfikacji podpisu tokenu, użycie łatwego do odgadnięcia secret key), przejęcie sesji (np. przez nieoznaczanie ciastek sesyjnych flagą HttpOnly/Secure).

Na szczęście obserwuje się trend pozytywny – rosnące użycie standardowych, sprawdzonych bibliotek i frameworków (OAuth 2.0, OpenID Connect, biblioteki JWT itd.) zmniejsza częstość pojawiania się błędów uwierzytelniania. Mimo to, gdy taki błąd się trafi, zwykle jest krytyczny (może umożliwić zalogowanie się jako inny użytkownik, kradzież konta, eskalację uprawnień w systemie).

Przykład: brak ograniczenia liczby prób logowania pozwala na atak bruteforce; brak wymogu silnego hasła skutkuje tym, iż użytkownicy ustawiają “123456”.

Rekomendacje: stosuj MFA (uwierzytelnianie wieloskładnikowe) tam, gdzie to możliwe, hasła przechowuj zawsze jako skróty z salt (np. bcrypt, scrypt), ustaw wymagania co do złożoności i długości haseł, chroń tokeny sesyjne (np. przed kradzieżą przez JavaScript), implementuj mechanizmy blokady konta po wielu nieudanych próbach. W kontekście JWT, upewnij się iż tokeny są prawidłowo podpisane (i weryfikowane przy każdym użyciu) oraz mają krótką ważność.

A08:2025 – Software or Data Integrity Failures (błędy integralności systemu lub danych)

Ta kategoria (#8) koncentruje się na braku dbałości o integralność kodu i danych w obrębie aplikacji. Chodzi o sytuacje, gdy system nie potrafi utrzymać zaufanych granic, np. pobiera i wykonuje kody/pluginy ze źródeł, którym bezkrytycznie ufa, albo nie weryfikuje integralności ważnych danych. W hierarchii OWASP jest to poziom nieco “niżej” niż błędy łańcucha dostaw – dotyczy raczej wewnętrznych mechanizmów aplikacji (np. aktualizacje modułów, integracja z zewnętrznymi serwisami, mechanizmy auto-update, importy plików konfiguracyjnych).

Przykłady: brak weryfikacji podpisu cyfrowego przy pobieraniu aktualizacji oprogramowania, używanie niezweryfikowanych pluginów, poleganie na niezaufanych źródłach danych przy krytycznych operacjach (np. pobieranie reguł firewall z niezabezpieczonego URL). Również możliwość ingerencji w integralność danych (np. manipulacja plikami konfiguracyjnymi lub parametrami systemu) wchodzi tutaj w grę.

Konsekwencje mogą być poważne – jeżeli atakujący podmieni plik konfiguracyjny lub bibliotekę na zainfekowaną, aplikacja może zostać przejęta od środka. Dlatego ważne jest stosowanie mechanizmów takich jak sumy kontrolne, podpisy, weryfikacja hashy pobieranych plików oraz ochrona wrażliwych zasobów przed modyfikacją.

Przykład praktyczny: przechowujesz konfigurację aplikacji w pliku YAML – upewnij się, iż dostęp do niego jest ograniczony, a wszelkie zmiany są monitorowane (np. narzędziem auditd lub innym systemem IDS). Poniżej przykład konfiguracji narzędzia auditd monitorującego plik konfiguracyjny aplikacji:

# Monitoruj zmiany (write/attrib) pliku config.yml z kluczem 'config_changes' auditctl -w /etc/myapp/config.yml -p wa -k config_changes

Dzięki temu każda zmiana konfiguracji zostanie zalogowana i może wygenerować alert. Podsumowując: upewnij się, iż Twój kod, konfiguracje i wrażliwe dane nie mogą być potajemnie zmodyfikowane – weryfikuj ich integralność i ograniczaj do nich dostęp.

A09:2025 – Logging & Alerting Failures (błędy logowania i alertowania)

Logging & Alerting Failures utrzymują się na 9. miejscu (drobna zmiana nazwy z “Security Logging and Monitoring Failures” – dodano alerty, by podkreślić ich znaczenie). Ta kategoria obejmuje brak lub nieodpowiednie logowanie zdarzeń bezpieczeństwa oraz brak skutecznych alarmów/monitoringu tych logów.

Przykładowo: aplikacja nie loguje nieudanych prób logowania, błędów autoryzacji czy nietypowych zapytań, albo loguje je, ale nikt tych logów nie przegląda i nie ma mechanizmu powiadamiania. OWASP zwraca uwagę, iż samo logowanie bez odpowiedniego alertowania ma ograniczoną wartość – bo co z tego, iż zapiszemy incydent, jeżeli nie zareagujemy w porę.

W praktyce wiele poważnych wycieków danych było możliwych dlatego, iż brakło detekcji – logi istniały, ale nikt ich nie monitorował, albo nie było alertu gdy np. ktoś masowo pobierał dane przez API. Ta kategoria jest zawsze nieco niedoszacowana w statystykach (trudno ją automatycznie testować), ale eksperci zawsze umieszczają ją na liście, bo dobrze wiedzą, iż dobre logi to jedyna szansa by wykryć atak.

Rekomendacje: włącz szczegółowe logowanie kluczowych zdarzeń (logi autoryzacji, operacji na danych, błędów bezpieczeństwa). Skonfiguruj alerty – czy to prosty mechanizm wysyłania e-mail/SMS przy krytycznych zdarzeniach, czy też integracja z systemem SIEM klasy enterprise. Monitoruj np. wielokrotne nieudane logowanie, próby ataków typu injection wykryte w logach, nietypowe skoki w ruchu (potencjalny DoS) itp. Ideałem jest posiadanie centrum monitoringu (SOC) lub choćby automatycznych reguł, które podniosą alarm zanim atak wyrządzi szkody. Pamiętaj też o ochronie samych logów – powinny być przechowywane bezpiecznie, aby atakujący nie mógł ich wyczyścić (co często próbuje się robić po włamaniu).

A10:2025 – Mishandling of Exceptional Conditions (błędna obsługa wyjątków) – NOWOŚĆ

Drugą nowością w Top 10 2025 (po Supply Chain) jest kategoria Mishandling of Exceptional Conditions – czyli wszelkie błędy związane z nieprawidłową obsługą sytuacji wyjątkowych i błędów w systemie. W praktyce chodzi o przypadki, gdy aplikacja nie radzi sobie z nietypowymi warunkami (błędami, wyjątkami, anomaliami) w bezpieczny sposób. Kategoria ta obejmuje m.in.:

  • Ujawnianie w komunikatach błędów wrażliwych informacji (np. pełnych stack trace z nazwami klas i ścieżkami do kodu, wersji komponentów, kluczy API itp.)
  • Słabe alertowanie lub jego brak w sytuacjach wyjątkowych – np. aplikacja doświadcza ataku DoS (wyczerpanie zasobów), ale nie loguje tego zdarzenia ani nie alarmuje administratorów
  • Brak mechanizmów bezpiecznej obsługi błędów i anomalii – np. serwer w razie błędu zwraca użytkownikowi całe zapytanie SQL lub szczegóły wyjątku bazy danych; brak jest też planu obsługi rzadkich zdarzeń (np. przerwy sieci w trakcie transakcji finansowej), co może skutkować nieprzewidzianymi stanami (np. transakcja częściowo zapisana)

Według OWASP jest to całkowicie nowa kategoria, zawierająca 24 CWEs skupione wokół niewłaściwego przetwarzania błędów, “fail-open” i innych sytuacji nietypowych. Termin fail-open oznacza sytuację, gdy system w razie awarii zachowuje się w niebezpieczny domyślny sposób – np. nie mogąc zweryfikować tokenu autoryzacyjnego z powodu będu serwera, dopuści użytkownika zamiast go zablokować. Takie wpadki mają oczywiste konsekwencje – atakujący mogą je celowo wywoływać (np. generować błędy aplikacji) i korzystać z powstałych luk.

Dobre praktyki: aplikacja powinna pokazywać użytkownikom ogólne, przyjazne komunikaty (“Wystąpił błąd, spróbuj ponownie później”) zamiast szczegółów technicznych. Szczegóły (stack trace, komunikaty systemowe) powinny trafić do logów dostępnych tylko uprawnionym osobom. Warto też symulować nietypowe scenariusze (testy chaos engineering / fault injection), by zobaczyć jak system reaguje na przerwy w sieci, brak pamięci, wyjątki itp., i upewnić się, iż zawsze zachowuje bezpieczny stan (np. wycofuje transakcje, zamyka dostęp, oczyszcza poufne dane z pamięci).

Poniżej przykład niepożądanego wycieku informacji w śladzie błędu (stack trace), którego normalny użytkownik nie powinien zobaczyć:

Exception in thread "main" java.lang.NullPointerException at com.example.app.LoginController.authenticate(LoginController.java:45) at com.example.app.LoginController.handleRequest(LoginController.java:20) ...

W powyższym komunikacie ujawniono szczegóły implementacyjne aplikacji (nazwy klas, ścieżki, numery linii), co może pomóc atakującemu w rekonesansie. W środowisku produkcyjnym należy takich informacji unikać.

OWASP Top 10 2025 vs 2021 – co się zmieniło?

Jakie są najważniejsze zmiany między listą Top 10 edycji 2021 a 2025? Poniżej podsumowanie:

  • Nowe kategorie: W 2025 dodano 2 nowe kategorie: A03 – Software Supply Chain Failures oraz A10 – Mishandling of Exceptional Conditions. Dzięki temu zwrócono uwagę na rosnące problemy z łańcuchem dostaw systemu oraz bezpieczną obsługą błędów.
  • Połączenie istniejących kategorii: SSRF (Server-Side Request Forgery), który w OWASP Top 10:2021 stanowił osobną kategorię (A10:2021), został w edycji 2025 wchłonięty przez A01 Broken Access Control. Innymi słowy, ataki SSRF są teraz traktowane jako szczególny przypadek obejścia kontroli dostępu (serwer wykonuje nieautoryzowane żądanie do wewnętrznego zasobu).
  • Zmiany pozycji i nazewnictwa: Kategoria Security Misconfiguration awansowała z #5 (2021) na #2 (2025) – ponieważ błędy konfiguracyjne stały się bardziej powszechne. Injection spadło z #1 (2017) / #3 (2021) na #5 (2025), Cryptographic Failures z #2 na #4, a Insecure Design z #4 na #6 – co wynika z faktu, iż Misconfiguration i Supply Chain zyskały większą wagę, spychając tamte niżej. Identification and Authentication Failures przemianowano na Authentication Failures (pozostając na #7) dla klarowności. Również Security Logging and Monitoring Failures przemianowano na Logging & Alerting Failures (pozostając #9) – by podkreślić aspekt alertów.
  • Rozszerzenie zakresu jednej z kategorii: Dawna kategoria Vulnerable and Outdated Components (A06:2021) została rozszerzona i przemianowana na Software Supply Chain Failures (A03:2025), obejmując nie tylko przestarzałe komponenty, ale cały ekosystem zależności, pipeline’ów i dystrybucji oprogramowania. To odpowiedź na trendy – coraz częściej ataki nie polegają na jednej znanej podatości, ale na kombinacji luk w różnych ogniwach łańcucha dostaw.

Podsumowując, OWASP Top 10:2025 kładzie większy nacisk na konfigurację i komponenty zewnętrzne, przez cały czas uwzględnia klasykę (injection, auth, crypto, logging) i dodaje nowe spojrzenie na błędy obsługi wyjątków. Zmiany te odzwierciedlają zarówno dane zebrane o rzeczywistych incydentach, jak i opinie ekspertów przewidujące przyszłe zagrożenia (OWASP uwzględnia ankiety społeczności, aby wychwycić ryzyka, które nie są jeszcze masowo raportowane, ale budzą obawy na “pierwszej linii” bezpieczeństwa).

Checklista bezpieczeństwa aplikacji (zgodna z OWASP Top 10)

Znajomość zagrożeń to jedno, a praktyka – drugie. Poniżej prezentujemy techniczną checklistę kontrolną inspirowaną OWASP Top 10, która pomoże zabezpieczyć aplikację webową. Wykorzystaj ją jako punkt wyjścia do audytu bezpieczeństwa swojej aplikacji:

  1. Kontrola dostępu: Sprawdź mechanizmy autoryzacji we wszystkich punktach dostępu. Upewnij się, iż każda akcja wymagająca uprawnień faktycznie je weryfikuje (także w API). Stosuj zasadę najmniejszych uprawnień – nadaj użytkownikom i usługom minimum praw niezbędnych do działania, nic ponadto. Przetestuj scenariusze typu IDOR (czy użytkownik A może uzyskać dostęp do danych użytkownika B?).
  2. Bezpieczna konfiguracja: Przejdź przez konfiguracje serwerów, usług i aplikacji. Wyłącz lub usuń zbędne funkcje, zmień domyślne loginy i hasła, utwardź ustawienia (hardening). Sprawdź, czy aplikacja nie ujawnia szczegółów o środowisku (bannery serwera, stack trace w odpowiedziach). Upewnij się, iż włączone są nagłówki bezpieczeństwa (CSP, HSTS, X-Frame-Options itp.). Dobrym pomysłem jest użycie skanerów konfiguracji lub benchmarków (np. CIS Benchmarks) dopasowanych do Twojej stacku technologicznego.
  3. Bezpieczny łańcuch dostaw: Zarządzaj zależnościami i komponentami open-source. Aktualizuj na bieżąco biblioteki do najnowszych bezpiecznych wersji. Włącz narzędzia SCA (Software Composition Analysis) w proces CI, aby wykrywały znane podatności w zależnościach. Pobieraj pakiety z zaufanych źródeł; rozważ stosowanie mechanizmów jak lockfile czy mirror repozytoriów, aby zapobiec atakom typu typosquatting. Monitoruj też wiadomości o nowych podatnościach (CVE) dla używanych komponentów.
  4. Kryptografia: Zweryfikuj, iż wszędzie tam, gdzie przetwarzane są dane wrażliwe, używasz silnej kryptografii. Wymuś TLS (HTTPS) dla komunikacji (sprawdź certyfikaty, konfigurację SSL – wyłącz stare protokoły TLS 1.0/1.1). Sprawdź algorytmy: czy nie używasz przestarzałych funkcji hashujących (MD5, SHA-1) lub szyfrów (DES, RC4)? jeżeli przechowujesz hasła – czy są zahashowane z unikatową solą (np. bcrypt, Argon2)? Upewnij się, iż klucze kryptograficzne są bezpiecznie wygenerowane i przechowywane (np. w plikach konfiguracyjnych poza repozytorium kodu, najlepiej w menedżerach typu Vault).
  5. Walidacja danych (Injection): Przyjmuj zasadę “zero zaufania” do danych wejściowych. Waliduj format, długość, zakres wartości każdej danej od użytkownika (w tym danych z API, plików, nagłówków żądań). Używaj sprawdzonych bibliotek do sanitizacji inputu i escaping outputu (np. OWASP ESAPI, gotowe funkcje ORM). W kontekście baz danych zawsze korzystaj z mechanizmów parametryzowanych zapytań (Prepared Statements) lub ORM, zamiast sklejania stringów SQL manualnie. Dla dynamiki JavaScript rozważ użycie bibliotek sanitizujących przy wstawianiu danych do DOM (to chroni przed XSS). Pamiętaj o mniej oczywistych wektorach iniekcji, jak np. LDAP, OS shell, czy NoSQL – wszędzie tam obowiązuje podobna zasada: weryfikuj i oczyszczaj dane zanim użyjesz ich w krytycznym kontekście.
  6. Bezpieczne projektowanie: Zintegruj bezpieczeństwo w cyklu życia oprogramowania. Już na etapie wymagań/projektu korzystaj z threat modeling – identyfikuj potencjalne punkty ataku i planuj kontrole bezpieczeństwa. Stosuj wzorce projektowe zwiększające bezpieczeństwo (np. centralizacja kontroli autentykacji, walidacja danych na poziomie modelu). Dokumentuj decyzje projektowe pod kątem bezpieczeństwa. Wprowadź code review ze szczególnym naciskiem na aspekty OWASP Top 10 – niech inny programista oceni, czy nie pominięto zabezpieczeń w nowej funkcji. Projektuj aplikację tak, by błędy pojedynczego modułu nie kompromitowały całości (izolacja komponentów, ograniczone zaufanie między modułami).
  7. Uwierzytelnianie i sesje: Przeprowadź przegląd mechanizmów logowania, rejestracji, zarządzania hasłami i sesjami. Wymuś silne hasła i rozważ dodanie uwierzytelniania dwuskładnikowego (MFA) dla wrażliwych kont. Sprawdź politykę sesji – czy tokeny sesyjne/JWT mają prawidłowo ustawiony czas ważności, czy są unieważniane po wylogowaniu? Zaimplementuj ochronę przed atakami bruteforce (ograniczenie prób, CAPTCHA po kilku nieudanych logowaniach). Hasła w bazie danych powinny być tylko haszami (z bezpieczną solą) – upewnij się, iż tak jest. Dodatkowo, przejrzyj konfigurację zarządzania tokenami JWT (jeśli używane): czy algorytm podpisu jest bezpieczny (np. HS256/RSA256 zamiast “none”), czy aplikacja weryfikuje podpis każdego tokenu i nie akceptuje przeterminowanych? Czy klucz/sekret do podpisywania JWT jest dobrze chroniony? Te elementy są krytyczne, bo błąd w uwierzytelnianiu często oznacza natychmiastowe przejęcie kont przez atakującego.
  8. Integralność systemu: Chroń się przed nieautoryzowanymi zmianami w kodzie i danych. Wdraż ciągłą integrację (CI) z kontrolą integralności – np. używaj podpisów cyfrowych do weryfikacji pakietów/aktualizacji, włącz sumy SHA256 do sprawdzania pobieranych plików. Ogranicz dostęp do kluczowych plików konfiguracyjnych – tylko dla niezbędnych procesów i administratorów. Rozważ zastosowanie systemów wykrywania ingerencji (IDS), które monitorują pliki i konfiguracje. Na systemach Linux pomocne jest narzędzie auditd – potrafi logować każdą zmianę wybranych plików lub katalogów (np. konfiguracji aplikacji). Ustaw reguły monitorujące krytyczne zasoby i generujące alarm, jeżeli zostaną zmodyfikowane (patrz przykład polecenia auditctl powyżej). Dzięki temu gwałtownie wykryjesz np. podmianę pliku .jar aplikacji na zainfekowany.
  9. Logowanie i alerty: Przeanalizuj, jakie zdarzenia bezpieczeństwa loguje Twoja aplikacja i infrastruktura. Upewnij się, iż logowane są próby nieautoryzowanego dostępu, ważne akcje (zmiana hasła, operacje admina), błędy systemowe, wyjątki itp. Następnie zadbaj o alertowanie – same logi to za mało, ktoś musi zauważyć incydent! Skonfiguruj narzędzia monitorujące logi lub reguły w systemie SIEM, by powiadamiały o podejrzanych zdarzeniach (np. 10 nieudanych logowań z rzędu, nagły skok obciążenia CPU, próba SQL Injection znaleziona w logu serwera web). Regularnie testuj, czy alerty rzeczywiście się uruchamiają i czy zespół wie, jak na nie reagować. Nie zapomnij również o rotacji i bezpiecznym przechowywaniu logów – powinny być archiwizowane i odporne na manipulacje.
  10. Obsługa błędów i wyjątków: Sprawdź, jak aplikacja reaguje na nieoczekiwane sytuacje (błędy systemu, wyjątki w kodzie, brak zależnego serwisu, timeouty). Ustandaryzuj komunikaty błędów – użytkownik ma dostać prostą informację bez szczegółów technicznych. Wszystkie szczegóły zapisuj w logach (z odpowiednim poziomem, np. ERROR/DEBUG), ale nie wystawiaj na zewnątrz. Upewnij się, iż żadne tajemnice (hasła, klucze, tokeny) nie wyciekną w wyjątku lub logu – anonimizuj/pomijaj wrażliwe dane przy logowaniu. Przeprowadź testy, które zasymulują różne awarie (np. odcięcie bazy danych w trakcie transakcji, brak pamięci, przepełnienie dysku z logami) i zobacz, czy system zamyka się w bezpieczny sposób. W razie krytycznego błędu lepiej, by aplikacja przerwała operację (fail-safe) niż np. dopuściła transakcję finansową bez pełnej weryfikacji (fail-open). Przygotuj również procedury disaster recovery – kopie zapasowe danych, mechanizmy retry dla operacji idempotentnych – tak by wyjątki nie powodowały utraty integralności danych.

Co dalej? Wdrażaj bezpieczeństwo już dziś!

Powyższe zalecenia mogą wydawać się obszerne, ale od nich zależy bezpieczeństwo Twojej aplikacji. Na koniec – kilka praktycznych kroków typu CTA (Call To Action), które możesz podjąć już teraz:

  • Sprawdź logi swojej aplikacji pod kątem podejrzanych aktywności – czy nie ma tam oznak ataków lub błędów, które przeoczyłeś?
  • Zastosuj zasadę najmniejszych uprawnień – zweryfikuj konta, role i uprawnienia w systemie, ogranicz te nadmierne. Upewnij się, iż każdy komponent ma tylko minimalny dostęp.
  • Przeprowadź mini-audyt według powyższej checklisty – wybierz jeden obszar (np. konfiguracja, uwierzytelnianie) i przejdź przez punkty, poprawiając co trzeba. Następnie systematycznie przejdź do kolejnych punktów listy.

Pamiętaj: bezpieczeństwo to proces ciągły. OWASP Top 10 jest świetnym przewodnikiem dla Twojego API Security i ogólnej ochrony aplikacji – traktuj go jak żywą listę sprawdzającą. Regularnie sprawdzaj nowe edycje i aktualizacje OWASP, ponieważ krajobraz zagrożeń stale się zmienia. Stosując się do powyższych porad, wykonujesz duży krok w stronę zabezpieczenia swojej aplikacji przed najczęstszymi atakami. Powodzenia w bezpiecznym kodowaniu!

Podsumowanie

OWASP Top 10:2025 to nie jest teoria do odhaczenia na egzaminie, tylko bardzo praktyczna mapa miejsc, w których aplikacje najczęściej “puszczają się w szwach”. Z jednej strony mamy klasyki jak injection, błędy uwierzytelniania czy kryptografia, z drugiej – coraz mocniej liczą się bezpieczeństwo łańcucha dostaw, konfiguracja i to, co dzieje się z aplikacją w sytuacjach wyjątkowych. jeżeli potraktujesz tę listę jako żywą checklistę, a nie jako plakat na ścianie, zaczniesz świadomie projektować funkcje, walidować dane, porządkować uprawnienia, pilnować zależności, logów i błędów. W efekcie zmniejszasz szansę na spektakularny wyciek, a zwiększasz szansę, iż potencjalny atak skończy się na kilku nieudanych próbach zapisanych w logach. To dobry moment, żeby przejrzeć swoją aplikację pod kątem każdej z kategorii OWASP i zaplanować konkretne działania – krok po kroku, moduł po module.

Newsletter – Zero Spamu

Dołącz by otrzymać aktualizacje bloga, akademii oraz ukryte materiały, zniżki i dodatkową wartość.

Wyrażam zgodę na przetwarzanie moich danych osobowych w celu otrzymywania newslettera od Security Bez Tabu zgodnie z Polityce Prywatności.

Zapisz Loading…

Dzięki!

Dzięki za dołączenie do newslettera Security Bez Tabu.

Wkrótce otrzymasz aktualizacje z bloga, materiały zza kulis i zniżki na szkolenia.

Jeśli nie widzisz wiadomości – sprawdź folder Spam lub Oferty.

Biubliografia

Idź do oryginalnego materiału