Hasła maskowane – błędy implementacyjne polskiego banku

Internet lockTen tydzień zapisze się w historii polskiego internetu i bankowości za sprawą włamania do jednego z polskich banków.
Jak podaje Zaufana Trzecia Strona przebieg wydarzeń wyglądał następująco:

  • Email od hakera z informacją o włamaniu został wysłany 26-28 marca do członków zarządu banku. Bank milczy.
  • Po wysłaniu przez niego kilku wiadomości do banku otrzymuje odpowiedź:

    „W przedmiotowej sprawie skontaktuje się dedykowana kancelaria prawna po świętach.”

  • Haker wysyła kolejne maile i smsy z dowodami włamania do członków zarządu. Bank milczy.
  • W dalszej kolejności włamywacz podjął kontakty z podmiotami:
    • Komisja Nadzoru Finansowego
    • Zwiazek Bankow Polskich
    • GIODO
    • MasterCard
    • CERT
    • UOKIK
  • Uzyskuje on jedynie odpowiedź od Urzędu Komisji Nadzoru Finansowego który prosi o przesłanie więcej szczegółów. Bank w dalszym ciągu milczy.
  • Pierwsze wiadomości pojawiły się w poniedziałek 8 czerwca 2015. Z ich treści wynika, że ktoś włamał się do jednego z Polskich banków i przez dłuższy czas mógł swobodnie pracować na ich serwerach.
  • Użytkownik o nicku Polsilver publikuje częściową historię transakcji oraz salda rachunków konta prezesa firmy Polkomtel, Tobiasa Solorza.
  • Bank w dalszym ciągu milczy i haker wysyła żądanie o zapłacenie 200,000 zł. przy płatności jednorazowej lub 400,000 zł w przypadku płatności na raty (10 x 40 tys, co miesiąc). W żądaniu zaznacza, że czeka do piątku.
  • Bank w dalszym ciągu milczy.
  • 200 tys. zł. okupu nie zostało przelane i haker zgodnie z zapowiedziami spełnia swoją groźbę. W internecie w dniu 12 czerwca 2015 udostępnione zostają dane kilkuset klientów. Jednocześnie zapowiada on, że udostępnianych danych będzie więcej i będą publikowane co tydzień.

 

W dniu dzisiejszym bank opublikował oświadczenie:

Szanowni Klienci,

W związku z mediowymi doniesieniami, dotyczącymi bezpieczeństwa danych pragniemy poinformować, że pieniądze Klientów PlusBanku były i są bezpieczne. Jednocześnie informujemy, że w I kwartale bieżącego roku doszło w PlusBanku do przestępczego ataku grupy hackerów, który został wykryty i zablokowany. Bank po zidentyfikowaniu sposobu działania przestępców niezwłocznie podjął czynności zaradcze zmierzające do wzmocnienia systemów bezpieczeństwa. Dalsze próby cyberataku zostały udaremnione. Żaden z Klientów Banku nie poniósł uszczerbku finansowego.
Sprawa, o której donoszą media jest wydarzeniem historycznym, atak miał miejsce kilka miesięcy temu, a reakcja Banku była natychmiastowa: systemy zostały wzmocnione i dodatkowo zabezpieczone. W obliczu zdecydowanego oporu PlusBanku, przestępcy przyjęli obecnie metodę szantażu, polegającą na próbie wymuszenia od Banku kwot pieniężnych w zamian za nierozpowszechnianie w mediach informacji o incydencie. PlusBank stoi na stanowisku, że bezpieczeństwo Klientów i reputacja Banku stanowią najwyższy priorytet, dlatego też z osobami jawnie łamiącymi porządek prawny, których działania wymierzone są przeciwko Bankowi i jego Klientom, nie prowadzi żadnych negocjacji.
Bank na bieżąco współpracuje z organami ścigania, które od samego początku zajmują się wykryciem i ujęciem przestępców. Jesteśmy przekonani, że twarda postawa Banku związana z niepodejmowaniem żadnych prób negocjacji z przestępcami, a także wzmocnienie systemów bezpieczeństwa w dziedzinie prewencji związanej z bezpieczeństwem teleinformatycznym, działania Prokuratury i Policji oraz pozostałych instytucji, zaprowadzi przestępców w niedługiej perspektywie przed wymiar sprawiedliwości. Chcemy po raz kolejny zapewnić, że środki zdeponowane na rachunkach, lokatach w PlusBanku zawsze były i są w pełni bezpieczne.
Klienci PlusBank zawsze mają możliwość kontaktu z Bankiem, między innymi z Centrum Obsługi Klienta i Oddziałami Banku.

Z poważaniem, PLUS BANK S.A.

Brakuje w nim jednak odniesienia do kradzieży i upublicznienia danych osobowych swoich klientów, co w tym wypadku jest według mnie kluczowe.

Ale przejdźmy do jednego z aspektów włamania, czyli haseł maskowanych.

Czym są hasła maskowane

Standardowy sposób uwierzytelniania czy to do skrzynki pocztowej, czy do facebooka polega na wprowadzeniu loginu i wpisania kompletnego hasła. Hasła maskowane są nieco bardziej skomplikowane.

Uwierzytelnianie w oparciu o hasło maskowane przebiega dwuetapowo.

  1. Użytkownik podaje swój identyfikator. Na jego podstawie system generuje pola hasła maskowanego.
  2. W kolejnym kroku użytkownik podaje tylko wybrane znaki z hasła (np. znaki znajdujące się na pozycjach 4, 6, 12, 14 z hasła o długości 15 znaków).
    Na podstawie wprowadzonych danych wyliczany jest ich hash i porównywany z bazą hashy.

Głównym argumentem za stosowaniem haseł maskowanych jest przypadek jak to określam: „jednokrotnego logowania”.  Chodzi tu sytuację gdy np. jesteśmy zmuszeni do jednorazowego zalogowania się do naszego konta bankowego z komputera nad którym nie mamy pełnej kontroli. Jeśli w systemie operacyjnym z którego skorzystamy będzie zainstalowany keylogger, to uzyska on dostęp tylko do kilku znaków hasła i prawdopodobieństwo wylosowania tego samego zestawu aby z niego skorzystać jest dosyć niskie (ale zależy ono od ilości losowanych znaków i długości hasła).
Kluczowym stwierdzeniem powyżej jest fakt jednorazowego zalogowania korzystając z obcego komputera. Dlaczego?

Sam posiadam konto w jednym z polskich banków stosujących maskowanie. Wykonałem test weryfikujący przy której próbie logowania zostaną odkryte wszystkie znaki mojego hasła liczącego siedemnaście znaków:

ing

Zwróćcie uwagę, że już w trzeciej próbie musiałem podać prawie 3/4 znaków mojego hasła. Znaczy to tyle, że jeżeli wielokrotnie logowałbym się z obcego komputera na którym zainstalowane było złośliwe oprogramowanie, to moje hasło dosyć szybko byłoby przechwycone.

[Aktualizacja 14.06.2015 8:42]

Przeprowadziłem jeszcze jeden test w GetinBanku. Tu moje hasło składa się z 19 znaków:

getin

Tak jak w przypadku testu w ING za każdym razem robiłem zrzut ekranu po czym się logowałem. Co ciekawe odkrycie wszystkich znaków hasła wymagało tak samo jak w ING przeprowadzenie dziewięciu prób.

Tutaj jeszcze zaskakująca jest trzecia próba, gdzie maskowanie jest identyczne jak za poprzednim razem. Zbieg okoliczności? Ilość kombinacji pięcioelementowych ze zbioru dziewiętnastoelementowego wynosi ponad 11 tys. Jeżeli z losowością generatora jest wszystko ok, to miałem niezłego farta.

 

Implementacja haseł maskowanych

Wykonując implementację maskowania możemy wyróżnić następujące kroki w których należy zwrócić uwagę na szczegóły:

  1. Pobranie identyfikatora użytkownika
  2. Kalkulacja ilości maskowanych znaków
  3. Wylosowanie znaków do maskowania
  4. Wyświetlanie formularza do wprowadzania hasła
  5. Odświeżanie formularza do wprowadzania hasła

Tak więc po kolei.

Pobranie identyfikatora użytkownika

Ważne jest to, jak zachowuje się system przy podaniu poprawnego identyfikatora w stosunku do podania nieprawidłowego. Implementując komunikaty błędów, czy zmieniając zasady generowania formularza do wprowadzania znaków hasła, nie można sobie pozwolić na to, aby możliwe były jakiekolwiek różnice w odpowiedzi serwera. Dlaczego? Dlatego żeby haker (a właściwie jego bot)  nie mógł określić czy istnieje w systemie użytkownik o wskazanym identyfikatorze.

Przykładowe błędy implementacyjne:

  • komunikat informujący, że dla wskazanego loginu nie istnieje konto
  • po wprowadzeniu istniejącego identyfikatora generują się losowe pozycje hasła maskowanego, podczas gdy po wprowadzeniu błędnego są one na stałych miejscach
  • próba logowania z istniejącym identyfikatorem powoduje wygenerowanie innych proporcji znaków zamaskowanych i edycyjnych w stosunku do próby logowania z błędnym identyfikatorem

Kalkulacja ilości maskowanych znaków

Przeanalizujmy dwa przypadki haseł:

  1. Hasło o długości pięciu znaków.
    Zbyt krótkie. Ile pól maskowanych należałoby wyświetlić użytkownikowi? 1, 3, 5? Hasło musi liczyć więcej znaków.
  2. Hasło o długości dziesięciu znaków.
    1. Jedno pole maskowane
      Oczywiście, jest to za mało. Ilość maskowanych pól powinna wynosić minimum cztery znaki, a w większości przypadków implementacji wynosi pięć znaków.
    2. Dziewięć pól maskowanych
      W tym przypadku użytkownik jest zmuszony do uzupełnienia 90% swojego hasła za każdym logowaniem. To oczywiście zbyt dużo aby stosowanie hasła maskowanego miało jakikolwiek sens. Ilość znaków do wprowadzenia nie powinien przekraczać 50% długości całego hasła.

Na podstawie powyższych punktów można wyciągnąć wnioski, że jeśli ilość maskowanych pól powinna wynosić minimum cztery znaki i ich ilość nie powinna przekraczać 50% długości całego hasła, to hasło użytkownika powinna mieć długość minimum 8-10 znaków.

 

Wylosowanie znaków do maskowania

Aby uniknąć możliwości enumeracji użytkowników (opisane punkt wyżej) ich hasła powinny być o długości jak najbardziej do siebie zbliżonej. Dlaczego? Dlatego aby rozkład prawdopodobieństwa wylosowania każdej pozycji był w miarę równomierny.

W tym miejscu weźmy za przykład hasła dwóch użytkowników:

  1. Hasło o długości 10 znaków
    Zakres wylosowanych pozycji wynosi od 1 do 10
  2. Hasło o długości 20 znaków
    Zakres wylosowanych pozycji wynosi od 1 do 20

Takie zakresy losowanych pozycji mogą złamać zasadę enumeracji użytkowników – system nie powinien umożliwić odróżnianie prawidłowości istnienia identyfikatora użytkownika na podstawie wygenerowanych maskowanych pól. Implementując algorytm należałoby dla każdej długości hasła zsumować ilość użytkowników, aby zgodnie z prawdopodobieństwem wygenerować odpowiednią ilość maskowanych pól w przypadku podania błędnego loginu.

Żeby maskowanie znaków hasła miało sens należy upewnić się, że maski, które losujemy są wystarczająco losowe. Często powtarzające się maski powodują, że osoba, które przejmie fragment hasła ma ułatwione zadanie.

Wyświetlanie formularza do wprowadzania hasła

Osoba próbując się zalogować do systemu nie powinna uzyskać informacji o długości hasła. W związku z tym jeśli użytkownik posiada hasło dziesięcioznakowe  nie możemy mu wyświetlić po prostu dziesięć pól zamaskowanych i pięć edycyjnych. Musimy umieścić na formularzu tyle pól ile wynosi maksymalna dozwolona ilość znaków. Tak – stosując hasła maskowane jesteśmy zmuszeni do ograniczenia długości haseł użytkowników! Sytuacja jest trochę inna w przypadku gdy nie wyświetlamy wszystkich znaków, a jedynie udostępniamy pola edycyjne z informacją o pozycji każdej wartości:

 

ing_mobi

Takie rozwiązanie również ma swoje konsekwencje o czym napiszę poniżej.

Odświeżanie formularza do wprowadzania hasła

Kolejna ważne założenie – system powinien generować maskę i wyświetlać ją dla danego identyfikatora użytkownika do momentu poprawnego zalogowania. Nie można pozwolić na sytuację, aby osoba próbująca się włamać i dysponująca częścią znaków naszego hasła mogła sobie odświeżyć formularz powodując wygenerowanie innych pól edycyjnych dla siebie korzystnych.

I w tym punkcie widzę wpadkę polskiego banku, z którego w dniu wczorajszym zostały opublikowane wykradzione dane kilkuset klientów.

Haker sugeruje, że bank stosujący hasło maskowane umożliwiał w trakcie logowania wielokrotne losowanie miejsc hasła, które należało uzupełnić – umożliwiając atakującemu łatwiejsze trafienie w posiadane znaki.

Sprawdziłem to i istotnie – mechanizm logowania do konta banku losuje za każdym razem inny zestaw znaków! Dlatego wystarczy próbować dostatecznie długo, by otrzymać ten sam zestaw, który został wcześniej przechwycony!

Tak błaha sprawa, a tak duże niesie za sobą konsekwencje.

 

Podsumowanie

Poprawna implementacja obsługi haseł maskowanych jest o niebo trudniejsza niż w przypadku standardowego rozwiązania. Tutaj naprawdę należy dokładnie przemyśleć każdy etap.

Ich zastosowanie ma jednak pewne zalety:

  • stosowanie hasła maskowanego uniemożliwia internetowym przestępcom
    przechwycenie w całości hasła (zakładając, że logujemy się na niekontrolowanym przez nas komputerze JEDNORAZOWO).
  • losowy wybór znaków nie pozwoli na poznanie długości pełnego hasła.

A wady?:

  • uciążliwość dla użytkowników
  • znacznie trudniejsza implementacja przechowywania hasła i weryfikacji jego poprawności
  • wymusza wprowadzenie ograniczenia na maksymalną długości hasła

Osobiście nie lubię haseł maskowanych. W zasadzie nie przeszkadza mi rozwiązanie np. w ING gdzie w trakcie logowania wyświetlony jest formularz z maksymalną ilością znaków i „w głowie” jestem w stanie przeskakiwać kolejne pola i uzupełniać właściwe:

ing_form

Natomiast ich wersja mobilna i tego typu formularze są koszmarem:

ing_mobi

Uzupełniając te pola trzeba „w myślach” iterować brakujące znaki. Ja tego nie potrafię i zawsze w takich przypadkach przychodzą z pomocą palce obu rąk 🙂

I odpowiadając pewnie na kolejne pytanie – tak, sprawdziłem czy zmieniają się maskowane pola w wersji normalnej i mobilnej. Maskowanie jest takie samo. Nie ma w tym przypadku żadnych zastrzeżeń.

 

Ciekawostka:

Na profilu publicznym zaatakowanego banku usuwane są wszelkie komentarz odnoszące się do włamania. Mój również został usunięty.

[Aktualizacja 14.06.2015 14:00]

Bank zablokował możliwość dodawania komentarzy na Facebooku.

 

[Aktualizacja 18.06.2015 07:00]

Ciąg dalszy tutaj.

 

Książki związane z bezpieczeństwem i testami penetracyjnymi:

Autor: Georgia Weidman

ISBN: 978-83-283-0352-2

Format: , stron:

Data wydania:

Opis: Obroń Twój system — zaatakuj go! Chcesz sprawdzić, czy Twój system jest bezpieczny? Zaatakuj go! Najskuteczniej zrobisz to z wykorzystaniem testów penetracyjnych. W trakcie tych prób pentesterzy (osoby prowadzące testy penetracyjne) próbują wcielić się w rolę włamywacza i przełamać zabezpieczenia testowanego systemu. Jeż

Cena: 99.00zł

Autor: Patrick Engebretson

ISBN: 978-83-246-6653-9

Format: , stron:

Data wydania:

Opis: Współczesne systemy informatyczne przetwarzają gigantyczne ilości niezwykle wrażliwych danych - osobowych, medycznych czy finansowych. Ich utrata lub przejęcie przez niepowołane osoby może oznaczać katastrofę dla firmy. Dlatego etyczny hacking i testy penetracyjne to coś, co może przynieść dużo satysfakcji i pożytku, a przy tym jest opłacalne finansowo! W jaki sposób zostać s

Cena: 39.00zł

Autor: Peter Kim

ISBN: 978-83-283-0384-3

Format: , stron:

Data wydania:

Opis: Zweryfikuj bezpieczeństwo systemów informatycznych! Testy penetracyjne (pentesty) to najbardziej wiarygodny sposób zweryfikowania bezpieczeństwa systemów informatycznych. Specjaliści na zlecenie próbują włamać się do systemu. Stosują przy tym wyrafinowane techniki, z których prawdopodobnie skorzystaliby włamywacze. Pentester weryfik

Cena: 49.00zł

Autor: Thomas Wilhelm

ISBN: 978-83-246-9033-6

Format: , stron:

Data wydania:

Opis: Bezpieczeństwo systemu jest w Twoich rękach! Trzonem każdego systemu informatycznego są dane oraz gwarancja ich bezpieczeństwa. Jest to szczególnie ważne, ponieważ codziennie w najróżniejszych systemach przetwarzane są setki informacji na temat każdego z nas. Czasami są to dane mało istotne — wpisy na portalach społecznościowych lub komentarze na po

Cena: 69.00zł

Autor: Monika Agarwal, Abhinav Singh

ISBN: 978-83-246-9131-9

Format: , stron:

Data wydania:

Opis: Najlepsze przepisy na bezpieczeństwo Twoich danych! Jeżeli Twój system przechowuje i przetwarza poufne informacje — dane osobowe, numery kart kredytowych, wiadomości e-mail, dane finansowe lub coś równie ważnego — jest łakomym kąskiem dla cyberprzestępców. Jeżeli wizja kradzieży Twoich danych spędza Ci sen z powiek i zastanawiasz s

Cena: 59.00zł

 

 

Chcesz być poinformowany(a) o kolejnych artykułach z dziedziny programowania?
Polub NotatnikProgramisty 

 

To również może Cię zainteresować:

8 thoughts on “Hasła maskowane – błędy implementacyjne polskiego banku

  1. Ing i maskowanie przy logowaniu mobilnym? A czemu nie skorzystać z aplikacji? Logowanie jest bardzo ułatwione. No chyba, że się nie instaluje większości przydatnych aplikacji z racji tego, że się chce chronić swoje dane. No ale ostatecznie, nawet taki słaby system do pobierania hasła nie jest aż tak denerwujący. Jeśli logujesz się często, to się do hasła szybko przyzwyczaisz. Jeśli rzadko, to to nie jest aż tak irytujące, bo w końcu rzadko musisz to robić.

  2. A mój bank też ma zdaję się zaprogramowane kilka kombinacji, bo losuje zawsze te same zestawy. Podejrzewam, że zmieściłbym się w tych 9 próbach, aby uzyskać powtórzoną kombinację. Nie pamiętam też, aby kiedykolwiek zapytał mnie o pierwszy znak.

  3. „Tutaj jeszcze zaskakująca jest trzecia próba, gdzie maskowanie jest identyczne jak za poprzednim razem. Zbieg okoliczności? Ilość kombinacji pięcioelementowych ze zbioru dziewiętnastoelementowego wynosi ponad 11 tys. Jeżeli z losowością generatora jest wszystko ok, to miałem niezłego farta.”

    Czy autor ma JAKIEKOLWIEK pojecia jak sa implementowane takie maski ?
    Z technicznego punktu widzenia NIE SA TO LOSOWE maski, a „predefiniowane”. Czemu ? Bo haslo po stronie serwisu musi byc zaszyfrowane (a dokladnie zahaskowane – tak, ze nie da sie uzyskac wersji jawnej).
    Najprostsza implementacja takiego podejscia to w momencie podania przez uzytkowanika nowego hasla wygenerowanie (i zapisanie w bazie dancyh) hasha dla hasel wszystkich mozliwych (zdedefiniowawnych w systemie) masek.
    Czyli jak haslo to qwertyuiop, fynkcja skrotu to fs(‚xxxx’) i system ma 3 mozliwe maski (pozycje)
    14689
    23678
    13579
    to system zapisze w bazie danych:
    fs(‚qryio’)
    fs(‚weyui’)
    fs(‚etuo’)

    I dodanie kolejnej maski nie bedzie mozliwe (bo juz w systemie nie bedzie hasla w plan texcie)

    Tak wiec kazdy taki system ma predefiniowane pare-parenascie masek i to wszystko. Beda sie powtarzaly, w pare logowan na 100% uda sie uzyskac 100% hasla.

    • Tu masz inny przykład: http://www.smartarchitects.co.uk/news/9/56/Partial-Passwords—How.html

      Ale jeśli pytasz czy mam ‚jakiekolwiek’ pojęcie, to stosuje się Hardware Security Module, czyli sprzętowe skrzynki, do których można wrzucać hasła jak do czarnej dziury, a następnie wykorzystywać moduł jako wyrocznię, odpytując, czy dane hasło jest powiązane z danym zasobem. Hasła w praktyce nie są jawne – nie można przeczytać klucza danego zasobu, można tylko odpytać, czy jakiś klucz ten zasób autoryzuje.

      Urządzenie jest odporne sprzętowo na jakikolwiek „tampering” (działanie z zewnątrz mające na celu wydobycie informacji) i na zewnątrz udostępnia jedynie dwie metody API:

      – dodajUzytkownika(identyfikator, haslo)
      – sprawdzUzytkownika(identyfikator, haslo)

      Sposób przechowywania danych przez urządzenie jest nieistotny (mogą być np. zaszyfrowane kluczem przypisanym do danego HSM’a), bo nie ma możliwości wydobycia ich na zewnątrz. Takie urządzenie podpinasz do serwera i nawet ze zwykłego PHP wywołujesz metody API, które ono udostępnia. Ponieważ samo urządzenie zna hasło, może udostępniać metodę do sprawdzania hasła maskowanego – wysyłasz mu tablicę znaków i indeksów na których ono występuje, a ono zwraca tylko true albo false.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *