Ataki brute force¶
Atak typu brute force polega na systematycznym sprawdzaniu kolejnych możliwych wartości danych uwierzytelniających, aż do znalezienia poprawnej. Przeprowadzenie ataku nie wymaga znalezienia żadnego błędu w aplikacji, a jedynie odpowiednio dużej liczby prób.
Wyobraźmy sobie aplikację, która prosi użytkownika o czterocyfrowy kod PIN i zwraca informację o tym, czy jest on poprawny. Możliwych wartości jest dziesięć tysięcy. Atakujący sprawdza je po kolei, aż trafi na właściwą:
0000
0001
0002
...
9999
Tak samo można zgadywać hasła, tokeny i kody jednorazowe.
W praktyce atak brute force jest realizowany w sposób zautomatyzowany przy użyciu narzędzi lub skryptów. Próby mogą być wykonywane szybko albo celowo rozłożone w czasie i prowadzone z wielu adresów IP w celu uniknięcia wykrycia.
Ataki lokalne
Brute force bywa prowadzony również na skrótach haseł pozyskanych z bazy danych. Atakujący nie wysyła wtedy do systemu żadnych żądań, więc limity prób nie mają znaczenia, a odporność zależy od tego, jakim algorytmem hasła zostały zabezpieczone. Opisano to w osobnym artykule: Przechowywanie haseł.
Skutki udanego ataku¶
Skuteczny atak brute force może prowadzić do:
- przejęcia konta użytkownika i wykonywania operacji w jego imieniu,
- odczytu, modyfikacji, usunięcia lub eksportu danych dostępnych dla przejętego konta,
- przejęcia konta administracyjnego i uzyskania pełnej kontroli nad systemem,
- wykorzystania przejętego konta do uzyskania dostępu do kolejnych systemów organizacji,
- utrzymania dostępu przez atakującego również po zmianie hasła, jeżeli zdążył utworzyć własne konto, klucz lub token.
Możliwe problemy¶
Brak limitów poza formularzem logowania¶
Tymi samymi danymi można zwykle zalogować się w kilku miejscach. Oprócz głównego formularza logowania takimi miejscami bywają API, panel administracyjny albo usługi sieciowe takie jak SSH, RDP czy FTP. Limit wdrożony w jednym z tych miejsc nie chroni pozostałych, a atakujący wybierze tę drogę, której nikt nie ograniczył.
Limity oparte na adresie IP¶
Dla atakującego adres IP jest zasobem tanim i wymiennym. Do dyspozycji ma sieci proxy, serwery w chmurze i botnety, a przy IPv6 cały prefiks przydzielony przez operatora. Typowy prefiks /64 obejmuje 2^64 adresów IPv6, więc próby można rozłożyć tak, aby nie przekroczyć nawet najbardziej rygorystycznych limitów.
Jednocześnie wielu użytkowników współdzieli jeden adres, na przykład w sieciach firmowych za NAT lub u operatorów komórkowych stosujących CGNAT. Blokada takiego adresu odcina od usługi osoby niezwiązane z atakiem.
Trwała blokada konta¶
Blokada konta po kilku nieudanych próbach jest prostym i skutecznym sposobem na zatrzymanie ataku. Pozwala jednak celowo odciąć od usługi dowolnego użytkownika. Wystarczy do tego znajomość loginu, którym często jest adres e-mail. Blokadę może nieświadomie wywołać też sam użytkownik. Wystarczy, że zmieni hasło, a telefon albo klient poczty dalej będzie próbował logować się poprzednim, wyczerpując limit prób.
Zbyt krótkie i przewidywalne tokeny¶
Odporność tokenu zależy od tego, ile ma możliwych wartości i czy da się je przewidzieć. Sześciocyfrowy kod to tylko milion kombinacji. Z kolei wartości tworzone ze znacznika czasu lub kolejnego numeru są łatwe do przewidzenia. Przy ciasteczkach sesyjnych oraz tokenach i kluczach API limitów zwykle się nie stosuje. Nie ma takiej potrzeby, o ile wartość jest dostatecznie długa i losowa. Bezpieczeństwo wynika wtedy z dużej liczby możliwych kombinacji i ich nieprzewidywalności, a nie z limitu prób.
Rekomendacje¶
Aby utrudnić atak brute force, należy:
-
Ograniczać częstotliwość prób uwierzytelnienia, licząc je jednocześnie dla konta i dla źródła żądania,
-
Po przekroczeniu limitu stosować narastające opóźnienia, blokadę czasową, dodatkową weryfikację albo CAPTCHA,
-
Egzekwować limity po stronie serwera, spójnie we wszystkich instancjach aplikacji oraz we wszystkich miejscach prowadzących do tego samego uwierzytelnienia, w tym w API, panelach administracyjnych i usługach sieciowych,
-
Stosować limity na wszystkich etapach uwierzytelniania, czyli przy resetowaniu hasła oraz weryfikacji kodów MFA,
-
Nie opierać limitów wyłącznie na adresie IP,
-
Wdrożyć uwierzytelnianie wieloskładnikowe przynajmniej dla kont administracyjnych i kont o podwyższonych uprawnieniach,
-
Wymagać odpowiednio długich haseł oraz blokować hasła powszechnie używane i ujawnione w wyciekach, zgodnie z zasadami opisanymi w artykule Polityka haseł,
-
Generować ciasteczka sesyjne, tokeny resetowania hasła i klucze API kryptograficznie bezpiecznym generatorem liczb losowych, o długości uniemożliwiającej ich zgadywanie,
-
Monitorować nieudane próby uwierzytelnienia z uwzględnieniem konta, źródła żądania, urządzenia oraz czasu i charakteru aktywności, tak aby wykrywać również próby rozłożone w czasie i prowadzone z wielu adresów.