Czy QR eksportu Google Authenticator jest bezpieczny do zeskanowania?
Tylko jeśli wygenerowałeś/aś go samodzielnie, na własnym starym telefonie, z własnym nowym telefonem skierowanym na ekran. Każda inna osoba, która sfotografuje ten QR z jakiegokolwiek powodu, uzyskuje trwały dostęp do każdego kodu 2FA dla każdego konta w pakiecie.
Google Authenticator i kilka kompatybilnych aplikacji (Aegis, Raivo OTP, 2FAS) umożliwiają eksport przechowywanych kont 2FA w celu przeniesienia na nowe urządzenie. Eksport przyjmuje postać kodu QR z URI zaczynającym się od otpauth-migration://. Wewnątrz URI znajduje się pojedynczy pakiet protocol-buffer (schemat MigrationPayload Google) zawierający jednocześnie wszystkie konta: wystawcę, nazwę konta, ziarno sekretu, algorytm, liczbę cyfr, typ (HOTP / TOTP) i licznik.
Format był pierwotnie nieudokumentowany, ale został odtworzony metodą inżynierii wstecznej i jest teraz de facto formatem wymiany dla kopii zapasowych 2FA. Zewnętrzne aplikacje authenticator rozpoznają i importują ten sam QR.
Jeden QR może zawierać dziesiątki kont. QR jest wizualnie nieodróżnialny od zwykłego QR konfiguracyjnego TOTP — nie ma żadnego markera wizualnego informującego przypadkowego obserwatora, że zawiera cały pakiet.
Dlaczego pojedynczy QR pakietu jest wyjątkowo niebezpieczny
Zwykły QR konfiguracyjny otpauth:// jest niebezpieczny do zeskanowania, jeśli go nie żądałeś/aś, ale promień rażenia to jedno konto. Promień rażenia QR migracji to każde konto w Twoim aplikacji authenticator. Jeśli atakujący sfotografuje ekran z tym QR — przez ramię w kawiarni, przez kamerę monitoringu, przez przejrzyste szklane okno — odchodzi z możliwością ominięcia 2FA na każdym objętym koncie. Na zawsze. Dopóki nie zmienisz ręcznie każdego sekretu, a większość serwisów tego nie ułatwia.
Sekrety w pakiecie nie wygasają. W przeciwieństwie do tokenu sesji (który wygasa), w przeciwieństwie do QR klucza dostępu (który jest jednorazowy) — ziarna w pakiecie migracji są ważne, dopóki nie zastąpisz ich serwis po serwisie.
Dlatego wynik naszego skanera dla każdego QR otpauth-migration:// zaczyna się od likely_dangerous i pozostaje tam niezależnie od kontekstu. Format jest w porządku; modelem zagrożeń jest sam fakt istnienia formatu.
Treść base64 po zdekodowaniu to bufor protokołu MigrationPayload z następującymi polami najwyższego poziomu:
otp_parameters, powtarzane. Jeden wpis na konto.
wersja, wersja schematu.
batch_size, łączna liczba fragmentów, gdy eksport jest podzielony na wiele QR.
batch_index, pozycja tego fragmentu.
batch_id, unikalny identyfikator łączący fragmenty razem.
Każdy wpis otp_parameters zawiera:
sekret, surowe bajty ziarna. To właściwy materiał klucza.
nazwa, etykieta konta (np. alice@acme.com).
wystawca, nazwa serwisu (np. ACME, GitHub).
algorytm, SHA1 / SHA256 / SHA512 / MD5.
cyfry, 6 lub 8 cyfr na kod.
typ, TOTP (oparty na czasie) lub HOTP (oparty na liczniku).
licznik, bieżąca wartość licznika dla wpisów HOTP.
Co pokazuje nasz skaner i czego celowo nie pokazuje
✓ Ujawniane
Dla każdego wpisu w pakiecie wynik pokazuje wystawcę (ACME, GitHub, AWS), nazwę konta (alice@acme.com), algorytm (SHA1), liczbę cyfr (6) i typ (TOTP). Ujawnienie wyników brzmi: Uprawnienia w tym pakiecie: ACME / alice@acme.com; GitHub / bob@github; AWS / root; — dzięki czemu użytkownik w trakcie migracji może przed importem sprawdzić listę.
Wersja schematu, indeks fragmentu, łączna liczba fragmentów i identyfikator fragmentu są również ujawniane — przydatne, gdy eksport jest podzielony na wiele QR.
✗ Nigdy nie dekodowane
Surowe bajty sekret nigdy nie są dekodowane w danych wyjściowych wyniku. Nasz analizator odczytuje je tylko w celu sprawdzenia, czy każdy wpis jest dobrze sformułowany (sekret obecny i niepusty), a następnie odrzuca wartość przed zbudowaniem wyników.
Potwierdza to zestaw testów — dostarczamy analizatorowi ręcznie zbudowane ładunki protobuf zawierające łańcuchy kanarkowe (SECRET_SEED_1, SECRET_SEED_2) i sprawdzamy, że te łańcuchy nigdy nie pojawiają się w zserializowanym wyniku. Regresja w tym miejscu kończy się niepowodzeniem CI.
Kiedy (i jak) go używać
Uzasadniony przypadek użycia: przesiadasz się na nowy telefon. STARY telefon wyświetla QR migracji na ekranie przez ok. 30 sekund. Aplikacja authenticatora na NOWYM telefonie kieruje się na ekran i importuje. Nikt inny nie jest w pomieszczeniu. Po potwierdzeniu, że wszystko zaimportowało, usuwasz eksport ze starego telefonu.
Niebezpieczne sytuacje to:
Zrzuty ekranu QR. Zrzut zapisany w zsynchronizowanych z chmurą zdjęciach umieszcza QR na każdym urządzeniu zsynchronizowanym z tym kontem.
Udostępnienie QR przez czat. Nawet chwilowo — każda osoba z dostępem do czatu (teraz lub później) może wyodrębnić pakiet.
Opublikowanie QR w wątku forum pomocy. To zdarza się częściej, niż można by sądzić; ludzie proszą o pomoc i przez pomyłkę dołączają zdjęcie eksportu z aplikacji authenticator.
Publiczne plakaty / tabliczki mylnie zidentyfikowane jako QR konfiguracyjne. Format jest wizualnie nieodróżnialny od QR konfiguracyjnego jednego konta.
Jeśli podejrzewasz, że QR migracji został ujawniony
Traktuj jako wyciek poświadczeń dla każdego konta w pakiecie. Kroki naprawcze w odpowiedniej kolejności:
Zaloguj się do każdej usługi, której dotyczy problem, i zmień sekret 2FA. Większość usług umożliwia to w sekcji Konto → Bezpieczeństwo → Uwierzytelnianie dwuskładnikowe → Wyłącz i ponownie zarejestruj.
Dla serwisów bez opcji rotacji (rzadkie, ale istnieje) — usuń i dodaj konto ponownie.
Sprawdź ostatnią aktywność logowania na każdym dotkniętym koncie.
Usuń oryginalny QR eksportu z każdego urządzenia i zsynchronizowanej z chmurą biblioteki zdjęć, w której mógł się znaleźć.
Atakujący z pakietem może generować ważne kody 2FA przez lata, dopóki nie wykonasz rotacji. Nie odkładaj tego.