Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book

Jak można było obejść uwierzytelnianie MFA Microsoftu

13 grudnia 2024, 12:32 | W biegu | komentarze 4
Tagi: , ,

Wieloskładnikowe uwierzytelnianie (MFA) wzmacnia znacząco bezpieczeństwo logowania w sieci. Atakujący może przecież odgadnąć, podsłuchać, ukraść czy nawet znaleźć hasło konkretnego użytkownika. Jeśli jednak, będzie musiał udowodnić swoją tożsamość w inny sposób, nie tylko przy pomocy tego, co użytkownik “wie” (jak hasło czy pin), to prawdopodobieństwo logowania zakończonego sukcesem jest niewielkie. Wśród MFA (najczęściej mowa o tzw. 2FA czyli uwierzytelnianiu dwuskładnikowym, ponieważ dwa niezależne czynniki są rozsądnym kompromisem pomiędzy użytecznością a bezpieczeństwem) wyróżnić można np. fizyczne tokeny (np. zgodne z FIDO2), kartę kodów jednorazowych (niezalecane), kod wysyłany SMS (niezalecane) czy też jednorazowe kody ważne przez krótki czas (tzw. OTP).

TLDR:

  • Microsoft “trochę” zoptymalizował sposób weryfikacji kodów jednorazowych, powiązując próby logowania do tymczasowego “obiektu” sesji.
  • Atakujący może sobie takich obiektów wygenerować… całkiem sporo, wielokrotnie podając poświadczenia (login, hasło).
  • Każda tymczasowa sesja pozwala na przeprowadzenie do dziesięciu prób ataku.
  • Ponadto ważność kodu TOTP została lekko wydłużona, aby uniknąć problemów z synchronizacją w sieci i opóźnień w transmisji.
  • Badacze z Oasis wskazali, że wyżej wymienione czynniki pozwalają na efektywne przeprowadzenie ataku brute-force i odgadnięcie kodu.

Kody jednorazowe mogą być realizowane na wiele różnych sposobów. Popularnym rozwiązaniem jest implementacja TOTP (time-based one-time-password) zgodnego z RFC 6238 (używane między innymi przez aplikację Google Authenticator) i składającego się z 6 cyfr 0-9. Standard sugeruje między innymi jak długo ważny powinien być kod jednorazowy (zalecana wartość to 30 s). Aby znaleźć rozsądny kompromis, zaproponowano aby jeden kod (ostatni, oprócz aktywnego) był również uznawany przez aplikację we właściwej jednostce czasu. 

Jednak w celu zwiększenia używalności aplikacji, Microsoft przedłużył trochę czas ważności kodu. Badacze powołują się na informacje pracownika, który sugeruje, że kod może być ważny nawet 5 minut. Jest to już całkiem pokaźne okno czasowe. Ale to nie największa bolączka implementacji 2FA przez Microsoft.

Okazuje się, że liczba dozwolonych błędów przy przepisywaniu OTP dla jednej próby zalogowania jest ograniczona do dziesięciu prób. Wtedy system może np. powiadomić użytkownika, że miała miejsce nieautoryzowana próba dostępu. Jednak te dziesięć prób jest przypisane do jednej tymczasowej sesji utworzonej w wyniku przejścia pod odpowiedni adres oraz podania poprawnych poświadczeń. Jak słusznie zauważyli badacze z Oasis – nie został wprowadzony żaden mechanizm limitowania liczby zapytań lub ograniczenia ich częstości. To powoduje, że próby odgadnięcia poprawnego kodu mogą być wykonywane równolegle, bez ryzyka zablokowania konta czy wygenerowania alertu. 

Rysunek 1. Wykres przedstawiający prawdopodobieństwo trafienia poprawnej kombinacji w zależności od czasu.

Po lekko ponad godzinie, atakujący przekracza 50% prawdopodobieństwo odgadnięcia kodu 2FA. Atak został zaprezentowany przez demo:

Microsoft otrzymał zgłoszenie w czerwcu tego roku i wprowadził stosowne poprawki. Jak podkreślają autorzy znaleziska – konkretne kroki naprawcze nie zostały ujawnione, ale przeprowadzone retesty wskazują na wystąpienie limitów dla zapytań (tzw. rate-limiting) odgadujących kod. Niech to będzie lekcja, pokazująca jak ważne są wszystkie elementy systemu 2FA i z pozoru niewielkie rozluźnienia ograniczeń, mogą doprowadzić do powstania praktycznych ataków, które pozwolą na przełamanie drugiej warstwy zabezpieczeń. 

Nam pozostaje przypomnieć, abyście włączyli uwierzytelnianie wieloskładnikowe gdzie tylko się da. Korzystajcie z 2FA na bazie standardu FIDO2 (o ile to możliwe). A może niedługo zapomnimy o hasłach i będziemy używać passkeyów*?

*tutaj jest jeszcze kwestia zaufania do enklaw, w których te passkeye są przechowywane. 

~fc

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. Piotr

    Klucza U2f jeszcze niedawno były dla mnie super, bezpieczne, wygodne, łatwe w użyciu.

    A teraz wszędzie wpychają na siłę logowanie bez hasła. Np klucz U2F można używać na koncie M$ ale on zastępuje hasło, dane są zapisywane na kluczu (a ilość kont jest bardzo mocno ograniczona).

    Teraz google, o ile kiedyś dodanie zwykłego klucza U2F było bezproblemowe o tyle obecnie google wszędzie wciska zapisanie jako klucz dostępu gdzie ponownie dane chcą zapisać się w kluczu U2F. Dodatkowo ciągle na moim koncie jak coś zmienię z kluczami aktywuje się funkcja logowania bez hasła. Wyłączałem już ją kilkanaście razy!!!

    Ja jakoś nie jestem przekonany do logowania bez hasła i zapisywania danych w kluczu. Po 1 ogranicza to ilość kont. Po 2 praktycznie uniemożliwia współdzielenie klucza, a zdarza mi się, że swój klucz zapisuje na kontach kogoś z rodziny jako zapasowy klucz.

    Dlaczego M$ w ogóle nie pozwala używać kluczy U2F bez zapisywania danych na kluczu i zastępowania loginu i hasła ?
    Już nie dość, że bardzo mało kto używa takich kluczy, mało serwisów je wspiera, to jak już dany serwis wspiera to jeszcze potrafią utrudnić korzystanie z nich.

    Według mnie jest zdecydowanie za wcześnie na porzucanie haseł. Jako funkcja opcjonalna dla chętnych OK, ale wciskanie tego na siłę tylko szkodzi.

    Odpowiedz
    • dsg

      A co w przypadku jeśli użyjesz prostszego klucza („Yubico Security Key – „ten niebieski”) albo wyłączysz niepotrzebne technologie za pomocą „YubiKey Manager”? Googlowi wystarcza U2F. Albo Fido2, jeśli chcesz mieć PIN na kluczu.
      PS Tylko nie kliknij resetu, bo będziesz musiał użyć zapasowego klucza i wszystko przyuczać na nowo.

      Odpowiedz
  2. Wojtek

    Całkowicie się z Tobą zgadzam Piotrze.

    Odpowiedz
  3. Paweł

    Może czegoś nie rozumiem, ale z tych wyliczeń wynika, że po 70 minutach szansa odgadnięcia kodu wynosi 50%. Ale nie uwzględnia to tego, że kod zmienia się co 30 sekund (w tym przypadku 5 minut, ale to i tak spora różnica do 70 minut). Czyli i tak nigdy nie mamy kodu, który jest ważny 70 minut i po każdej zmianie łamanie trzeba zaczynać od nowa (bo kod który sprawdziliśmy wcześniej i był błędny, po zmianie może być poprawny)

    Chyba, że chodziło o łamanie seed-a ale tutaj jego długość sprawia, że raczej trzeba by na to dużo więcej czasu

    Odpowiedz

Odpowiedz