O Android oferece vários indicadores 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 indicadores são usados para avaliar se um dispositivo pode acessar informações corporativas.
Recurso | Descrição | Dispositivos totalmente gerenciados | Perfil de trabalho em dispositivos corporativos | Perfil de trabalho em dispositivos pessoais (BYOD) | Dispositivos não gerenciados |
---|---|---|---|---|---|
API Play Integrity | Um mediador de
confiança pode extrair os seguintes indicadores:
|
Sim | Sim | Sim | Sim |
Atestado de chave / hardware seguro presente | Um intermediário 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 chave, 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 intermediário de confiança pode validar o nível do patch de segurança do SO. | Sim | Sim | Sim | Sim |
O dispositivo tem uma OTA pendente | Um intermediário 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 principal | Um intermediário de confiança pode ler o nível do patch de segurança do trem de linha principal instalado. | Sim | Sim | Sim | Sim |
ID específico da inscrição | Um intermediário 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 broker de confiança pode usar isso para determinar se um dispositivo é gerenciado | Sim | Sim | Sim | N/A |
Criptografia de disco | Um intermediário de confiança pode verificar se o dispositivo está criptografado (se o suporte ao Android 8 for necessário) | 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 é superior a uma determinada versão | Sim | Sim | Sim | Sim |
Acesso ao estado da rede (estado da rede e estado do Wi-Fi) | Um intermediário de confiança pode receber informações sobre o estado da rede ativa (celular e Wi-Fi) | Sim | Sim | Sim | Sim |
Acessar o estado do Wi-Fi (Android 11 e versões anteriores, o Android 12 e versões mais recentes oferecem suporte a uma abordagem callback ou sob demanda) | Um broker de confiança pode receber informações sobre a rede Wi-Fi ativa | Sim | Sim | Sim | Sim |
Configurações de proxy | Um Trust broker pode receber informações sobre as configurações atuais do proxy HTTP padrão. | Sim | Sim | Sim | Sim |
Verificação de qualidade do bloqueio de tela | Um intermediário 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 um dispositivo como tendo 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 intermediário de confiança pode usar isso para garantir que o modo DNS particular esteja ativado. | Sim | Sim | Sim | Sim |
Navegação segura do SafetyNet | Um intermediário de confiança pode determinar se um URL específico foi classificado pelo Google como uma 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 Trust broker pode estudar os padrões de uso de apps individuais. | Sim | Sim | Sim | Sim1 |
Registro de segurança | Um intermediário de confiança pode aproveitar esses dados como parte do mecanismo contextual para garantir a conformidade e criar uma impressão digital baseada no comportamento. | Sim | Sim2 | Sim2 | N/A |
Registro de rede | Um intermediário de confiança pode aproveitar esses dados como parte do mecanismo contextual para garantir a conformidade e criar uma impressão digital baseada no comportamento. | Sim | Sim2 | Sim2 | N/A |
NetworkStatsManager | Um broker de confiança pode consultar o uso de rede do app em um determinado intervalo de tempo. | Sim | Sim | Sim2 | Sim1 |
Visibilidade do pacote (listar todos os apps no dispositivo) | Um broker de confiança pode consultar quais apps estão instalados no dispositivo | Sim | Sim3 | Sim3 | Sim |
Ler o estado do smartphone | Um broker de confiança pode receber informações da rede móvel, o status de chamadas em andamento e uma lista de PhoneAccount registradas no dispositivo. | Sim | Sim | Sim | Sim |
Quando o dispositivo foi reiniciado pela última vez | Um broker de confiança pode receber o tempo de atividade do sistema | Sim | Sim | Sim | Sim |
Acessar as 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 intermediário de confiança pode monitorar mudanças significativas no nível da bateria | Sim | Sim | Sim | Sim |
Localização (precisa, aproximada etc.) | Um intermediário de confiança pode acessar a localização física do dispositivo | Sim | Sim | Sim1 | Sim1 |
1 Com consentimento do usuário
2 Somente perfil de trabalho
3 Acesso limitado às informações do perfil de trabalho
Recuperar a versão principal
Um intermediário de confiança pode acessar o PackageInfo do
módulo com.google.android.modulemetadata
e extrair o
versionName
:
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 intermediário de confiança pode usar esses métodos para verificar se um dispositivo está no modo de gerenciamento e qual modo de gerenciamento está ativo.
Verificar o gerenciamento de dispositivos
Use getActiveAdmins() para verificar se um dispositivo está sob gerenciamento. Se esse
método retornar null
, o dispositivo não será gerenciado.
Verificar se o 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 um modo de gerenciamento de perfil de trabalho para dispositivos corporativos.
Verificar o perfil de trabalho em um dispositivo pessoal
Use isProfileOwnerApp()
para verificar se um app está sendo executado em um perfil
de trabalho e confira se isOrganizationOwnedDeviceWithManagedProfile()
retorna
false
.