Vídeo: Story of the new Android banking Trojan-Cerberus at DefCamp 2019 (Novembro 2024)
Assinatura digital não está quebrada
O objetivo de assinar digitalmente um documento ou arquivo é provar que o arquivo não foi modificado. O processo usa uma forma de criptografia de chave pública. Você assina digitalmente um arquivo criptografando-o com sua chave privada. O fato de o arquivo criptografado poder ser descriptografado usando sua chave pública é a prova de que não houve violação. Se o BlueBox tivesse encontrado uma maneira de realmente modificar um arquivo sem alterar sua assinatura digital, isso seria um golpe impressionante para toda a indústria de criptografia. Mas eles não fizeram.
A BlueBox relatará todos os detalhes de suas pesquisas na conferência Black Hat em algumas semanas. No entanto, o pesquisador da ViaForensics, Pau Oliva Fora, publicou um código de prova de conceito que ilustra a abordagem adotada.
Na verdade, é muito, muito simples. Os arquivos APK são compactados usando uma versão do algoritmo de arquivamento ZIP generalizado. A maioria das implementações ZIP não permite dois arquivos com o mesmo nome em um arquivo, mas o próprio algoritmo não proíbe essa possibilidade. Ao verificar a assinatura digital de um aplicativo, o sistema operacional Android examina o primeiro arquivo correspondente, mas ao executar e iniciar o arquivo, ele pega o último . Para Trojanizar um aplicativo, então, tudo que você precisa fazer é calçar seu código malicioso usando um nome que já existe no aplicativo. A demonstração de Fora é apenas algumas dezenas de linhas de código Java.
Outro ataque estrutural
Um pesquisador chinês que fez um blog como Android Security Squad achou a demonstração intrigante e procurou outras maneiras de subverter o processo de verificação. Ler a postagem traduzida pelo Google é um pouco difícil, mas parece que o ataque se baseia em um conceito de nível 101 de Ciência da Computação.
Os programas de computador armazenam números contados em coleções de bits de tamanho fixo. Por exemplo, com oito bits, você pode representar números de 0 a 255. Se for necessário representar números negativos, a convenção de longa data é que o bit mais à esquerda indica um número negativo. Com oito bits, você também pode representar números de -128 a 127. O número binário 11111111 representa 255 ou -1, dependendo se ele pretende ser um número não assinado ou assinado.
O esquadrão de segurança do Android se debruçou sobre o formato do cabeçalho do arquivo APK e encontrou um campo de dados que é considerado um deslocamento positivo, mas que é armazenado como um número inteiro assinado. Forçar esse campo a um valor negativo específico faz com que o carregador de APK execute o código malicioso, em vez do código assinado digitalmente já verificado. OK, é um pouco mais complexo, mas é assim que funciona.
Fique com o Google Play
Nenhum desses hacks realmente subverte o mecanismo de assinatura digital do Android. Em vez disso, os dois se beneficiam das peculiaridades da estrutura do APK para tornar a assinatura digital irrelevante. Além disso, nenhum deles permitirá que um aplicativo Trojanized esgueire-se pela análise do Google. O Google atualizou especificamente o Google Play para filtrar aplicativos Trojanized usando o ataque "master key"; mesmo sem essa etapa, a segurança padrão quase certamente bloquearia qualquer tipo de aplicativo Trojanizado.
A lição é clara. Sempre obtenha seus aplicativos de fontes legítimas, sempre verifique se o nome do desenvolvedor é válido e configure seu telefone para que não permita a instalação de aplicativos de "fontes desconhecidas". Preste atenção nas permissões solicitadas por um aplicativo e esteja pronto para abortar uma instalação com aparência suspeita. Se sua operadora oferecer uma atualização do Android, sempre instale-a. É apenas senso comum!