Monday, February 3, 2014

Czy nasze hasła są bezpieczne? Czyli komunikatory od środka

Witam.

W dzisiejszym wpisie chcę poruszyć temat bezpieczeństwa, a w szczególności naszych haseł. Dzisiejszy post nie będzie dotyczył szyfrowania rozmów, natomiast skupimy się w całości na tym jak są nasze hasła przechowywane przez komunikatory. Główną uwagę chciałbym skupić na polskich komunikatorach takich jak: AQQ, Gadu-Gadu, WTW, ale będzie też trochę o zagranicznych komunikatorach takich jak: Pidgin, Skype. Na potrzeby testu stworzyłem testowe konta do GG, Skype i XMPP. Oczywiście taki test może wykonać każdy wystarczy użyć programu Cheat Engine(nie będę tutaj się skupiał na omawianiu tego programu). Jak również założyłem, że w AQQ, WTW i Pidginie użytkownik korzysta z dwóch protokołów GG i XMPP. Czemu takie założenia? O tym w dalszej części wpisu. Najpierw zobaczymy jak komunikatory przechowują nasze hasła na dysku.

Przechowywanie haseł
Zacznijmy po kolei na pierwszy ogień weźmiemy AQQ. Jak możemy zauważyć w folderze, gdzie AQQ trzyma wszystkie ustawienia, dane dotyczące naszego konta są zaszyfrowane, a w przypadku konta GG tylko hasło. Nie istotne to co to za szyfrowanie zostało użyte, ważne natomiast jest to, że po poznaniu algorytmu szyfrowania możemy odzyskać wszystkie dane. Teraz przechodzimy do kolejnego komunikatora czyli Gadu-Gadu. W tym przypadku nie wiele się różni od AQQ, tylko nasze hasło jest szyfrowane, jak się później okaże również da się to hasło odzyskać. Teraz open-sourcowy klient czyli Pidgin, niestety wszystko jest trzymane w postaci jawnej. To że dany program ma udostępniony kod źródłowy nie powinno go automatycznie zwalniać z jakiegokolwiek bezpieczeństwa, w końcu chodzi przede wszystkim o nasze hasła. Jak sprawa wygląda jeśli chodzi o Skype? Tutaj jest wszystko wyjaśnione. Jak widać w przypadku Skype możemy czuć się dużo bezpieczniej niż w przypadku wcześniej komunikatorów. No to teraz został nam jeszcze WTW. Tutaj również mamy zakodowane pliki dotyczące naszych danych, które również da się rozkodować.

Blokada profilu hasłem
Możliwość taką oferują tylko AQQ i WTW. Tak więc zacznijmy znowu od AQQ. Teraz możemy użyć programu Cheat Engine, który nam pomoże w przeglądaniu pamięci programu. Tak więc uruchamiamy AQQ widzimy ekran logowania, włączamy Cheat Engine, wyszukujemy teraz nasze hasło do profilu i oto efekt:
Tak więc jak widzimy na obrazku na nic nie pomogło szyfrowanie, skoro hasło jest rozszyfrowane w pamięci. W przypadku WTW sprawa wygląda dużo lepiej, nie znajdziemy w pamięci ustawionego hasła do naszego profilu.

Przeglądanie pamięci czyli szukanie kolejnych haseł :)
Trzymając się kolejności alfabetycznej zaczniemy od AQQ. Oczywiście jak w poprzednim punkcie widzieliśmy hasło rozszyfrowane, tak i teraz nie mogło być przecież inaczej. Sprawdzamy więc i o to efekty:
Zarówno jak hasło do Gadu-Gadu jak i XMPP są rozszyfrowane w pamięci. Teraz sprawdźmy jak wygląda sytuacja z komunikatorem Gadu-Gadu. Sytuacja jest dokładnie taka sama jak w AQQ:
Jeśli chodzi o Pidgin to nie ma co tutaj dużo mówić, wszystko zostało powiedziane. Jeśli ktoś chce oczywiście można sprawdzić samemu tylko trza pamiętać o odznaczeniu opcji "Unicode". W przypadku Skype sprawa wygląda dużo lepiej nie znajdziemy naszego hasła w postaci jawnej, możemy za to znaleźć zahashowane nasze hasło:
No i na koniec zostaje nam WTW. Oczywiście nie może tutaj być wielkiej niespodzianki i tak też się stało wszystko da się odczytać z pamięci:

Aplikacja
Nic nie stoi na przeszkodzie, żeby napisać prostą aplikację do odczytu haseł z pamięci zgodnie z tymi założeniami co podałem na początku, oczywiście taką aplikację można by było rozbudować dla każdego przypadku. Przykład działania aplikacji:

Czy mogę się czuć bezpiecznie jeśli hasła są rozszyfrowane w pamięci?
Niestety nie. Wystarczy, że wirus czy malware zrobi zrzut pamięci procesu, albo po prostu odczyta z odpowiedniego adresu nasze hasło.

Używam innego systemu niż Windows lub innego komunikatora czy jestem bezpieczny?
Użycie innego systemu nie ma wpływu jeśli komunikator trzyma hasła w pamięci rozszyfrowane. Jeśli chodzi o inny komunikator to wszystko zależy od tego jak przechowuje hasła w pamięci.

Jak tworzyć w miarę bezpieczną aplikację?
Hasła przechowywać używając SHA-1 lub lepszych algorytmów, MD5 najlepiej zostawić w spokoju. Jeśli dla kogoś to nie jest wystarczające można zrobić hasło na profil i te hasło wykorzystać jako klucz szyfrujący plik z danymi. No i najważniejsze nie trzymać jakichkolwiek haseł w postaci jawnej czy to w pliku, czy w bazie danych, czy w pamięci. Przy porównaniu haseł najlepiej stosować takie podejście zakładając, że mamy hasło zahashowane i sprawdzamy z tym co wprowadził użytkownik:
String zahashowaneHaslo = "hash";
String haslo = getStringFromUser(); /* funkcja pobierająca hasło od użytkownika  */
haslo = hash(haslo); // hashujemy hasło
Potem porównujemy ze sobą hasła i jeżeli nie są już nam potrzebne te hashe to wykonać taki kod:
for(int i =0; i < s.length(); i++) {
s[i] = 0;
}
s.clear(); /* żeby wyzerować pole przechowującą długość stringa */

Jeśli hasło musimy wysłać do serwera to najlepiej oczywiście w zaszyfrowanej formie, nawet jeśli łączymy się przy użyciu SSL to również wysyłajmy hasło zaszyfrowane, gdyż nawet jeśli atakujący użyłby ataku Man In The Middle nie otrzyma wtedy hasła w postaci jawnej. Oczywiście to tylko przykładowe propozycje, ale poprawiające bezpieczeństwo aplikacji i naszych haseł.

Podsumowanie
To tyle jeśli chodzi o ten krótki wpis na temat bezpieczeństwa komunikatorów. Jeśli ktoś jest tym zainteresowany jak inne programy podchodzą do bezpieczeństwa, przy użyciu Cheat Engine można sprawdzić czy hasła są trzymane w postaci jawnej w pamięci danego programu. No i nie zapominajmy o najważniejszym do każdego serwisu/konta używajmy innych haseł

1 comment:

  1. Wrzuciłem trochę komentarzy tutaj:
    http://www.uw-team.org/forum/viewtopic.php?f=5&t=10988&p=83879#p83879

    ReplyDelete