Skip to main content

SourMint: código malicioso, fraude publicitario y filtración de datos en iOS

Escrito por
blog tumbnail

24 de agosto de 2020

0 minutos de lectura

ACTUALIZACIÓN: Además de los hallazgos que divulgamos originalmente, identificamos otros problemas tanto en las versiones para iOS como para Android del SDK. Lee más sobre los hallazgos actualizados y las reacciones de Apple, Google y la comunidad aquí.

El equipo de investigación de Snyk descubrió comportamientos maliciosos en un SDK de publicidad popular que usan más de 1,200 apps de la App Store, las cuales representan más de 300 millones de descargas al mes, según estimaciones de expertos de la industria.

El código malicioso se descubrió en las versiones para iOS del SDK del proveedor chino de plataformas de publicidad móvil Mintegral, y se remonta a julio de 2019. El código malicioso puede espiar la actividad de los usuarios al registrar las solicitudes basadas en URL que se realizan a través de la app. Esta actividad se registra en un servidor de terceros y podría incluir información de identificación personal (PII) y otra información confidencial. Además, el SDK reporta de forma fraudulenta los clics de los usuarios en anuncios, lo que roba posibles ingresos a las redes publicitarias de la competencia y, en algunos casos, al desarrollador o editor de la aplicación.


https://www.youtube.com/watch?v=MMuL5MaQeLM


Descripción general del código malicioso SourMint

El SDK de Mintegral se presenta como una herramienta para ayudar a los desarrolladores de apps y a los anunciantes a crear campañas de marketing monetizadas basadas en anuncios. Sin embargo, mediante nuestra investigación y en colaboración con expertos de la industria de la publicidad móvil, el equipo de Snyk descubrió que parte del código malicioso del SDK sirve para robar posibles ingresos de otras redes publicitarias que la aplicación podría estar usando y espiar cualquier solicitud basada en URL que se realice desde la aplicación.

Los desarrolladores pueden registrarse como editores y descargar el SDK desde el sitio de Mintegral. Una vez cargado, el SDK inyecta código en funciones estándar de iOS dentro de la aplicación, que se ejecutan cuando esta abre una URL, incluidos enlaces a la tienda de apps. Esto le da al SDK acceso a una cantidad significativa de datos e incluso, potencialmente, a información privada de los usuarios. El SDK también examina específicamente estos eventos de apertura de URL para determinar si la actividad se originó en el SDK de una red publicitaria de la competencia.

Es interesante señalar que el SDK de Mintegral también incluye varias protecciones contra la depuración que parecen diseñadas para impedir que los investigadores descubran el verdadero comportamiento de la aplicación. En el código hay una rutina específica que intenta determinar si el teléfono tiene acceso root y si se está usando algún tipo de depurador o herramienta de proxy. Si detecta señales de que está siendo monitoreado, el SDK modifica su comportamiento en un aparente intento por ocultar sus actividades maliciosas. Esto también podría ayudar al SDK a superar el proceso de revisión de apps de Apple sin ser detectado.

Diagrama de flujo que muestra cómo el SDK de Mintegral intercepta un clic en un anuncio, envía información falsa sobre el clic y recibe la atribución.
Figura 1: Flujo funcional del secuestro del clic de un usuario en un anuncio por parte del SDK de Mintegral

Fraude publicitario

El objetivo principal del código malicioso que Snyk descubrió en este SDK parece ser secuestrar los clics de los usuarios en los anuncios dentro de la app. En las aplicaciones móviles, los anuncios suelen mostrarse a través de redes publicitarias que el desarrollador integra en su código.

Los anunciantes pagan a las redes publicitarias para que muestren sus anuncios y se les cobra según el rendimiento del anuncio (es decir, la capacidad de lograr que los usuarios hagan clic en él para visitar el sitio del anunciante o instalar su aplicación). Los desarrolladores de apps reciben una parte de las ganancias que la red publicitaria obtiene de los anunciantes.

Es común que los editores de apps incluyan SDK de varias redes publicitarias en sus aplicaciones mediante mediadores de anuncios. Estos mediadores optimizan los ingresos del editor de anuncios al incluir varias redes publicitarias y luego seleccionar cuál usar para cada solicitud de anuncio, según las métricas de rendimiento de cada red.

Sin embargo, el SDK de Mintegral puede interceptar todos los clics en anuncios (y también otros clics en URL) dentro de la aplicación. Usa esta información para falsificar notificaciones de clics al proveedor de atribución. Las notificaciones falsificadas hacen parecer que el clic en el anuncio se originó en su red, aunque el anuncio podría haberlo mostrado una red publicitaria de la competencia.

Mintegral puede robar ingresos publicitarios de redes de la competencia principalmente de dos maneras. Primero, roba ingresos de los anunciantes que deberían haber recibido las otras redes publicitarias. Esto ocurre simplemente al atribuirse clics que no se hicieron en un anuncio mostrado por Mintegral. Este parece ser el objetivo principal de esta funcionalidad maliciosa.

Sin embargo, un efecto secundario sería que el desarrollador o el SDK mediador podría notar que Mintegral tiene un mejor rendimiento que las otras redes publicitarias, lo que generaría un sesgo a favor de seleccionar Mintegral sobre sus competidores.

También es posible que el desarrollador o editor de la aplicación pierda ingresos incluso cuando Mintegral no se usa para mostrar anuncios. En nuestra investigación, descubrimos que, una vez integrado en una aplicación, el SDK de Mintegral intercepta los clics incluso si Mintegral no está habilitado para mostrar anuncios. En este caso, los ingresos publicitarios que deberían haber llegado al desarrollador o editor a través de una red publicitaria de la competencia nunca se le pagan.

Riesgos para la privacidad por filtración de datos

Aunque el fraude publicitario parece ser el objetivo principal del código malicioso, quizá no sea su consecuencia más grave. En nuestra investigación, Snyk también descubrió que el SDK de Mintegral captura los detalles de todas las solicitudes basadas en URL que se realizan desde la aplicación comprometida.

Luego, la información de estas solicitudes, junto con otros datos del dispositivo y de la aplicación, se envía a un servidor remoto de registro. El SDK accede a una gran cantidad de información, entre ella:

  • la URL solicitada, que podría incluir identificadores u otra información confidencial

  • los encabezados de la solicitud, que podrían incluir tokens de autenticación y otra información confidencial

  • el lugar del código de la aplicación donde se originó la solicitud, lo que podría ayudar a identificar patrones de uso

  • el Identificador para Anunciantes (IDFA) del dispositivo, un número aleatorio único que se usa para identificarlo, y su identificador de hardware único, el IMEI.

Las solicitudes que captura el SDK incluyen URL web, solicitudes con esquemas de URL personalizados (controladores de protocolo) y llamadas a la tienda de apps desde la aplicación.

Más allá de la atribución de clics en anuncios, no está claro si estos datos se usan ni cómo se usan una vez que se cargan en el servidor de registro. Como mínimo, los datos capturados permitirían analizar en profundidad el recorrido del usuario dentro de la aplicación. Lo más preocupante es que, según la naturaleza de la aplicación comprometida, la URL y otros datos recopilados podrían exponer información privada. En última instancia, Mintegral podría monetizar estos datos al venderlos a terceros para realizar análisis de datos.

Esta funcionalidad que registra grandes cantidades de datos confidenciales de los usuarios llama especialmente la atención ante la creciente preocupación por la forma en que las aplicaciones móviles recopilan datos en general. Más recientemente, la aplicación TikTok ha sido objeto de un mayor escrutinio por sus prácticas de recopilación de datos.

Los intentos de Mintegral por ocultar la naturaleza de los datos que captura, tanto mediante controles antimanipulación como con una técnica de codificación propia, recuerdan funcionalidades similares reportadas por investigadores que analizaron la app TikTok.

En el caso de SourMint, el alcance de los datos recopilados supera lo necesario para una atribución legítima de clics. La app también usa métodos de codificación cuestionables para lograr este nivel de acceso a los datos.

Detalles técnicos del exploit y medidas de corrección

¿Cómo funciona este ataque con código malicioso? Veamos los detalles que descubrimos en nuestra investigación.

Los desarrolladores pueden descargar el SDK del sitio de Mintegral e incorporarlo en su aplicación. Cuando se inicializa, el SDK realiza varias solicitudes al servidor de Mintegral. Una de ellas recibe una respuesta JSON que contiene varios parámetros que el código malicioso de la aplicación usa directamente. Entre ellos:

  • un indicador para activar o desactivar la detección de manipulación o depuración

  • un indicador para habilitar los hooks que se usan para capturar y registrar los clics en URL

  • una URL (codificada) en la que se registrará la actividad de clics de los usuarios

El JSON de configuración obtenido también contiene un valor numérico que indica cuánto tiempo debe transcurrir antes de la siguiente actualización de la configuración. Esto indica que los ajustes del SDK pueden actualizarse de forma remota.

Como se mencionó antes, el SDK realiza algunas comprobaciones básicas para detectar manipulaciones. Busca las siguientes condiciones:

  • que la aplicación se esté ejecutando en un simulador

  • que haya un depurador conectado al proceso de la aplicación

  • que el teléfono tenga acceso root (mediante la búsqueda de varios archivos, incluida la app Cydia)

  • que el proxy esté habilitado

Si el SDK detecta que se cumple alguna de las condiciones anteriores, establece un indicador que se usa en otras funciones del SDK y modifica su comportamiento. Al parecer, este cambio desactiva la actividad maliciosa de reescribir URL y registrar datos de los usuarios. Por lo tanto, parece tratarse de un intento por evitar que se detecte la actividad maliciosa del SDK.

Durante la ejecución, el SDK usa el swizzling de métodos para inyectar código malicioso en las implementaciones de numerosos métodos y controladores. Estos hooks le permiten interceptar cualquier solicitud basada en URL que se realice desde la app, incluso las que ocurren fuera del SDK de Mintegral. Este es el paso crucial que permite al SDK recopilar la información necesaria sobre los clics de los usuarios para crear correctamente una notificación de clic al proveedor de atribución. Entre los métodos que el SDK reemplaza con su propio código se encuentra:

  • UIAplication OpenURL

  • UIAplication OpenURL:options: completionHandler (después de comprobar que la app se esté ejecutando en iOS 10.x o una versión superior)

  • NSURLProtocol

  • SKStoreProductViewController loadProductwithParameters:completionBlock

Cuando se llama a uno de los métodos anteriores, el código inyectado por el SDK realiza varias acciones. Primero, comprueba si está activado el indicador antimanipulación y, de ser así, omite todo el código posterior de Mintegral. Luego comprueba si la solicitud se originó en un anuncio de marketing publicado por Mintegral o si provino de un competidor de Mintegral. Si se originó en un anuncio de Mintegral, se ejecuta el controlador de método normal sin ninguna otra acción.

Si la solicitud se originó en un método que no es de Mintegral, el código recopila información sobre el evento, incluida la URL, los encabezados de la solicitud, la clase en la que se produjo el clic, el método en el que ocurrió y datos adicionales de la traza de ejecución. Estos datos de la solicitud, junto con otros datos del teléfono, se envían en un formato codificado al servidor de registro de Mintegral especificado en el archivo de configuración. Entre los datos registrados están:

  • Versión del sistema operativo

  • Dirección IP

  • estado de carga

  • Versión del SDK de Mintegral

  • tipo de red

  • modelo

  • nombre del paquete

  • IDFA

  • URL

  • encabezados de la solicitud

  • nombre del método

  • nombre de la clase

  • datos de la traza de ejecución

Una vez que los datos se registran en Mintegral, la ejecución del resto del método continúa con normalidad. Según los informes proporcionados por un proveedor de atribución, podemos confirmar que, en el back-end, Mintegral crea notificaciones de clics para los puntos de contacto que se produjeron a través de otras redes publicitarias.

Para descubrir esta información, el equipo de investigación de seguridad de Snyk agregó el SDK a una aplicación de prueba. Para evitar la detección de manipulaciones, interceptamos las comunicaciones de la aplicación en el punto de acceso inalámbrico mediante un proxy de intermediario (mitm.it). Snyk usó el desensamblador Hopper para investigar el código del SDK y analizar su funcionalidad. Pudimos identificar esta funcionalidad maliciosa en versiones del SDK desde la 5.5.1 (la versión actual al momento de escribir esto es la 6.4.0).

En última instancia, mediante nuestra propia investigación interna y la colaboración con organizaciones clave y expertos de la industria, pudimos confirmar el secuestro completo, de extremo a extremo, de los eventos de clics de los usuarios en anuncios.


Para obtener una descripción técnica aún más detallada del código que descubrimos y los métodos utilizados, visita nuestro informe de investigación.