[PL] Czy moje hasło jest bezpieczne? Jak działa serwis have I been pwned?

Homepage:

https://youtu.be/ZTGqOoM9XM0

Description:

Wprowadzenie

Średnio raz na parę miesięcy Internet obiega informacja o kolejnym wycieku danych z różnego rodzaju serwisów. Raz są tą same emaile, raz email razem z hasłami przechowywanymi w postaci hasza. Zdarzają się również wycieki z miejsc, w których nasze hasło zapisane było w czystej postaci - bez żadnego szyfrowania i haszowania. Media szybko podchwytują dany temat i budują swego rodzaju panikę w oparciu o takie zdarzenia. To sprawia, że coraz więcej osób zadaje sobie pytanie: “czy ja również padłem ofiarą danego zdarzenia”? W jaki sposób mogę sprawdzić czy moje hasło jest bezpieczne? Na te i inne pytania postaram się odpowiedzieć w dzisiejszym odcinku, tłumacząc zasadę działania serwisu have i been pwned prowadzonego przez Troya Hunta, który pozwala na sprawdzenie - czy nasze hasło jest bezpieczne.

Ja jestem Kacper Szurek a to kolejny odcinek podcastu Szurkogadanie, w którym tłumacze kwestie powiązane z bezpieczeństwem komputerowym. Jeżeli materiały tego rodzaju Ci się podobają zapraszam do dołączenia do grupy od 0 do pentestera na Facebooku. Podcast ten można również znaleźć na Spotify oraz Google i Apple Podcasts oraz Anchor.

Cały materiał podzielony jest na kilka części. Na początku wytłumaczę idee całego problemu a także jakie mamy możliwości. Zacznę od tych najprostszych tłumacząc równocześnie ich plusy i minusy.

Załóżmy, że właśnie dowiedziałeś się o dużym wycieku danych i chciałbyś sprawdzić czy któreś z twoich haseł znajduje się w ogólno dostępnej bazie. Jakie masz możliwości?

Pierwsza to odnalezienie linków do takiej bazy i ściągnięcie jej na własny komputer. Potem trzeba ją rozpakować oraz w jakiś sposób przeszukać taką bazę. Tylko że wycieki stają się coraz większe. Zazwyczaj jest to kilkanaście gigabajtów czyli rozmiar porównywalny ze średniej wielkości grą komputerową. Nie każdy posiada odpowiednie łącze i odpowiednio duży dysk twardy aby ściągać tego rodzaju pliki. Dodatkowo nie każdy posiada techniczną wiedzę, aby je przeszukać. Wypadało by bowiem abyśmy wiedzieli i rozumieli co to jest hash i jak go wyliczyć. Dane mogą również być słabo uporządkowane, rozdzielone na wiele plików. Co więcej w jakiś sposób musimy odnaleźć linki do tych baz - a to nie jest takie proste. Pozostają jeszcze kwestie prawne. Czy ściągnięcie takich danych jest legalne? Wszak pozyskujemy dostęp do czegoś co nie należy do nas.

Plusy rozwiązania? Hasła sprawdzamy na swoim komputerze więc nikt oprócz nas nie wie jakiego hasła wyszukiwaliśmy. No ale umówmy się ściąganie całej bazy tylko po to aby sprawdzić kilka haseł wygląda jak atakowanie komara z armaty. Pora na omówienie alternatywnych opcji. Ta najprostsza to skorzystanie z zewnętrznych serwisów, które za nas pobrały wszystkie dane, odpowiednio jest przeprocesowały i dodały do swojej bazy. Wystarczy podać nasze hasło w formularzu na takiej stronie - a serwer zwróci informacje czy posiada takowe hasło w swojej bazie.

Ale tutaj pojawia się problem. Wszak wysyłamy nasze hasło, które najpewniej chroni nasze konto bankowe czy też pocztę, do zewnętrznego serwisu. Nie mamy pewności czy osoba, która tworzy dany serwis ma dobre zamiary. Może przecież zapisywać wszystkie hasła, które zostały przesłane do takiego serwisu a następnie próbować wykorzystywać je do innych ataków.

Sami chroniąc się przed atakiem tak naprawdę możemy ułatwić komuś pracę. Przesyłanie hasła w plaintexie - czyli w czystej formie, bez żadnego szyfrowania i haszowania nie jest zatem najlepszym pomysłem. Dlatego powstały inne serwisy - gdzie hasło przesyłane jest do nich w postaci jakiego hasza.

Za Wikipedią: funkcja haszująca to funkcja przyporządkowująca dowolnie dużej liczbie krótką, zawsze posiadającą stały rozmiar quasi-losową wartość, tzw. skrót nieodwracalny. Tłumacząc to na coś bardziej zrozumiałego, jest to taka funkcja, która z dowolnego ciągu znaków tworzy inny ciąg o stałej długości. Co więcej ta operacja jest nieodwracalna - to znaczy, że z stworzonego w taki sposób hasza nie da się otrzymać pierwotnej wartości, która posłużyła do jego stworzenia. Jedynym sposobem jest tak zwany atak brute force - kiedy to wszystkie możliwe kombinacje wprowadzamy do wejścia takiej funkcji i sprawdzamy czy jej wyjście jest taką liczbą, której poszukujemy.

I właśnie to jest mankamentem tego rozwiązania. Tym razem twórca witryny nie otrzymuje bezpośrednio naszego hasła - w czystej postaci więc nie może go od razu użyć w formularza na stronie banku. Ale otrzymuje hasz naszego hasła. Tylko że posiadając dużą liczbę haseł które wyciekły, może dla każdego z nich wyliczyć odpowiedni skrót i porównać z wartością przesyłaną przez nas.

W ten sposób może dowiedzieć się jakie jest nasze hasło, nawet pomimo tego iż użyliśmy funkcji haszującej. Jedyny moment w którym nie jest w stanie dowiedzieć się jakie jest nasze hasło, ma miejsce wtedy - gdy nie posiada takiego hasła w swojej bazie. Jak bowiem mówiłem wcześniej, funkcja skrótu jest nieodwracalna, czyli nie można jej odtworzyć. Podsumowując: wysyłając hasz naszego hasła do tego rodzaju serwisów dalej narażamy się na ujawnienie naszego hasła jeżeli istnieje ono już w takiej bazie. Co więcej twórca takiej witryny może przechowywać wysłane przez użytkowników hasze i jeżeli będzie mieć szczęście, może w kolejnym wycieku pojawi się nowe hasło pasujące do podanej wartości?

Tak więc i to rozwiązanie nie jest najlepsze. Jakie są więc inne metody. Generalnie chodzi nam o taki sposób, w którym prześlemy hasło - bo przecież chcemy je sprawdzić ale równocześnie go nie prześlemy - bo nie chcemy, aby ktoś wiedział jak ono wygląda. A to swego rodzaju paradoks.

I tutaj do gry wchodzi matematyka, a mówiąc dokładniej pojęcie k-anonymity. O co w nim chodzi? Załóżmy, że jesteśmy firmą produkującą innowacyjne leki, które są w trakcie badań klinicznych. Z jednej strony chcielibyśmy się podzielić wynikami badań w magazynach branżowych z drugiej jednak strony nie możemy tego zrobić, ponieważ żaden pacjent nie chciał by aby ktoś publicznie z imienia i nazwiska opisywał na co jest on chory. Dlatego też takie dane trzeba zanonimizować - czyli usunąć informacje, na podstawie których można by było zidentyfikować konkretną osobę.

Pierwszy sposób polega na ukrywaniu pewnych danych, tak jak na tym przykładzie gdzie imię i nazwisko a także religie usunęliśmy ze zbioru zamieniając je na gwiazdkę. Drugi sposób to uogólnienie. Zamiast więc podawać konkretny wiek danej osoby - podajemy zakres, do którego należy. Zamiast konkretnego miasta - moglibyśmy podać województwo. Dzięki takiemu podejściu do tematu - dla każdej kombinacji wieku, płci i miasta otrzymujemy co najmniej 2 wyniki - co nie pozwala już na bezpośrednią identyfikację danej osoby.

Oczywiście takie rozwiązanie ma swoje minusy. Jeżeli bowiem wiemy, że dana osoba jest na liście i znamy jej wiek, miasto oraz płeć możemy domyślić się na jaką chorobę choruje - wszak będą tylko 2 możliwości. Wszystko zależy zatem od wielkości i ilości danych.

Ale dlaczego o tym wspominam i jak to się ma do haseł? Wiemy już że wysyłanie całego hasza hasła nie jest dobre. Ale co by się stało, gdyby zastosować pewnego rodzaju generalizację i wysłać do zewnętrznego serwisu pierwsze 5 znaków danego hasza? Serwis zwracał by wtedy listę wszystkich haszy, które zaczynają się od tych znaków, a my moglibyśmy sprawdzić - czy któryś z nich jest naszym hasłem.

Prześledźmy plus takiego rozwiązania. Po pierwsze - strona nie otrzymuje naszego hasła oraz jego hasza. Dla przykładu hash sha1 to 32 znaki. Nawet jeżeli wyślemy 5 z nich to pozostałe 27 są dla twórcy witryny tajemnicą. Dodatkowo twórca witryny nie wie czy wysłany przez nas hasz znajduje się w jego bazie czy też nie. 5 znaków to zdecydowanie za mało aby to określić. Jeżeli haseł w bazie jest odpowiednio dużo, to możemy założyć że dla każdej 5 znakowej kombinacji zostanie zwrócone przynajmniej kilkadziesiąt rekordów. A potencjalnych haszy, które zaczynają się od podanego ciągu jest bardzo dużo.

Ale to rozwiązanie dalej mi minusy. Uwidaczniają się one szczególnie jeżeli nasze hasło istnieje w bazie. Zakładając bowiem, że nasze hasło jest w tej bazie - to wysyłając pierwsze 5 znaków - właściciel witryny nie musi sprawdzać wszystkich kombinacji, a tylko te zaczynające się od podanego ciągu. Jeżeli jednak nasze hasło nie istniej w bazie sprawa ma się zupełnie inaczej. Właściciel może bowiem spróbować wszystkich haseł zaczynających się od danego ciągu - ale nic mu to nie da, a potencjalnych haszy haseł które zaczynają się od tych 5 znaków jest przecież bardzo wiele.

Z drugiej jednak strony- jeżeli nasze hasło rzeczywiście wyciekło, to przekazanie jego części do serwisu sprawdzającego jest naszym najmniejszym problemem. Powinniśmy bowiem jak najszybciej je zmienić. Co więcej jeżeli z serwisu korzysta odpowiednio dużo osób to osoba go prowadząca nie jest w stanie rozróżnić, które z zapytań odnosi się do haseł istniejących w bazie a które nie.

Dlaczego o tym wszystkim mówię? W Internecie znaleźć można serwis https://haveibeenpwned.com który działa właśnie na podstawie wyżej opisanego algorytmu. Wpisując w formularzu nasze hasło, z jego treści, lokalnie w naszej przeglądarce wyliczany jest hasz i wysyłany do odpowiedniego serwisu API. Następnie odpowiedź jest przetwarzana i znowu lokalnie nasza przeglądarka sprawdza, czy któreś z haszy zwróconych przez serwis jest identyczne z naszym.

Co więcej witrynę tą prowadzi znany ekspert bezpieczeństwa Troy Hunt będący równocześnie regionalnym szefem w firmie Microsoft. Serwis ten sygnuje swoim nazwiskiem i reputacją co przynajmniej w teorii zmniejsza szanse iż będzie chciał wykorzystać te dane w niewłaściwy sposób. Dalej jednak podawanie swojego hasła do banku na zewnętrznym serwisie to nie najlepszy pomysł. Fakt iż na moment tworzenia tego materiału strona ta działała tak jak opisuje nie oznacza bowiem, że za jakiś czas nie padnie ona łupem atakujących, którzy to dla przykładu mogą podmienić skrypt JS, co może sprawić, że zamiast 5 liter hasha wysyłane będzie całe nasze hasło.

Zatem ostateczna decyzja czy korzystać z danego serwisu należy do Ciebie drogi słuchaczu i to Ty musisz przeanalizować wszystkie za i przeciw. Teraz jednak wiesz jak działa ten serwis, dlaczego sporo osób go rekomenduje i w jaki sposób udało im się uzyskać odpowiednią anonimizację.

Jeżeli ten materiał Ci się spodobał i istnieją inne kwestię związane z bezpieczeństwem które nie do końca rozumiesz - daj znać w komentarzu. Może to właśnie o nich zrobię kolejny materiał.

Zapraszam również do subskrypcji tego kanału abyś nie przegapił żadnego nowego odcinka.

Do usłyszenia w kolejnym materiale. Cześć!

Timeline: