
Sincronização segura das chaves
Quando um usuário ativa as Chaves do iCloud pela primeira vez em uma conta com autenticação de dois fatores, o dispositivo estabelece e cria uma identidade de sincronização para si. A identidade de sincronização consiste em chaves elípticas assimétricas (usando P-384), armazenadas nas chaves do dispositivo. Cada dispositivo mantém sua própria lista de identidades de sincronização dos outros dispositivos do usuário e assina essa lista usando uma de suas chaves de identidade. Essas listas são armazenadas no CloudKit, permitindo que os dispositivos do usuário cheguem a um consenso sobre como sincronizar com segurança os dados das chaves entre si.
Para compatibilidade com dispositivos iCloud mais antigos, um círculo de sincronização de confiança semelhante é criado e outra identidade de sincronização é formada. A chave pública da identidade de sincronização é colocada no círculo e o círculo é assinado duas vezes: primeiro pela chave privada da identidade de sincronização e depois por uma chave elíptica assimétrica (usando P-256) derivada da senha da conta do iCloud do usuário. Também armazenados no círculo estão os parâmetros (sal aleatório e iterações) usados para criar a chave baseada na senha do iCloud do usuário.
Armazenamento do círculo de sincronização no iCloud
No caso de contas com autenticação de dois fatores, a lista de dispositivos confiáveis de cada dispositivo é armazenada no CloudKit. As listas não podem ser lidas sem o conhecimento da senha do iCloud do usuário nem podem ser modificadas sem as chaves privadas do dispositivo que as possui.
De maneira semelhante, o círculo de sincronização assinado é armazenado na área de armazenamento de valores de chaves do iCloud do usuário e não pode ser lido sem o conhecimento da senha do iCloud do usuário nem pode ser modificado legalmente sem a chave privada da identidade de sincronização do seu integrante.
Como outros dispositivos de um usuário são adicionados ao círculo de sincronização
Novos dispositivos, ao iniciarem uma sessão no iCloud, passam a integrar o círculo de sincronização das Chaves do iCloud de uma destas duas maneiras: se emparelhando e sendo patrocinados por um dispositivo existente nas Chaves do iCloud ou pelo uso da recuperação das Chaves do iCloud.
Durante os fluxos de emparelhamento, o dispositivo solicitante cria novas identidades de sincronização tanto para o círculo de sincronização quanto para as listas de sincronização (no caso de contas com autenticação de dois fatores) e as apresenta ao patrocinador. O patrocinador adiciona a chave pública do novo integrante ao círculo de sincronização e a assina novamente com a identidade de sincronização e a chave derivada da senha do iCloud do usuário. O novo círculo de sincronização é colocado no iCloud, onde é assinado pelo novo integrante do círculo de maneira semelhante. Em contas com autenticação de dois fatores, o dispositivo patrocinador também fornece ao novo dispositivo um voucher assinado por suas chaves de identidade, mostrando que o dispositivo solicitante deve ser confiável. Em seguida ele atualiza sua lista de identidades de sincronização confiáveis para incluir o solicitante.
Agora há dois integrantes no círculo de sincronização e cada integrante possui a chave pública do outro dispositivo. Eles começam a trocar itens individuais das chaves através do CloudKit, ou armazenamento de valores de chaves do iCloud, seja qual for o mais apropriado à situação. Se os dois integrantes do círculo tiverem atualizações para o mesmo item, uma ou outra é escolhida, resultando em consistência. Cada item sincronizado é criptografado, de modo que possa ser descriptografado somente por um dispositivo dentro do círculo de confiança do usuário; ele não pode ser descriptografado por nenhum outro dispositivo ou pela Apple.
Conforme novos dispositivos passam a integrar o círculo de sincronização, esse “processo de integração” é repetido. Por exemplo, quando um terceiro dispositivo se junta, ele pode ser emparelhado com qualquer um dos dispositivos atuais. Conforme novos dispositivos são adicionados, cada um é sincronizado ao novo. Isso é projetado para garantir que todos os integrantes tenham os mesmos itens das chaves.
Apenas certos itens são sincronizados
Alguns itens das chaves são específicos de um dispositivo, como as chaves do iMessage, e portanto devem permanecer no dispositivo. Para evitar transporte de dados inesperados, todo item a ser sincronizado deve ser marcado explicitamente com o atributo kSecAttrSynchronizable
.
A Apple define esse atributo para os dados de usuário do Safari (incluindo nomes de usuários, senhas e números de cartão de crédito), além de senhas de Wi-Fi, chaves de criptografia do HomeKit e outros itens das chaves compatíveis com criptografia de ponta a ponta do iCloud.
Além disso, os itens das chaves adicionados por apps de terceiros não são sincronizados por padrão. Os desenvolvedores devem definir o atributo kSecAttrSynchronizable
ao adicionar itens às chaves.