Uma pequena história sobre como a conveniência às vezes dispara no joelho

Artem Azariev, Chefe do Centro de Competência em Canais de Serviço Remoto da Diretoria de Tecnologias da Informação do CID

Olá Habr!

Meu nome é Artem Azariev, sou líder de equipe da equipe Android do Moscow Credit Bank e hoje quero falar sobre segurança de aplicativos do ponto de vista das bibliotecas de depuração. Há alguns anos, trabalhei como freelancer e, por quatro, participei do desenvolvimento completo de um sistema operacional móvel. Aconteceu que, nos anos em que fui freelancer, para melhorar minhas próprias qualificações, toquei no tópico de engenharia reversa de aplicativos Android e, gradualmente, ele se tornou meu hobby.

1. Introdução


Não é segredo que, por um longo tempo, o Android Studio não apresentou mecanismos para receber adequadamente dados de aplicativos do dispositivo: o conteúdo do banco de dados, SharedPrefrences, solicitações de rede. Todos sofreram, incluindo gigantes como o Facebook.

Foram eles que deram à comunidade uma biblioteca extremamente útil para depurar o Shetho (https://github.com/facebook/stetho) com integração muito simples ao projeto em apenas algumas linhas. Não vou falar sobre a própria biblioteca; provavelmente, muitas pessoas já a conhecem, mas quem se importa, elas leem por conta própria.

Integração da biblioteca é a seguinte:





Usando o navegador Chrome, temos acesso ao conteúdo dos bancos de dados e às configurações armazenadas no dispositivo. Se conectarmos o plug-in para okhttp3, também ao conteúdo das solicitações de rede.



"Mas ei, também estará na versão de lançamento?" - o desenvolvedor atento se perguntará. Vamos voltar à descrição da biblioteca - o que somos aconselhados sobre isso?

O projeto de amostra mostra que essa biblioteca precisa ser inicializada apenas na ramificação de depuração, sobrecarregando o manifesto em uma das opções de compilação.



Montamos o assembly de liberação com a minificação ativada (sinalizador minifyEnabled). Estamos verificando o navegador, não vemos nenhum aplicativo disponível para depuração e vamos dormir silenciosamente.

Minificação é um processo que visa reduzir o tamanho do código fonte, removendo caracteres desnecessários sem alterar sua funcionalidade. A ferramenta Proguard usada no Android também está envolvida na limpeza do projeto do código não utilizado.

Hackers


Qualquer engenharia reversa do aplicativo começa com o estudo de possíveis indicadores e backdoors que os desenvolvedores gentilmente deixaram para si.

Primeiro, descompilamos o aplicativo em Java o máximo possível e estudamos a árvore de pacotes.



A coisa mais doce que pode ser encontrada no aplicativo atacado é o bom e velho Stetho. A minificação configurada por padrão não a remove e, em geral, toda a base de código dessa biblioteca simplesmente arrasta para uma construção de produção.

Vi muitos aplicativos de empresas razoavelmente legais e grandes que deixaram essa biblioteca em compilações de produção por muitos anos.

Alguém perguntará: “E o que é isso? Está desligado. Além disso, mesmo se você ativá-lo, tente criar este aplicativo mais tarde. ”

É verdade que descompilar em Java quase nunca fornece 100% de código de trabalho. Mas há smali / backsmali.
Smali / backsmali é um montador / desmontador para o formato dex usado pelo dalvik, uma implementação da Java VM no Android.

Dizasemblirovav nossa aplicação, vamos ver que não há realmente nada sobre.



Mas, depois de adicionar algumas linhas e incluir no projeto todo o código da biblioteca, nós, sem forçar muito, podemos ativá-lo novamente.



Para o plugin okhttp3, o suporte também é ativado da mesma maneira - adicionando um Interceptor ao OkhttpClient.

Depois de coletar o aplicativo de volta (e é fácil fazê-lo na smali), vemos que a depuração através do stetho está novamente disponível e todos os seus dados no repositório de configurações locais, toda a sua API está completamente diante dos olhos de hackers astutos.

O que fazer?


Existem muitas opções para excluir o pacote da compilação final. Pessoalmente, prefiro escrever um pequeno invólucro para inicializar a biblioteca Stetho e decompor suas várias implementações de acordo com as opções de montagem.
liberação



depurar



E também indica que essa base de código é necessária apenas na compilação de depuração.



Pode expirar


Gostaria de concluir expressando os princípios básicos que utilizo ao trabalhar no contexto da segurança de aplicativos Android:

  • Minimize e, se possível, ofusque tudo o que você recebe.

    Em qualquer caso, complica a análise do código compilado. Um argumento adicional para criar cabelos grisalhos na cabeça do hacker será o sinalizador de reembalagem das classes, que moverá as classes minificadas em um único pacote. Haverá muitos deles.
  • Explore seus próprios aplicativos.

    Pelo menos uma inspeção superficial da árvore dos seus pacotes pode dizer muito sobre a estrutura usada no projeto, estruturas, bibliotecas. Aquilo que obviamente não pertence a esse lugar deve ser removido sem piedade.
  • Qualquer ferramenta pode, mais cedo ou mais tarde, dar um tiro em seu joelho.

Ao adicionar algo ao seu projeto, mesmo por boas razões, pense em como fazê-lo corretamente e quanto você precisa.

Espero que minha experiência seja útil para você.

Source: https://habr.com/ru/post/pt471738/


All Articles