Aplicaciones inseguras se propagan entre usuarios de Android

Aplicaciones inseguras se propagan entre usuarios de Android

La mayoría de las descargas de estas aplicaciones inseguras para usuarios de Android se registran en tiendas no oficiales.

La mayoría de las descargas de estas aplicaciones inseguras para usuarios de Android se registran en tiendas no oficiales.

Durante los pasados meses hemos detectado desde el laboratorio de investigación de ESET Latinoamérica una anormal cantidad de detecciones de una variante móvil conocida como Android/Autoins. Esta familia de aplicaciones inseguras puede instalar automáticamente apps desde fuentes no confiables, siendo una puerta de entrada al dispositivo para amenazas de todo tipo.

Uno de los países más afectados por esta familia de aplicaciones es México, donde se concentran el 52% de las detecciones de Latinoamérica. En este país, el 74% de las detecciones corresponden a una variante en particular denominada Android/Autoins.C. La mayor parte de los ejecutables detectados como pertenecientes a esta familia se corresponden con tiendas no oficiales de aplicaciones.

En algunos casos, estas tiendas especifican a los usuarios que los ejecutables siendo distribuidos pueden haber sufrido alteraciones para remover anuncios o desbloquear funcionalidades pagas. Esto debiese ser lo suficientemente desalentador como para que los usuarios dejen de utilizar este tipo de tiendas de apps mayormente crackeadas y distribuidas a través de sitios de file hosting, sin embargo; pareciera que en México la tendencia de instalaciones va en aumento.

De hecho, si graficamos la distribución de detecciones en México y el mundo en los pasados meses, podemos ver cómo las detecciones regionales aumentan incluso más que los dos pasados años, mientras que internacionalmente parecen disminuir.

¿Cómo reducimos los riesgos de apps modificadas?

Usualmente, en Android resulta muy sencillo descompilar, modificar y recompilar el código de los aplicativos. Esto es incentivo suficiente para que muchos intenten quitar o desbloquear funcionalidades de apps con fallas de diseño. El problema es que el usuario promedio no puede determinar qué cambios se han realizado al ejecutable y, por tanto, no puede estar seguro de que no se hayan incluido comportamientos maliciosos.

Claro está que, si se está descargando una app crackeada con el propósito de acceder a funcionalidades pagas de forma gratuita, no solo se está pirateando software, sino que se sabe de antemano que la app ha sido modificada por un tercero no autorizado, con lo cual lo único que podemos hacer para asegurarnos que no se ha incluido código malicioso es realizar ingeniería inversa.

No obstante, existen escenarios donde resulta útil verificar que una aplicación no ha sido modificada, como cuando instalamos una ROM personalizada, una aplicación que no se distribuye en tiendas oficiales o que no está disponible en nuestra geolocalización. Entonces, podemos realizar algunas comprobaciones para aumentar la certeza de que una app no es maliciosa.

1. Verificar los certificados de una aplicación

En Android, cada aplicación posee un certificado que se construye con una clave conocida únicamente por el desarrollador de la aplicación. Mediante este certificado, la arquitectura de seguridad del sistema puede determinar qué permisos pueden otorgarse a esa aplicación y cuáles deben restringirse. Por ejemplo, una aplicación de sistema que se encuentre firmada con el certificado de Google tiene más privilegios que una app de usuario firmada por otro desarrollador y puede llegar a controlar funciones del dispositivo que estarían restringidas a aplicaciones de terceros.

Los certificados también permiten asegurarnos que las actualizaciones de una aplicación pertenecen al mismo desarrollador que la versión actualmente instalada y habilitan a los desarrolladores a crear permisos personalizados que puedan ser compartidos entre todas sus aplicaciones.

Por todo lo anterior, queda claro que si podemos verificar quién ha firmado la aplicación, podremos asegurarnos de que no ha sufrido modificaciones fraudulentas. Ahora bien, aunque extraer certificados es muy sencillo, puede ser complicado determinar con certeza la autenticidad de estos. Para comenzar, lo primero que necesitamos es un certificado genuino como punto de comparación.

Para obtenerlo, una opción es instalar la app original u otra del mismo desarrollador desde la Play Store en un emulador o en un dispositivo rooteado, para luego extraerla como ya explicamos en este artículo; o bien, descargarla desde el sitio oficial del desarrollador.

Para extraer el certificado que se encuentra en la carpeta META-INF del ejecutable, podemos convertir el APK a ZIP y desempaquetarlo o descompilar el APK con apktool.

apktool d sospechoso.apk

Si el desarrollador ha usado la misma clave para firmar todas sus aplicaciones, los hashes de los certificados de ambas aplicaciones deberían coincidir. Entonces, podemos acceder la información del certificado con el siguiente comando:

keytool –printcert –file /ruta/al/archivo/META-INF/CERT.RSA

A tener en cuenta: Es posible que el certificado tenga un nombre diferente a CERT.RSA.

Asumiendo que decidimos confiar en el certificado porque, por ejemplo, los hashes son iguales, entonces podemos también verificar que todos los elementos del APK fueron firmados con ese certificado utilizando el comando que vemos a continuación:

jarsigner –verbose –verify sospechoso.apk

El problema radica en que si el desarrollador cambió su clave, el hash será distinto. En este caso, al menos podremos chequear que el resto de los datos no sean genéricos y concuerden con los del certificado confiable. Es importante entender que estos datos pueden ser simulados por un cibercriminal que haya sido meticuloso al momento de replicar la app original, con lo cual no tendríamos garantía absoluta.

Certificado de una aplicación original extraída de la Play Store

Certificado de la misma aplicación descargada desde una tienda no oficial

Por suerte, gran parte de los cibercriminales no chequea que estos datos concuerden, por lo que usualmente se pueden encontrar nombres de desarrollador como “apktool”, “android”, texto sin sentido y otras cadenas genéricas que delatarán que el APK ha sido falsificado.

2. Chequear con repositorios de muestras maliciosas conocidas

Una alternativa complementaria es buscar muestras de malware conocidas que tengan el mismo certificado de la aplicación sospechosa. Para ello, podemos realizar una búsqueda en plataformas como Koodous indicando el hash del certificado y la etiqueta “detected” de la siguiente forma.

cert:<SHA-1-del-certificado> detected:true

Un ejemplo de búsqueda puede verse aquí.

También podemos utilizar servicios como VirusTotal para subir el archivo sospechoso y chequear su reputación.

Claro que, para asegurarnos de que una aplicación no es malware, siempre viene bien tener una solución de seguridad móvil instalada en el dispositivo para aumentar el nivel de protección de nuestros datos.

Chequeo de integridad en el desarrollo seguro

Dado que el certificado cumple una función tan relevante dentro del modelo de seguridad de Android, es necesario que los desarrolladores resguarden sus almacenes de claves con cuidado, intentando reducir al máximo el riesgo de fugas de información.

Además, las apps con arquitecturas de cliente-servidor debiesen realizar diferentes chequeos para comprobar que no se ha alterado el ejecutable, aplicando un proceso de diseño de desarrollo seguro. Entre ellas, se aconseja jamás distribuir aplicaciones en modo depuración, verificar la firma del certificado en tiempo de ejecución mediante PackageManager y chequear que el paquete que ha instalado la aplicación es la Play Store.

En lo posible, se recomienda también incluir técnicas antiemulación y antidebugging para dificultar el trabajo a cualquiera que quiera alterar la aplicación.

Discusión