Är Google Authenticator-export-QR säker att skanna?
Bara om du genererade den själv, på din egen gamla telefon, med din nya telefon riktad mot skärmen. Vem som helst som fotograferar QR-koden — av någon anledning — får permanent tillgång till varje 2FA-kod för varje konto i paketet.
Google Authenticator och flera kompatibla appar (Aegis, Raivo OTP, 2FAS) låter dig ”exportera” dina lagrade 2FA-konton så att du kan flytta dem till en ny enhet. Exporten tar formen av en QR-kod med en URI som börjar med otpauth-migration://. Inuti den URI:en finns ett enda protokollbuffertpaket (Googles MigrationPayload-schema) som innehåller alla konton på en gång — utfärdare, kontonamn, hemligt seed, algoritm, sifferantal, typ (HOTP / TOTP) och räknare.
Formatet var från början odokumenterat, men det har blivit reverse-engineerat och är nu det faktiska utbytesformatet för 2FA-säkerhetskopior. Autentiseringsappar från tredje part känner igen och importerar samma QR.
En QR-kod kan innehålla dussintals konton. QR-koden är visuellt oskiljbar från en vanlig TOTP-installations-QR — det finns ingen visuell markering som berättar för en tillfällig observer att den innehåller hela paketet.
Varför en enda paket-QR är unikt farlig
En vanlig otpauth://-installations-QR är farlig att skanna om du inte begärde det — men skade-rådien är ett konto. Migrerings-QR:ens skade-rådie är varje konto i din autentiseringsapp. Om en angripare fotograferar skärmen som visar QR-koden — över axeln på ett café, via en övervakningskamera du inte märkte, genom ett genomskinligt glasfönster — går de därifrån med förmågan att kringgå 2FA på varje konto det omfattar. Permanent. Tills du roterar varje hemlighet manuellt, vilket de flesta tjänster inte gör enkelt.
Det finns inget utgångsdatum på hemligheterna i paketet. Till skillnad från en sessionstoken (som löper ut), till skillnad från en passkey-QR (som är éngangs), gäller seeds i ett migreringspaket tills du ersätter dem tjänst för tjänst.
Det är därför vår skannares utslåg på varje otpauth-migration://-QR börjar på troligen_farlig och stannar där oavsett sammanhang. Formatet är okej; hotmodellen är formatets existens.
Base64-kroppen, när den avkodas, är en MigrationPayload-protokollbuffert med dessa fält på toppnivå:
otp_parameters, upprepade. En post per konto.
version, schemaversion.
batch_size, totalt antal delar när en export delas upp i flera QR-koder.
batch_index, denna delens position.
batch_id, unikt ID som kopplar samman delarna.
Varje otp_parameters-post har:
secret, de råa seed-bytesen. Det är den faktiska nyckelmängen.
name, kontoetikett (t.ex. alice@acme.com).
issuer, tjänstens namn (t.ex. ACME, GitHub).
algoritm, SHA1 / SHA256 / SHA512 / MD5.
digits, 6 eller 8 siffror per kod.
type, TOTP (tidsbaserad) eller HOTP (räknarebaserad).
counter, aktuellt räknevärde för HOTP-poster.
Vad vår skanner visar, och vad den avsiktligt inte visar
✓ Visas
För varje post i paketet visar utslåget utfärdaren (ACME, GitHub, AWS), kontonamnet (alice@acme.com), algoritmen (SHA1), antalet siffror (6) och typen (TOTP). Utslågets avtäckning läser ”Beviljanden i detta paket: ACME / alice@acme.com; GitHub / bob@github; AWS / root; …” så att en användare som är mitt i en migrering kan granska listan innan import.
Schemaversion, paketindex, paketstorlek och paket-ID visas också — användbart när en export delas upp i flera QR-koder.
✗ Avkodas aldrig
De råa secret-bytesen avkodas aldrig i utslågsutdatan. Vår analysator läser dem bara för att verifiera att varje post är välformad (hemlighet finns + ej tom) och kasserar sedan värdet innan findings byggs.
Detta håvdas av testsviten — vi matar analysatorn med handgjorda protobuf-nyttolaster som innehåller kanärstreckar (SECRET_SEED_1, SECRET_SEED_2) och håvdar att dessa strängar aldrig visas i den serialiserade utslågsutdatan. En regression där misslyckas CI.
När (och hur) man använder en
Legitimt användningsfall: du uppgraderar från en telefon till en annan. Den GAMLA telefonen visar migrations-QR på skärmen i ca 30 sekunder. Den NYA telefonens autentiseringsapp siktar på skärmen och importerar. Ingen annan är i rummet. Du raderar exporten från den gamla telefonen efter att ha bekräftat att allt importerades.
Riskytorna är:
Skärmbilder av QR-koden. En skärmbild sparad i molnsynkroniserade foton placerar QR-koden på varje enhet synkad till det kontot.
Dela QR-koden via chatt. Även kortvarigt kan vem som helst med tillgång till chatten (nu eller senare) extrahera paketet.
Publicera QR-koden i ett hjälpforumsminne. Det händer oftare än man tror; människor ber om hjälp och publicerar ett foto av sin autentiseringsexport av misstag.
Offentliga affischer/skyltning felidentifierade som installations-QR:er. Formatet är visuellt oskiljbart från en QR för ett enda konto.
Om du misstanker att en migrations-QR har exponerats
Behandla det som en läckage av autentiseringsuppgifter på varje konto i paketet. Återgångsstegen, i ordning:
Logga in på varje påverkad tjänst och rotera 2FA-hemligheten. De flesta tjänster låter dig göra detta under Konto → Säkerhet → Tvåfaktorsautentisering → Avaktivera sedan återinrullera.
För tjänster som inte exponerar rotation (sällsynt men finns), ta bort och lägg till kontot igen.
Granska den senaste inloggningsaktiviteten på varje påverkat konto.
Radera den ursprungliga export-QR:en från varje enhet + molnsynkroniserat fotobibliotek som kan ha den.
En angripare med paketet kan producera giltiga 2FA-koder i år tills du roterar. Skjut inte upp det.
Släpp in QR-bilden i vår skanner, klistra in otpauth-migration://-URI:en eller använd kameran. Utslåget visar varje konto i paketet utan att någonsin avkoda hemligheterna.