Oggi siamo su Product Hunt! Lascia un commento
Authenticator 1.16.0 è disponibile. Scopri le novità
Una panoramica tecnica per chi valuta la sicurezza. Tutto quello che c'è qui è verificabile sul codice sorgente — comprese le parti che ci fanno meno bella figura, che dichiariamo invece di ometterle.
L'estensione è un'estensione Chrome Manifest V3 che genera i codici TOTP localmente con OTPAuth. Generare i codici, archiviare gli account e cifrarli non richiede alcun backend, e non esistono account utente. Gestiamo un solo server, api.authenticator.sh, per il piano gratuito e Pro — descritto più avanti — e non riceve mai un segreto, il nome di un account, un emittente o un codice.
Quel server non custodisce materiale crittografico per gli account di nessuno: non c'è deposito di chiavi né alcun percorso di recupero controllato da noi. Se un utente dimentica la password e perde il codice di recupero, non possiamo aiutarlo: è una scelta progettuale.
La protezione con password è facoltativa e disattivata per impostazione predefinita. Quando è attiva:
I dati non vengono mai cifrati direttamente con una chiave derivata dalla password. Una chiave principale casuale cifra i record; l'output di PBKDF2 si limita a incapsulare quella chiave principale. Ne discendono due conseguenze, entrambe rilevanti:
Con la protezione con password attiva viene cifrato l'intero record dell'account tranne identificatore e impronta — nome del servizio compreso, così un profilo rubato non rivela presso quali servizi l'utente ha un account. All'attivazione l'estensione cifra i record, li verifica decifrandoli e confrontandoli e solo allora rimuove ogni copia in chiaro: archiviazione locale del browser, sincronizzazione e tutte e sette le istantanee di backup a rotazione.
Lo diciamo chiaramente, perché conta per la vostra valutazione:
In breve: questo protegge i dati a riposo. Non difende, e non può difendere, un dispositivo già sotto il controllo di un attaccante mentre viene usato.
Il manifest dichiara cinque permessi e nessun permesso host:
Non ci sono Non ci sono content script, né permessi tabs, cookies o webRequest, né web-accessible resources. Niente di nostro esiste in una pagina finché non ci chiedi un codice; ciò che viene eseguito allora è iniettato per quella scheda e quella invocazione, sotto l'autorizzazione che concede il tuo stesso clic, e non lascia nulla dietro di sé.
La scansione dei QR con la fotocamera gira su una pagina dell'estensione aperta in una scheda, non nel popup: un popup viene distrutto quando perde il focus, ed è esattamente ciò che fa una richiesta di permesso. Per questo non serve alcun permesso nel manifest: si usa la normale richiesta di accesso alla fotocamera del browser, concessa per origine dell'estensione e revocabile nelle impostazioni del sito, e non compare mai finché l'utente non apre lo scanner. Il video è decodificato localmente e non viene mai trasmesso né memorizzato.
Dalla 1.14.0 l'estensione contatta api.authenticator.sh una volta al giorno — all'avvio del browser o dopo che il popup è stato visualizzato, mai sul percorso che porta a mostrare un codice. La richiesta è un elenco chiuso di campi, costruito in un'unica funzione in src/billing/sync.ts e vincolato a quell'elenco da un test:
Mai inviati: segreti, nomi degli account, emittenti, codici o i siti in cui vengono usati. Il paese viene ricavato dalla richiesta già sull'edge del server, e l'indirizzo IP non viene memorizzato. La pagina di disinstallazione riceve lo stesso ID di installazione come ?i=: segnala al server che l'installazione è stata rimossa e vi collega una risposta facoltativa al sondaggio.
Conservati a questo scopo in chrome.storage.local: l'ID di installazione, l'ultima policy e l'ultima licenza firmate, la chiave di licenza che ha questa installazione (digitata, oppure ricevuta dopo un acquisto fatto da qui), i conteggi giornalieri delle aperture finché il server non li ha ricevuti e gli eventi in coda — nessun dato degli account. Con la sincronizzazione attiva finiscono in Chrome Sync anche l'informazione se l'installazione è anteriore alla fatturazione e quella chiave di licenza, così gli altri profili Chrome dell'utente li ricevono e attivano Pro da soli; disattivare la sincronizzazione li toglie entrambi da Chrome Sync, riattivarla li rimette.
Cosa torna indietro, e come lo tratta l'estensione:
Il limite non è un DRM: il codice è open source e un fork può rimuoverlo. Ciò che non deve mai essere possibile è che una persona ottenga o usi la licenza di un'altra, o renda limitata l'installazione di qualcun altro: sarebbe una vulnerabilità, e rientra nell'ambito della nostra policy di sicurezza.
Due tipi di richiesta partono di propria iniziativa: il controllo dell'orologio e il contatto giornaliero per la fatturazione. Tutto il resto qui sotto avviene perché l'utente ha fatto clic. Manifest V3 vieta il codice remoto, e nulla di quanto segue trasporta account, chiavi segrete o codici generati. L'elenco completo:
| Host | Quando | Trasporta dati dell'utente? |
|---|---|---|
| time.akamai.com timeapi.io cloudflare.com | Controllo dello scarto dell'orologio, con cache; se nessuna fonte è raggiungibile, le Impostazioni lo dicono. Con l'orologio sfasato il TOTP smette di funzionare. | No |
| authenticator.sh | Pagina di benvenuto all'installazione; pagina di feedback alla disinstallazione, con l'ID di installazione nell'indirizzo; pagine di aiuto e assistenza quando vengono aperte dal popup. | L'ID di installazione, solo sulla pagina di disinstallazione; altrimenti no (normali log del server web) |
| api.authenticator.sh | Contatto giornaliero per la fatturazione; chiamate di checkout, licenza e portale quando l'utente acquista Pro, inserisce una chiave, ripristina un acquisto o gestisce un abbonamento. | I campi elencati sopra, mai dati degli account. Una chiave di licenza o un indirizzo email solo quando l'utente ne digita uno |
| checkout.stripe.com billing.stripe.com | Stripe Checkout e portale clienti, aperti in una scheda quando l'utente acquista Pro o gestisce un abbonamento. | Ciò che l'acquirente vi inserisce. Valgono le condizioni di Stripe e di Link |
| chromewebstore.google.com | Pagina dello store, aperta in una nuova scheda solo al clic: il modulo di recensione dalla richiesta di valutazione. | No (per Google è la visita a una pagina dello store come un'altra) |
Nessun font, script, foglio di stile o immagine viene caricato da host di terze parti. Tutto ciò che serve a disegnare l'interfaccia è dentro il pacchetto.
Non dovete credere sulla parola a nulla di quanto sopra. L'estensione è open source e ogni rilascio è riproducibile:
.crx pubblicato dal Chrome Web Store e decomprimetelonpm ci && npm run build su Node 20 LTSdist/ ottenuto con il pacchetto decompressoCon ogni release su GitHub pubblichiamo uno SHA-256 per ciascun file del dist/ prodotto, come SHA256SUMS-v<version>.txt e in formato sha256sum: il passo 4 si riduce quindi a una sola esecuzione di sha256sum -c. Le differenze dovrebbero limitarsi all'ordine dei file dentro gli archivi e agli spazi nell'output minificato tra versioni patch di Node.
Le dipendenze a runtime sono volutamente poche — OTPAuth, React, jsQR, Zustand, Framer Motion e Lucide — fissate da un lockfile versionato. Un SBOM CycloneDX è disponibile su richiesta.
Leggere il codice sorgenteSiamo un piccolo fornitore indipendente. Se uno dei punti seguenti è un requisito vincolante per il vostro processo, è meglio saperlo ora che dopo tre settimane di valutazione:
Quello che offriamo in cambio è piena trasparenza del codice, una build verificabile, una superficie di permessi minima e un server al quale i vostri segreti, i nomi degli account e i codici non vengono inviati affatto.
Segnalazioni di vulnerabilità e domande sulla sicurezza: security@authenticator.sh. La nostra policy di divulgazione, l'ambito, i tempi di risposta e le condizioni di safe harbour sono nella pagina policy di sicurezza; cosa viene memorizzato e cosa lascia il dispositivo è descritto nell'informativa sulla privacy.
Rispondiamo volentieri a un questionario scritto di valutazione fornitori o ripercorriamo il codice insieme a un team di sicurezza.
Per tutto ciò che non riguarda la sicurezza — installazione, recupero dell'account, domande di fatturazione legate a un rollout — vedete il supporto. Vi preghiamo di non inviare lì segnalazioni di vulnerabilità: quella casella non è trattata come riservata.