Acabei de instalar o Marshmallow em um Nexus 5 por meio de uma atualização por push. Estou confuso sobre o funcionamento da criptografia. Eu tenho um bom conhecimento técnico de criptografia em computadores. Gostaria de obter conhecimento semelhante sobre o Android 6.
A seguir, o que fiz e como fiquei confuso. Após uma redefinição de fábrica, configurei um PIN e criptografou o dispositivo. Na inicialização, ele solicitou meu PIN, o que era esperado. Em seguida, removi o PIN e reiniciei o dispositivo. Ele não solicitou nenhum PIN na inicialização, mas o dispositivo ainda se relatou como criptografado no menu de configuração. O último é o que me confunde, pois esperava que o PIN desbloqueie a chave de descriptografia.
Questões:
- No caso de criptografia sem PIN, de onde vem a chave de descriptografia? Presumo que ele esteja armazenado em um chip semelhante a um TPM, isso está correto? Em caso afirmativo, o que impede um hacker de solicitar essa chave do chip? Verifica o hash do firmware? Algo mais? Detalhes técnicos seriam muito apreciados.
- No caso de criptografia com um PIN, o PIN é usado como um token extra para acessar a chave de descriptografia? Ou o processo de descriptografia funciona exatamente como se não houvesse PIN.
Resposta TL; DL:
A chave de descriptografia é desbloqueada com todos os seguintes itens:
- O PIN (ou senha, etc.) ou uma senha padrão, se não houver
- Um TEE (um gerador de assinaturas suportado por hardware que usa chaves que não podem ser extraídas)
- Um sal (prontamente disponível, mas impedindo ataques de tabelas do arco-íris)
fonte
Respostas:
Estou citando o Manual do Android aqui , mas:
NOTA:
A fonte que usei não é diretamente relevante para o Marshmallow, mas é relevante para o Lollipop e superior.
TL: DR
Vou abordar as perguntas do OP agora. Detalhes técnicos seguirão.
A chave de criptografia padrão vem de uma fonte de hardware (um chip semelhante a um TPM) e a senha padrão do AOSP definida como
default_password
nocryptfs.c
arquivo de origem, veja abaixo.Sim, não apenas o padrão, mas qualquer senha é transformada em uma chave e armazenada em um chip semelhante ao TPM, chamado TEE (abreviação de "Trusted Execution Environment", veja abaixo para obter mais detalhes).
Um hacker com acesso UART / JTAG aos chips no SoC do dispositivo pode tecnicamente obter acesso à chave TEE, ou um kernel personalizado pode vazar essas informações para um hacker. Algumas agências de três letras em teorias da conspiração podem, possivelmente, formar uma parceria com o OEM para obter esses núcleos inseguros usados em dispositivos de produção, mas eu não colocaria muitas lojas nele. Mais uma vez, consulte a última seção desta resposta para obter mais detalhes.
A única coisa que impede um hacker de acessar a chave é a enorme quantidade de esforço necessária para isso.
dm-verity
. No entanto, isso é independente do status de criptografia.Fonte: Guia de segurança AOSP aqui .
Visão geral
Na primeira inicialização, o dispositivo cria uma chave mestra de 128 bits gerada aleatoriamente e a hash com uma senha padrão e sal armazenado. A senha padrão é: "default_password" No entanto, o hash resultante também é assinado por meio de um TEE (como o TrustZone), que usa um hash da assinatura para criptografar a chave mestra.
Você pode encontrar a senha padrão definida no arquivo cryptfs.c do Android Open Source Project .
Quando o usuário define o PIN / senha ou senha no dispositivo, apenas a chave de 128 bits é criptografada e armazenada novamente. (ou seja, alterações de PIN / senha / padrão do usuário NÃO causam re-criptografia da partição de dados do usuário.)
Iniciando um dispositivo criptografado com criptografia padrão
É o que acontece quando você inicializa um dispositivo criptografado sem senha. Como os dispositivos Android 5.0 são criptografados na primeira inicialização, não deve haver senha definida e, portanto, este é o estado de criptografia padrão.
Detecte que o dispositivo Android está criptografado porque / data não pode ser montado e um dos sinalizadores
encryptable
ouforceencrypt
está definido.vold
definevold.decrypt
comotrigger_default_encryption
, que inicia odefaultcrypto
serviço.trigger_default_encryption
verifica o tipo de criptografia para ver se / data está criptografado com ou sem uma senha.Cria o
dm-crypt
dispositivo sobre o dispositivo de bloco para que ele esteja pronto para uso.vold
monta a partição real / de dados descriptografada e prepara a nova partição. Ele define a propriedadevold.post_fs_data_done
como0
e, em seguida, definevold.decrypt
comotrigger_post_fs_data
. Isso fazinit.rc
com que seuspost-fs-data
comandos sejam executados . Eles criarão os diretórios ou links necessários e depois serão definidosvold.post_fs_data_done
como1
.Uma vez que
vold
vê a 1 em que a propriedade, ele define a propriedadevold.decrypt
de:trigger_restart_framework
. Isso fazinit.rc
com que iniciar serviços na classemain
novamente e também iniciar serviços na classe late_start pela primeira vez desde a inicialização.Agora, a estrutura inicializa todos os seus serviços usando os dados descriptografados / e o sistema está pronto para uso.
Iniciando um dispositivo criptografado sem criptografia padrão
É o que acontece quando você inicializa um dispositivo criptografado com uma senha definida. A senha do dispositivo pode ser um alfinete, padrão ou senha.
Detecte que o dispositivo Android está criptografado porque o sinalizador
ro.crypto.state = "encrypted"
vold
conjuntosvold.decrypt
paratrigger_restart_min_framework
porque os dados / é criptografado com uma senha.init
define cinco propriedades para salvar as opções de montagem inicial fornecidas para / data com parâmetros passados deinit.rc
.vold
usa essas propriedades para configurar o mapeamento criptográfico:ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(Número hexadecimal ASCII de 8 dígitos, precedido por 0x)A estrutura inicia e vê que
vold.decrypt
está definido comotrigger_restart_min_framework
. Isso informa à estrutura que ele está inicializando em umtmpfs /data
disco e precisa obter a senha do usuário.Primeiro, no entanto, ele precisa garantir que o disco esteja criptografado corretamente. Ele envia o comando
cryptfs cryptocomplete
paravold
.vold
retorna 0 se a criptografia foi concluída com êxito, -1 em erro interno ou -2 se a criptografia não foi concluída com êxito.vold
determina isso procurando nos metadados criptográficos doCRYPTO_ENCRYPTION_IN_PROGRESS
sinalizador. Se estiver definido, o processo de criptografia foi interrompido e não há dados utilizáveis no dispositivo.Se
vold
retornar um erro, a interface do usuário deverá exibir uma mensagem para o usuário reiniciar e redefinir o dispositivo de fábrica e dar ao usuário um botão para pressionar.Uma vez
cryptfs cryptocomplete
bem-sucedido, a estrutura exibe uma interface do usuário solicitando a senha do disco. A interface do usuário verifica a senha enviando o comandocryptfs checkpw
paravold
. Se a senha estiver correta (que é determinada montando com êxito o descriptografado/data
em um local temporário e desmontando-o), o vold salva o nome do dispositivo de bloco descriptografado na propriedadero.crypto.fs_crypto_blkdev
e retorna o status 0 para a interface do usuário. Se a senha estiver incorreta, ela retornará -1 à interface do usuário.Os puts UI até um gráfico de boot de criptografia e depois chama vold com o comando
cryptfs restart
.vold
define a propriedadevold.decrypt
comotrigger_reset_main
, o que causainit.rc
issoclass_reset main
. Isso interrompe todos os serviços damain
classe, o que permitetmpfs /data
que seja desmontado.vold
depois monta a/data
partição real descriptografada e prepara a nova partição (que talvez nunca tenha sido preparada se foi criptografada com a opção de limpeza, que não é suportada no primeiro release). Ele define a propriedadevold.post_fs_data_done
como0
e, em seguida, definevold.decrypt
comotrigger_post_fs_data
. Isso fazinit.rc
com que seja executadopost-fs-data commands
. Eles criarão os diretórios ou links necessários e depois serão definidosvold.post_fs_data_done
como1
. Depois devold
ver o1
nessa propriedade, ele define a propriedadevold.decrypt
comotrigger_restart_framework
. Isso fazinit.rc
com que os serviços em classe sejam iniciadosmain
novamente e também os serviços em classelate_start
pela primeira vez desde a inicialização.Agora, a estrutura inicializa todos os seus serviços usando o sistema de arquivos descriptografado / de dados e o sistema está pronto para uso.
Armazenando a chave criptografada
A chave criptografada é armazenada nos metadados de criptografia. O suporte de hardware é implementado usando o recurso de assinatura do Trusted Execution Environment (TEE). Anteriormente, criptografávamos a chave mestra com uma chave gerada aplicando
scrypt
a senha do usuário e o sal armazenado.Para tornar a chave resiliente contra ataques externos, estendemos esse algoritmo assinando a chave resultante com uma chave TEE armazenada. A assinatura resultante é então transformada em uma chave de tamanho apropriada por mais uma aplicação de
scrypt
. Essa chave é usada para criptografar e descriptografar a chave mestra. Para armazenar esta chave:scrypt
à senha do usuário e ao salt para produzir a chave intermediária 1 de 32 bytes (IK1).scrypt
no IK2 e no sal (o mesmo sal que na etapa 2) para produzir IK3 de 32 bytes.fonte