Sinais de confiança zero

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:
  • Integridade do dispositivo
  • Integridade do app
  • Detalhes da licença do Google Play
  • Detalhes do ambiente, incluindo o novo veredito do Play Protect
  • 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

    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>
    

    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.