Como posso verificar a autenticidade de um arquivo APK que baixei?

62

A atualização mais recente do Google Maps não está disponível no meu país, então eu baixei uma versão pesquisando no Google "Google Maps 5.4.0 apk". Na verdade, eu o encontrei, mas agora me pergunto como posso saber se essa é realmente a mesma versão do mercado.

Como posso ter certeza de que não foi adulterado? Os aplicativos são assinados de alguma forma? Existe alguma maneira de verificar as assinaturas?

Nathan Fellman
fonte
Se você visitar, no seu celular, a página m.google.com/maps:, ela oferece um link para download ou algo parecido?
Nicolás
@ Nicolás: É um link para o mercado, do qual não posso baixá-lo.
Nathan Fellman
Não é de surpreender que venha do google. A propósito, e sei que não estou respondendo à sua pergunta original, mas você testou o MapDroyd ?
Nicolás
@ Nicolás: eu não tenho, e eu realmente uso o Waze na minha navegação do dia a dia. Google Maps é apenas um exemplo. Google Livros é um outro exemplo, o Google Streetview outra (na verdade parece que apenas as aplicações Google dá-me este problema ...)
Nathan Fellman
11
Se você tiver um segundo aplicativo "autêntico" e for do mesmo fornecedor, poderá comparar se os dois aplicativos foram assinados usando as mesmas chaves / identidade: android.stackexchange.com/a/208326/2241
Robert

Respostas:

71

Evitando o debate sobre a legitimidade da instalação desse aplicativo no seu telefone, a questão da verificação é uma que pretendo entender há um tempo, e você me levou a tentar descobrir uma possível maneira de verificar quem assinou um apk.

Os aplicativos para Android são assinados da maneira normal dos arquivos .jar (.apk é realmente apenas um .jar especial, que é apenas um .zip especial), no entanto, pode não ser trivial rastrear a autenticidade dos certificados, a menos que você tenha algo conhecido como bom. comparado a. Isso é basicamente o que o telefone em si faz - verifica se algo que alega ser da mesma parte que já existe no telefone - o telefone não se recusa a instalar coisas com assinantes desconhecidos, apenas pode (se opor a / limpar o aplicativo dados de) falsificações aparentes quando algo novo não corresponde a algo antigo que alega.

Você precisará ter jarsigner e keytool. Acredito que eles vêm do JDK, que é um pré-requisito para o SDK do Android e não para o próprio SDK.

Primeiro, você deseja tentar verificar a chave pública contida no .apk. Normalmente, isso está no META-INF / CERTS.RSA, mas pode estar em outro arquivo - descompacte -l. Você quer ver o que pode descobrir sobre isso:

unzip -p suspect.apk META-INF/CERT.RSA | keytool -printcert

Isso vai despejar muitas informações sobre quem o assinante afirma ser. Aparentemente, alguns certificados são assinados por partes conhecidas, mas sem descobrir como rastrear isso, suspeito que você possa fazer algo assim:

unzip -p suspect.apk META-INF/CERT.RSA | keytool -printcert | grep MD5
unzip -p knowngood.apk META-INF/CERT.RSA | keytool -printcert | grep MD5

Se você possui um apk confiável conhecido do mesmo autor que usou o mesmo certificado. Estou assumindo que os certificados com a mesma soma MD5 são suficientes.

Supondo que você tenha decidido confiar no certificado, poderá ver se ele foi usado para assinar cada um dos arquivos no .apk

jarsigner -verbose -verify suspect.apk

(Se houver mais de um arquivo .RSA no arquivo morto, você deve adicionar o sinalizador -certs para informar quais certificados foram usados ​​para assinar cada arquivo, para ter certeza de que é o certificado que verificou)

Chris Stratton
fonte
9
Existe uma maneira de verificar se um determinado apk é igual ao oficial na loja Google Play?
Bryce
@ Bryce eu tenho a mesma pergunta. Você encontrou uma resposta?
Kaizer Sozay
@ Chris Stratton É possível copiar o apk do Google Maps de um dispositivo? Então, pode-se verificar as certs como você disse.
Kaizer Sozay 19/09/2015
Além disso, você pode extrair um APK de um dispositivo com o seguinte aplicativo: play.google.com/store/apps/details?id=com.ext.ui&hl=en Best, Paul. [Editado por Moderator Firelord]
Spipau 30/08/17
4

Existe (agora) uma apksignerferramenta build-toolsque faz o que você deseja. Dos documentos :

Verifique se as assinaturas do APK devem ser confirmadas como válidas em todas as plataformas Android suportadas pelo APK:

apksigner verify [options] app-name.apk
kahbou
fonte
1

Você também pode tentar fazer o upload do APK para o verificador de vírus VirusTotal.com gratuito . Ele gerará um hash exclusivo para o APK e, se outros já tiverem feito o upload para testá-lo (muito provavelmente), você terá mais uma idéia de que o APK é válido.

O serviço também analisará o APK com mais de 60 antivírus e informará se ele acredita que possui assinaturas semelhantes aos vírus já encontrados.

raddevus
fonte
0

Para comparar certificados de um arquivo apk suspeito, talvez uma idéia seja fazer o download da versão na Play Store oficial no seu telefone, fazendo um backup no seu computador e vá no diretório de backup, selecione o arquivo apk em questão e faça as mesmas verificações. Você também pode visualizar os certificados do Google fazendo a verificação em um aplicativo padrão do dispositivo (como qualquer com.google.android. * Apk)

Nozalys
fonte
0

A maneira correta de verificar um arquivo APK é usar apksigner.

apksigner faz parte das ferramentas de construção do Android, portanto, você pode encontrar várias versões instaladas, uma para cada versão das ferramentas de construção instalada.

Um caminho de exemplo no SDK do Android para apksigneré:

android-sdk/build-tools/29.0.2/apksigner

Execute o apksigner da seguinte maneira:

apksigner verify --verbose --print-certs "Signal-website-universal-release-4.49.13.apk"

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
Number of signers: 1
Signer #1 certificate DN: CN=Whisper Systems, OU=Research and Development, O=Whisper Systems, L=Pittsburgh, ST=PA, C=US
Signer #1 certificate SHA-256 digest: 29f34e5f27f211b424bc5bf9d67162c0eafba2da35af35c16416fc446276ba26
Signer #1 certificate SHA-1 digest: 45989dc9ad8728c2aa9a82fa55503e34a8879374
Signer #1 certificate MD5 digest: d90db364e32fa3a7bda4c290fb65e310
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 1024
Signer #1 public key SHA-256 digest: 75336a3cc9edb64202cd77cd4caa6396a9b5fc3c78c58660313c7098ea248a55
Signer #1 public key SHA-1 digest: b46cbed18d6fbbe42045fdb93f5032c943d80266
Signer #1 public key MD5 digest: 0f9c33bbd45db0218c86ac378067538d
<skipped a lot of warnings>

Agora você verificou o APK, mas ainda não sabe se pode confiar na pessoa / organização que assinou o arquivo APK. Isso ocorre porque no Android APK as assinaturas usam, por definição, certificados autoassinados. Se você pode confiar em um certificado, é uma pergunta difícil. A única maneira é verificar os outros aplicativos que foram assinados usando o mesmo certificado.

A única maneira que sei fazer isso é usar o serviço de rastreamento PlayStore androidobservatory.org. Possui uma API para verificar quais aplicativos foram assinados pelo mesmo certificado usando o resumo SHA-1 do certificado:

Edit: apkmirror.com também permite procurar o resumo do certificado. Basta digitar o resumo do certificado SHA-1 ou SHA-256 (sem dois pontos ou espaços) no campo de pesquisa:

Nesta página, você pode ver todos os outros arquivos APK da Google Play Store assinados com o mesmo certificado.

Robert
fonte