O Android oferece vários indicadores de dispositivo que os administradores podem usar para determinar a postura de segurança de um dispositivo. Em um modelo de segurança de confiança zero, esses sinais são usados para avaliar se um dispositivo precisa ter permissão para acessar informações corporativas.
Engenharia de | Descrição | Dispositivos totalmente gerenciados | Perfil de trabalho em dispositivos da empresa | Perfil de trabalho em dispositivos pessoais (BYOD) | Dispositivos não gerenciados |
---|---|---|---|---|---|
API Play Integrity | Um agente
de confiança pode recuperar os seguintes indicadores:
|
Sim | Sim | Sim | Sim |
Hardware seguro presente / atestado de chaves | Um agente de confiança pode verificar se as credenciais de ICP foram geradas e armazenadas em hardware seguro | Sim | Sim | Sim | Sim |
Atestado de propriedades do dispositivo | Como parte do atestado de chaves, as propriedades do dispositivo podem ser incluídas como parte do registro de atestado. | Sim | Sim | Sim | Sim |
Nível do patch de segurança do dispositivo | Um agente de confiança pode validar o nível do patch de segurança do SO | Sim | Sim | Sim | Sim |
O dispositivo tem OTA pendente? | Um agente de confiança pode verificar se há uma atualização pendente do SO do dispositivo disponível. | Sim | Sim | Sim | N/A |
Nível do patch de segurança da linha principal | Um agente de confiança pode ler o nível do patch de segurança do trem principal instalado | Sim | Sim | Sim | Sim |
ID específico de inscrição | Um agente de confiança pode acessar um ID de dispositivo exclusivo específico para essa empresa. Esse ID sobrevive à recriação do perfil de trabalho e à redefinição do dispositivo para a configuração original. | Sim | Sim | Sim | N/A |
Estado de gerenciamento (e app de gerenciamento) | Um agente de confiança pode usar isso para determinar se um dispositivo é gerenciado | Sim | Sim | Sim | N/A |
Criptografia de disco | Um agente de confiança pode verificar se o dispositivo está criptografado (se for necessário suporte ao Android 8). | Sim | Sim | Sim | Sim |
Versão do SO | Um agente de confiança pode verificar a versão do SO do dispositivo e confirmar se ela excede uma determinada versão | Sim | Sim | Sim | Sim |
Estado da rede de acesso (estado da rede e estado do Wi-Fi) | Um agente de confiança pode receber informações sobre o estado ativo da rede (celular e Wi-Fi). | Sim | Sim | Sim | Sim |
Acessar o estado do Wi-Fi (Android 11 e versões anteriores, Android 12 e versões mais recentes oferecem suporte a uma abordagem de callback ou sob demanda) | Um agente de confiança pode receber informações sobre a rede Wi-Fi ativa | Sim | Sim | Sim | Sim |
Configurações de proxy | Um agente de confiança pode receber informações sobre as configurações de proxy HTTP padrão atuais. | Sim | Sim | Sim | Sim |
Verificação de qualidade do bloqueio de tela | Um agente de confiança pode garantir que um dispositivo tenha um bloqueio de tela de determinada qualidade configurado antes de conceder acesso | Sim | Sim | Sim | Sim |
Opções do desenvolvedor ativadas | Um agente de confiança pode identificar que um dispositivo tem uma superfície de ataque mais ampla quando as opções do desenvolvedor estão ativadas | Sim | Sim | Sim | Sim |
O DNS sobre TLS está ativado? | Um agente de confiança pode aproveitar isso para garantir que o modo de DNS particular seja ativado | Sim | Sim | Sim | Sim |
Navegação segura da SafetyNet | Um agente de confiança pode determinar se um URL específico foi classificado pelo Google como ameaça conhecida. | Sim | Sim | Sim | Sim |
Mídia externa montada | Um agente de confiança pode ser notificado quando um armazenamento externo é montado | Sim | Sim | Sim | Sim |
UsageStatsManager | Um agente de confiança pode estudar os padrões de uso de apps individuais | Sim | Sim | Sim | Sim1 |
Geração de registros de segurança | Um agente de confiança pode usar esses dados como parte do mecanismo contextual para garantir a conformidade e criar uma impressão digital baseada em comportamento | Sim | Sim2 | Sim2 | N/A |
Geração de registros de rede | Um agente de confiança pode usar esses dados como parte do mecanismo contextual para garantir a conformidade e criar uma impressão digital baseada em comportamento | Sim | Sim2 | Sim2 | N/A |
NetworkStatsManager | Um agente de confiança pode consultar o uso da rede do app em um determinado intervalo de tempo | Sim | Sim | Sim2 | Sim1 |
Visibilidade do pacote (lista de todos os apps no dispositivo) | Um agente de confiança pode consultar quais apps estão instalados no dispositivo | Sim | Sim3 | Sim3 | Sim |
Ler estado do telefone | Um agente de confiança pode receber informações sobre a rede móvel, o status de qualquer chamada em andamento e uma lista de PhoneAccount registrados no dispositivo. | Sim | Sim | Sim | Sim |
Quando o dispositivo foi reiniciado pela última vez | Um agente de confiança pode conferir o tempo de atividade | Sim | Sim | Sim | Sim |
Acessar contas | Um agente de confiança pode usar isso para acessar a lista de contas no serviço de contas | Sim | Sim3 | Sim3 | Sim1 |
Monitorar mudanças significativas no nível da bateria | Um agente de confiança pode monitorar mudanças significativas no nível da bateria | Sim | Sim | Sim | Sim |
Localização (fina, aproximada etc.) | Um agente de confiança pode acessar a localização física do dispositivo | Sim | Sim | Sim1 | Sim1 |
1 Com consentimento do usuário
2 Apenas no perfil de trabalho
3 Acesso limitado às informações do perfil de trabalho
Recuperar versão principal
Um agente de confiança pode acessar o PackageInfo para o
módulo com.google.android.modulemetadata
e extrair o
versionName
de lá:
private fun mainlineVersion(context: Context): String? {
val moduleProvider = "com.google.android.modulemetadata"
return try {
val pm = context.packageManager
val packageInfo = pm.getPackageInfo(moduleProvider, 0)
packageInfo.versionName
} catch (e: PackageManager.NameNotFoundException) {
null
}
}
É possível analisar a string retornada em um objeto Date
usando a
classe SimpleDateFormat
:
private val VERSION_NAME_DATE_PATTERNS = Arrays.asList(
"yyyy-MM-dd",
"yyyy-MM"
)
private fun parseDateFromVersionName(text: String): Date? {
for (pattern in VERSION_NAME_DATE_PATTERNS) {
try {
val simpleDateFormat = SimpleDateFormat(
pattern,
Locale.getDefault()
)
simpleDateFormat.timeZone = TimeZone.getDefault()
return simpleDateFormat.parse(text)
} catch (e: ParseException) {
// ignore and try next pattern
}
}
return null
}
Lembre-se de que, para o Android 11 e versões mais recentes, é necessário adicionar uma declaração de consulta no
arquivo AndroidManifest.xml
para atender à visibilidade do pacote do Android:
<manifest package="com.example.game"> <queries> <package android:name="com.google.android.modulemetadata" /> </queries> ... </manifest>
Recuperar o estado de gerenciamento
Um agente de confiança pode usar esses métodos para verificar se um dispositivo está no modo de gerenciamento e qual modo está ativo.
Verificar o gerenciamento de dispositivos
Use getActiveAdmins() para verificar se um dispositivo está sendo gerenciado. Se esse
método retornar null
, o dispositivo não será gerenciado.
Verificar se há um dispositivo totalmente gerenciado
Use isDeviceOwnerApp()
para verificar se o dispositivo é totalmente gerenciado.
Verificar o perfil de trabalho em um dispositivo da empresa
Use isOrganizationOwnedDeviceWithManagedProfile()
para verificar se um dispositivo
está usando o modo de gerenciamento do perfil de trabalho para dispositivos da empresa.
Verificar o perfil de trabalho em um dispositivo pessoal
Use isProfileOwnerApp() para verificar se um dispositivo tem um perfil de trabalho e
verificar se isOrganizationOwnedDeviceWithManagedProfile()
retorna false
.