È sicuro scansionare il QR di esportazione di Google Authenticator?
Solo se l'ha generato lei stesso, sul suo vecchio telefono, puntando il suo nuovo telefono verso lo schermo. Chiunque altro fotografi quel QR, per qualsiasi motivo, ottiene accesso permanente a ogni codice 2FA di ogni account nel pacchetto.
Google Authenticator e diverse app compatibili (Aegis, Raivo OTP, 2FAS) consentono di “esportare” gli account 2FA memorizzati per poterli trasferire su un nuovo dispositivo. L'esportazione assume la forma di un codice QR con un URI che inizia con otpauth-migration://. All'interno di tale URI c'è un unico pacchetto protocol-buffer (lo schema MigrationPayload di Google) che contiene tutti gli account insieme: emittente, nome dell'account, seme segreto, algoritmo, numero di cifre, tipo (HOTP / TOTP) e contatore.
Il formato era originariamente non documentato, ma è stato sottoposto a reverse engineering ed è ora il formato di interscambio de facto per i backup 2FA. Le app di autenticazione di terze parti riconoscono e importano lo stesso QR.
Un solo QR può contenere decine di account. Il QR è visivamente indistinguibile da un normale QR di configurazione TOTP: non c'è alcun segno visivo che indichi a un osservatore casuale che contiene l'intero pacchetto.
Perché un singolo QR di pacchetto è particolarmente pericoloso
Un normale QR di configurazione otpauth:// è pericoloso da scansionare se non l'ha richiesto lei, ma il raggio d'impatto è di un solo account. Il raggio d'impatto del QR di migrazione è ogni account presente nella sua app di autenticazione. Se un malintenzionato fotografa lo schermo che mostra questo QR, alle sue spalle in un bar, tramite una telecamera di sorveglianza che non aveva notato, attraverso una vetrata trasparente, se ne va con la capacità di aggirare la 2FA su ogni account coperto. In modo permanente. Finché non ruota manualmente ogni segreto, cosa che la maggior parte dei servizi non rende semplice.
Non esiste alcuna scadenza per i segreti contenuti nel pacchetto. A differenza di un token di sessione (che scade), a differenza di un QR di passkey (che è monouso), i semi in un pacchetto di migrazione restano validi finché non li sostituisce servizio per servizio.
Ecco perché il verdetto del nostro scanner su ogni QR otpauth-migration:// parte da likely_dangerous e vi rimane indipendentemente dal contesto. Il formato va bene; il modello di minaccia è l'esistenza stessa del formato.
Il corpo base64, una volta decodificato, è un protocol-buffer MigrationPayload con questi campi di primo livello:
otp_parameters, ripetuto. Una voce per account.
version, versione dello schema.
batch_size, numero totale di frammenti quando un'esportazione è suddivisa su più QR.
batch_index, la posizione di questo frammento.
batch_id, ID univoco che collega tra loro i frammenti.
Ogni voce otp_parameters contiene:
secret, i byte grezzi del seme. Questo è il vero materiale crittografico.
name, l'etichetta dell'account (ad es. alice@acme.com).
issuer, il nome del servizio (ad es. ACME, GitHub).
algorithm, SHA1 / SHA256 / SHA512 / MD5.
digits, 6 o 8 cifre per codice.
type, TOTP (basato sul tempo) o HOTP (basato su contatore).
counter, valore corrente del contatore per le voci HOTP.
Cosa mostra il nostro scanner e cosa deliberatamente non mostra
✓ Mostrato
Per ogni voce del pacchetto, il verdetto mostra l'emittente (ACME, GitHub, AWS), il nome dell'account (alice@acme.com), l'algoritmo (SHA1), il numero di cifre (6) e il tipo (TOTP). La descrizione del verdetto recita “Concessioni in questo pacchetto: ACME / alice@acme.com; GitHub / bob@github; AWS / root; …” in modo che un utente che STA effettuando una migrazione possa verificare l'elenco prima di importare.
Vengono mostrati anche la versione dello schema, l'indice del frammento, il numero di frammenti e l'ID del pacchetto, utili quando un'esportazione è suddivisa su più QR.
✗ Mai decodificato
I byte grezzi del secret non vengono mai decodificati nell'output del verdetto. Il nostro analizzatore li legge solo per verificare che ogni voce sia ben formata (segreto presente e non vuoto), poi scarta il valore prima di costruire i risultati.
Questo è garantito dalla suite di test: forniamo all'analizzatore payload protobuf creati ad hoc contenenti stringhe canary (SECRET_SEED_1, SECRET_SEED_2) e verifichiamo che tali stringhe non compaiano mai nell'output serializzato del verdetto. Una regressione in tal senso fa fallire la CI.
Quando (e come) usarne uno
Caso d'uso legittimo: sta passando da un telefono a un altro. Il VECCHIO telefono mostra il QR di migrazione sullo schermo per circa 30 secondi. L'app di autenticazione del NUOVO telefono inquadra lo schermo e importa. Non c'è nessun altro nella stanza. Lei elimina l'esportazione dal vecchio telefono dopo aver confermato che tutto è stato importato.
Le superfici di pericolo sono:
Screenshot del QR. Uno screenshot salvato in foto sincronizzate sul cloud mette il QR su ogni dispositivo sincronizzato con quell'account.
Condividere il QR in chat. Anche solo brevemente, chiunque abbia accesso alla chat (ora o in seguito) può estrarre il pacchetto.
Pubblicare il QR in una discussione di un forum di assistenza. Accade più spesso di quanto si pensi; le persone chiedono aiuto e pubblicano per errore una foto dell'esportazione della propria app di autenticazione.
Manifesti / cartelli pubblici scambiati per QR di configurazione. Il formato è visivamente indistinguibile da un QR di configurazione di un singolo account.
Se sospetta che un QR di migrazione sia stato esposto
Trattatelo come una fuga di credenziali su ogni account del pacchetto. I passaggi di ripristino, in ordine:
Acceda a ogni servizio interessato e ruoti il segreto 2FA. La maggior parte dei servizi consente di farlo in Account → Sicurezza → Autenticazione a due fattori → Disattiva e poi riattiva.
Per i servizi che non espongono la rotazione (rari ma esistono), rimuova e riaggiunga l'account.
Verifichi l'attività di accesso recente su ogni account interessato.
Elimini il QR di esportazione originale da ogni dispositivo e libreria di foto sincronizzata sul cloud che potrebbe averlo.
Un malintenzionato in possesso del pacchetto può generare codici 2FA validi per anni, finché non li ruota. Non rimandi.
Trascini l'immagine del QR nel nostro scanner, incolli l'URI otpauth-migration:// oppure usi la fotocamera. Il verdetto mostra ogni account del pacchetto senza mai decodificare i segreti.