macOS Keychain
Main Keychains
O User Keychain (
~/Library/Keychains/login.keycahin-db
), que é usado para armazenar credenciais específicas do usuário como senhas de aplicativos, senhas da internet, certificados gerados pelo usuário, senhas de rede e chaves públicas/privadas geradas pelo usuário.O System Keychain (
/Library/Keychains/System.keychain
), que armazena credenciais de sistema como senhas de WiFi, certificados raiz do sistema, chaves privadas do sistema e senhas de aplicativos do sistema.
Password Keychain Access
Esses arquivos, embora não tenham proteção inerente e possam ser baixados, são criptografados e requerem a senha em texto claro do usuário para serem descriptografados. Uma ferramenta como Chainbreaker pode ser usada para descriptografia.
Keychain Entries Protections
ACLs
Cada entrada no keychain é regida por Listas de Controle de Acesso (ACLs) que ditam quem pode realizar várias ações na entrada do keychain, incluindo:
ACLAuhtorizationExportClear: Permite que o portador obtenha o texto claro do segredo.
ACLAuhtorizationExportWrapped: Permite que o portador obtenha o texto claro criptografado com outra senha fornecida.
ACLAuhtorizationAny: Permite que o portador execute qualquer ação.
As ACLs são acompanhadas por uma lista de aplicativos confiáveis que podem realizar essas ações sem solicitação. Isso pode ser:
N
il
(nenhuma autorização necessária, todos são confiáveis)Uma lista vazia (ninguém é confiável)
Lista de aplicativos específicos.
Além disso, a entrada pode conter a chave ACLAuthorizationPartitionID
, que é usada para identificar o teamid, apple, e cdhash.
Se o teamid for especificado, então, para acessar o valor da entrada sem um prompt, o aplicativo usado deve ter o mesmo teamid.
Se o apple for especificado, então o aplicativo precisa ser assinado pela Apple.
Se o cdhash for indicado, então o aplicativo deve ter o cdhash específico.
Creating a Keychain Entry
Quando uma nova entrada é criada usando Keychain Access.app
, as seguintes regras se aplicam:
Todos os aplicativos podem criptografar.
Nenhum aplicativo pode exportar/descriptografar (sem solicitar ao usuário).
Todos os aplicativos podem ver a verificação de integridade.
Nenhum aplicativo pode alterar as ACLs.
O partitionID é definido como
apple
.
Quando um aplicativo cria uma entrada no keychain, as regras são um pouco diferentes:
Todos os aplicativos podem criptografar.
Somente o aplicativo criador (ou qualquer outro aplicativo explicitamente adicionado) pode exportar/descriptografar (sem solicitar ao usuário).
Todos os aplicativos podem ver a verificação de integridade.
Nenhum aplicativo pode alterar as ACLs.
O partitionID é definido como
teamid:[teamID aqui]
.
Accessing the Keychain
security
security
APIs
A enumeração e extração do keychain de segredos que não gerarão um prompt pode ser feita com a ferramenta LockSmith
Liste e obtenha informações sobre cada entrada do keychain:
A API
SecItemCopyMatching
fornece informações sobre cada entrada e há alguns atributos que você pode definir ao usá-la:kSecReturnData
: Se verdadeiro, tentará descriptografar os dados (defina como falso para evitar possíveis pop-ups)kSecReturnRef
: Obtenha também referência ao item do keychain (defina como verdadeiro caso mais tarde você veja que pode descriptografar sem pop-up)kSecReturnAttributes
: Obtenha metadados sobre as entradaskSecMatchLimit
: Quantos resultados retornarkSecClass
: Que tipo de entrada do keychain
Obtenha ACLs de cada entrada:
Com a API
SecAccessCopyACLList
você pode obter a ACL para o item do keychain, e ela retornará uma lista de ACLs (comoACLAuhtorizationExportClear
e as outras mencionadas anteriormente) onde cada lista tem:Descrição
Lista de Aplicativos Confiáveis. Isso pode ser:
Um app: /Applications/Slack.app
Um binário: /usr/libexec/airportd
Um grupo: group://AirPort
Exporte os dados:
A API
SecKeychainItemCopyContent
obtém o texto em claroA API
SecItemExport
exporta as chaves e certificados, mas pode ser necessário definir senhas para exportar o conteúdo criptografado
E estes são os requisitos para poder exportar um segredo sem um prompt:
Se 1+ aplicativos confiáveis listados:
Necessita das autorizações apropriadas (
Nil
, ou ser parte da lista de aplicativos permitidos na autorização para acessar as informações secretas)Necessita que a assinatura de código corresponda ao PartitionID
Necessita que a assinatura de código corresponda à de um aplicativo confiável (ou ser membro do grupo KeychainAccessGroup correto)
Se todos os aplicativos confiáveis:
Necessita das autorizações apropriadas
Necessita que a assinatura de código corresponda ao PartitionID
Se sem PartitionID, então isso não é necessário
Portanto, se houver 1 aplicativo listado, você precisa injetar código nesse aplicativo.
Se apple estiver indicado no partitionID, você poderia acessá-lo com osascript
então qualquer coisa que esteja confiando em todos os aplicativos com apple no partitionID. Python
também poderia ser usado para isso.
Dois atributos adicionais
Invisible: É um sinalizador booleano para ocultar a entrada do aplicativo UI do Keychain
General: É para armazenar metadados (portanto, NÃO É CRIPTOGRAFADO)
A Microsoft estava armazenando em texto claro todos os tokens de atualização para acessar endpoints sensíveis.
Referências
Last updated