¿Cómo puedo verificar la autenticidad de un archivo APK que descargué?

62

La última actualización de Google Maps no está disponible en mi país, así que descargué una versión buscando en Google "Google Maps 5.4.0 apk". De hecho, lo encontré, pero ahora me pregunto cómo puedo saber si esta es realmente la misma versión que en el mercado.

¿Cómo puedo estar seguro de que no ha sido manipulado? ¿Las aplicaciones están firmadas de alguna manera? ¿Hay alguna forma de verificar las firmas?

Nathan Fellman
fuente
Si visita, desde su dispositivo móvil, la página: m.google.com/maps¿le ofrece un enlace de descarga o algo similar?
Nicolás
@ Nicolás: se vincula al mercado, del cual no puedo descargarlo.
Nathan Fellman
No es de extrañar que provenga de google. Por cierto, y sé que no estoy respondiendo tu pregunta original, pero ¿has probado MapDroyd ?
Nicolás
@ Nicolás: no lo he hecho, y en realidad uso Waze para mi navegación diaria. Google Maps es solo un ejemplo. Google Books es otro ejemplo, Google Streetview es otro más (de hecho, parece que solo las aplicaciones de Google me dan este problema ...)
Nathan Fellman
1
Si tiene una segunda aplicación que es "auténtica" y proviene del mismo proveedor, puede comparar si ambas aplicaciones están firmadas con las mismas claves / identidad: android.stackexchange.com/a/208326/2241
Robert

Respuestas:

71

Dejando de lado el debate sobre la legitimidad de instalar esa aplicación en su teléfono, la cuestión de la verificación es algo que he querido entender por un tiempo, y me ha pedido que intente descubrir una posible forma de verificar quién firmó un apk.

Las aplicaciones de Android están firmadas de la manera normal de los archivos .jar (.apk es realmente un .jar especial que es solo un .zip especial), sin embargo, puede que no sea trivial rastrear la autenticidad de los certificados a menos que tenga algo conocido comparar con. Eso es básicamente lo que hace el teléfono en sí mismo: verifica que algo que dice ser de la misma parte que algo que ya está en el teléfono realmente es, el teléfono no se niega a instalar cosas con firmantes desconocidos, solo puede (objetar / borrar la aplicación datos de) falsificaciones aparentes cuando algo nuevo no coincide con algo viejo que afirma.

Necesitarás tener jarsigner y keytool. Creo que estos provienen del JDK, que es un requisito previo para el SDK de Android en lugar del SDK en sí.

Primero debes intentar verificar la clave pública contenida en el archivo .apk. Por lo general, esto está en META-INF / CERTS.RSA, pero puede estar en otro archivo: descomprima -l le dirá. Desea ver lo que puede averiguar al respecto:

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

Eso arrojará mucha información sobre quién dice ser el firmante. Aparentemente, algunos certificados están firmados por partes conocidas, pero sin descubrir cómo rastrear eso, sospecho que podría hacer algo como esto:

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

Si tiene un apk de confianza conocido del mismo autor que utilizó el mismo certificado. Supongo que los certificados que tienen la misma suma MD5 son suficientes.

Suponiendo que haya decidido confiar en el certificado, puede ver si se ha utilizado para firmar cada uno de los archivos dentro del archivo .apk

jarsigner -verbose -verify suspect.apk

(Si hay más de un archivo .RSA en el archivo, debe agregar el indicador -certs para indicar qué certificado (s) se han utilizado para firmar cada archivo, de modo que pueda estar seguro de que es el certificado que verificó)

Chris Stratton
fuente
99
¿Hay alguna manera de verificar que un apk dado sea el mismo que el oficial en la tienda Google Play?
Bryce
@Bryce tengo la misma pregunta. Encontraste una respuesta ?
Kaizer Sozay
@ Chris Stratton ¿Es posible copiar la aplicación Google Maps de un dispositivo? Entonces uno puede verificar los certificados como usted dijo.
Kaizer Sozay
Además, puede extraer un APK de un dispositivo con la siguiente aplicación: play.google.com/store/apps/details?id=com.ext.ui&hl=en Best, Paul. [Editado por Moderator Firelord]
Spipau
4

Hay (ahora) una apksignerherramienta build-toolsque hace lo que quieres. De los documentos :

Compruebe si se espera que las firmas del APK se confirmen como válidas en todas las plataformas de Android que el APK admite:

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

También puede intentar cargar el APK en el antivirus gratuito VirusTotal.com . Generará un hash único para el APK y si otros ya lo han subido para probarlo (muy probablemente), entonces tendrá más idea de que el APK es válido.

El servicio también escaneará el APK con más de 60 escáneres de virus y le informará si cree que tiene firmas similares a los virus ya encontrados.

raddevus
fuente
0

Para comparar certificados de un archivo apk sospechoso, tal vez una idea es descargar su versión en la Play Store oficial en su teléfono, hacer una copia de seguridad en su computadora e ir al directorio de copia de seguridad, seleccionar el archivo apk en cuestión y hacer las mismas comprobaciones. También puede ver los certificados de Google haciendo la verificación en una aplicación predeterminada del dispositivo (como cualquier com.google.android. * Apk)

Nozalys
fuente
0

La forma correcta de verificar un archivo APK es utilizarlo apksigner.

apksigner es parte de las herramientas de compilación de Android, por lo tanto, puede encontrar múltiples versiones instaladas, una para cada versión de herramientas de compilación instalada.

Un ejemplo de ruta dentro del SDK de Android apksigneres:

android-sdk/build-tools/29.0.2/apksigner

Ejecute apksigner de esta manera:

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>

Ahora ha verificado el APK, pero aún no sabe si puede confiar en la persona / organización que ha firmado el archivo APK. Esto se debe a que en las firmas de Android APK se utilizan por definición certificados autofirmados. Si puede confiar en un certificado, es una pregunta difícil. La única forma es verificar las otras aplicaciones que se han firmado con el mismo certificado.

La única forma en que sé hacerlo es usar el servicio de rastreo de PlayStore androidobservatory.org. Tiene una API para verificar qué aplicaciones han sido firmadas por el mismo certificado utilizando el resumen SHA-1 del certificado:

Editar: apkmirror.com también permite buscar el resumen del certificado. Simplemente ingrese el resumen de certificado SHA-1 o SHA-256 (sin dos puntos ni espacios) en el campo de búsqueda:

En esta página puede ver todos los demás archivos APK en Google Play Store que están firmados con el mismo certificado.

Robert
fuente