Engenharia reversa do aplicativo Subway para Android

É ótimo ver a crescente adoção da fixação de certificados em aplicativos Android. Quando encontro um aplicativo que gera erros de conexão ao tentar fazer solicitações de proxy, tendo a ficar mais interessado em me aprofundar mais. Esse foi o caso quando usei recentemente o aplicativo Subway. A reversão do APK revelou a fixação de certificados entre algumas outras descobertas interessantes.

Iniciar o aplicativo durante solicitações de proxy causou este erro:

A fixação é simples o suficiente para ignorar. Comecei descompilando o aplicativo e analisando o código-fonte para fixar palavras-chave. Na verdade, encontrei implementações de fixação em duas classes separadas que implementaram X509TrustManager. Aqui está um dos métodos que impuseram a fixação:

 // Code removed at request of Subway leadership

Ignorar isso foi tão simples quanto adicionar uma instrução de retorno no código smali para pular o código de fixação no método acima. Observe a adição do retorno vazio declaração abaixo:

 // Code removed at request of Subway leadership

Depois de recompilar o aplicativo e instalar, fiquei surpreso ao ver este novo erro:

Subway estava usando um processo personalizado de verificação de assinatura de aplicativo para evitar a reversão de seu APK. Pesquisando a fonte para menções a esse processo, rastreei-o até o seguinte método:

 // Code removed at request of Subway leadership

Esta foi uma tentativa interessante de impedir a engenharia reversa, embora na verdade tenha causado apenas um pequeno atraso. Para contornar esse processo, simplesmente adicionei uma linha para pular a execução do método adicionando outra retorno vazio linha, semelhante ao processo de desvio de fixação acima.

 // Code removed at request of Subway leadership

Depois de recompilar e instalar o aplicativo, consegui fazer proxy de solicitações com sucesso:

Durante minha pesquisa, me deparei com esta postagem do Reddit. Aparentemente, o Subway também estava determinando se o dispositivo do usuário estava enraizado. Pesquisei na fonte e confirmei menções a métodos de detecção de raiz.

 // Code removed at request of Subway leadership

Este é um ótimo exemplo de um aplicativo que leva a segurança muito a sério, mas não tenho muita certeza do raciocínio por trás do processo de verificação de root. Embora as técnicas de fixação de certificados e verificação de assinatura sejam geralmente uma boa ideia, elas impedem apenas ligeiramente o processo de engenharia reversa.