Sincronizzazione sicura del portachiavi
Quando l’utente attiva per la prima volta il portachiavi iCloud su un account con autenticazione a due fattori, il dispositivo stabilisce una propria identità di sincronizzazione L’identità di sincronizzazione è composta da chiavi ellittiche asimmetriche (con la curva P‑384), archiviate nel portachiavi del dispositivo. Ciascun dispositivo conserva un proprio elenco di identità di sincronizzazione degli altri dispositivi dell’utente e lo firma utilizzando una delle chiavi dell’identità. Questi elenchi vengono archiviati su CloudKit, consentendo ai dispositivi dell’utente di raggiungere un consenso su come sincronizzare in modo sicuro i dati del portachiavi tra di loro.
Per offrire compatibilità con dispositivi iCloud meno recenti, viene creata una cerchia di attendibilità simile e viene formata un’altra identità di sincronizzazione. La chiave pubblica dell’identità di sincronizzazione viene inserita nella cerchia, che viene firmata due volte: prima dalla chiave privata dell’identità, poi nuovamente con una chiave ellittica asimmetrica (con la curva P‑256) derivata dalla password dell’account iCloud dell’utente. Nella cerchia vengono memorizzati anche i parametri (random salt e iterazioni) utilizzati per creare una chiave basata sulla password iCloud dell’utente.
Archiviazione su iCloud della cerchia di sincronizzazione
Per gli account protetti dall’autenticazione a due fattori, l’elenco di dispositivi attendibili di ciascun dispositivo viene archiviato su CloudKit. Non è possibile leggerli senza conoscere la password iCloud dell’utente né modificarli senza le chiavi private del dispositivo posseduto.
In modo analogo, la cerchia di sincronizzazione firmata viene salvata nell’area di archiviazione chiave-valore di iCloud dell’utente. Non è possibile leggerla senza conoscere la password iCloud dell’utente né modificarla in maniera valida senza la chiave privata dell’identità di sincronizzazione del membro della cerchia.
Modalità di aggiunta degli altri dispositivi dell’utente alla cerchia di sincronizzazione
Durante l’accesso ad iCloud, i nuovi dispositivi possono unirsi alla cerchia di sincronizzazione del portachiavi iCloud in uno dei due modi seguenti: abbinandosi a uno dei dispositivi esistenti nel portachiavi iCloud, dal quale verranno sponsorizzati, oppure utilizzando il recupero del portachiavi iCloud.
Durante il flusso di abbinamento, il dispositivo richiedente crea nuove identità di sincronizzazione, sia per la cerchia che per gli elenchi (per gli account con l’autenticazione a due fattori) di sincronizzazione e le presenta al dispositivo principale. Questo aggiunge la chiave pubblica del nuovo membro alla cerchia di sincronizzazione e la firma nuovamente utilizzando sia la sua identità di sincronizzazione che la chiave derivata dalla password iCloud dell’utente. La nuova cerchia di sincronizzazione viene inserita in iCloud e firmata in maniera simile dal nuovo membro. Negli account con l’autenticazione a due fattori, il dispositivo principale fornisce al dispositivo richiedente anche un voucher firmato con le proprie chiavi dell’identità, che mostrano che il dispositivo richiedente può essere ritenuto attendibile. Quindi aggiorna il proprio elenco individuale di identità di sincronizzazione attendibili in modo da includere il dispositivo richiedente.
Ora nella cerchia di sincronizzazione ci sono due membri e ciascuno dispone della chiave pubblica dell’altro. A questo punto iniziano a scambiarsi singoli elementi del portachiavi attraverso CloudKit o attraverso l’archivio chiave-valore di iCloud a seconda dei casi. Se entrambi i membri della cerchia devono aggiornare lo stesso elemento, è possibile scegliere sia l’uno che l’altro, ottenendo sempre un risultato coerente. Ogni elemento sincronizzato viene crittografato in maniera tale che possa essere decrittografato solo da un dispositivo che faccia parte della cerchia di attendibilità dell’utente; non può essere decrittografato da nessun altro dispositivo né da Apple.
Ogni volta che un nuovo dispositivo si aggiunge alla cerchia di sincronizzazione, il processo descritto sopra si ripete. Ad esempio, se si dovesse aggiungere un terzo dispositivo potrebbe essere abbinato con uno qualsiasi dei dispositivi esistenti. Man mano che vengono aggiunti nuovi membri, ognuno di essi si sincronizza con quello nuovo. Questo meccanismo è progettato per garantire che tutti i membri abbiano gli stessi elementi nel portachiavi.
Solo determinati elementi vengono sincronizzati
Alcuni elementi del portachiavi sono specifici di ciascun dispositivo, come le chiavi di iMessage, pertanto devono rimanere sul dispositivo. Per impedire trasferimenti di dati inattesi, ciascun elemento che verrà sincronizzato deve essere contrassegnato esplicitamente con l’attributo kSecAttrSynchronizable
.
Apple imposta questo attributo per i dati utente di Safari (inclusi nomi utente, password e numeri di carte di credito) oltre che per le password Wi‑Fi, le chiavi di crittografia di HomeKit e per gli altri elementi del portachiavi che supportano la crittografia end-to-end di iCloud.
Inoltre, di default, non vengono sincronizzati gli elementi del portachiavi aggiunti da app di terze parti. Quando aggiungono elementi al portachiavi, gli sviluppatori devono impostare l’attributo kSecAttrSynchronizable
.