
Sincronizzazione sicura del portachiavi
Quando l'utente crea per la prima volta un portachiavi iCloud, il dispositivo stabilisce una cerchia di attendibilità e crea una propria identità di sincronizzazione composta da una chiave pubblica e da una chiave privata, che viene poi salvata nel portachiavi del dispositivo. 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.
Per gli account protetti dall'autenticazione a due fattori, viene creata un'ulteriore cerchia di sincronizzazione simile, che viene salvata su CloudKit. In questo sistema, le identità dei dispositivi sono composte da due paia di chiavi ellittiche asimmetriche (con la curva P-384), anch'esse archiviate nel portachiavi. Ciascun dispositivo aggiorna il proprio elenco di identità affidabili e lo firma utilizzando una delle chiavi dell'identità.
Archiviazione su iCloud della cerchia di sincronizzazione
La cerchia di sincronizzazione firmata è salvata all'interno dell'area di archiviazione dei valori chiave di iCloud. 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.
Per gli account protetti dall'autenticazione a due fattori, l'elenco di sincronizzazione di ciascun dispositivo viene salvato su CloudKit. Non è possibile leggerli senza conoscere la password iCloud dell'utente né modificarli senza le chiavi private del dispositivo posseduto.
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 l'archivio chiave-valore di iCloud o li archiviano in CloudKit 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. Di conseguenza, 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
.