Análisis del código de MAX: qué datos recopila el servicio de mensajería y cómo funciona

Análisis del código de MAX: qué datos recopila el servicio de mensajería y cómo funciona

Uno de los miembros de la comunidad de GitHub publicó un repositorio de acceso público en el que realizó un análisis detallado del funcionamiento de la aplicación MAX y describió los mecanismos concretos que se usan para recopilar los datos de los usuarios. La investigación resultó lo suficientemente exhaustiva como para despertar interés no solo entre especialistas en seguridad, sino también entre un público más amplio. No llevé a cabo un análisis técnico independiente de la aplicación; este artículo se ha preparado sobre la base de esa investigación. Por tanto, mi material se considera no como una revelación original, sino como un relato y explicación de los hechos encontrados para quienes quieran entender la esencia de lo ocurrido sin necesidad de estudiar el código fuente por su cuenta.

La aplicación «Max» aparenta ser un mensajero moderno, listo para competir con líderes reconocidos gracias a comunicaciones «rápidas y ligeras», llamadas de calidad, stickers animados y la posibilidad de enviar archivos de hasta 4 GB. Está disponible prácticamente en todas partes: en Android a través de Google Play, RuStore y AppGallery, en iOS a través de App Store y en versiones de escritorio, y en el archivo AndroidManifest.xml corresponde al paquete ru.oneme.app. Sin embargo, bajo su envoltura pulida se oculta un sistema altamente intrusivo de «lectura», hábilmente camuflado por una profunda ofuscación del código y apoyado en un amplio conjunto de permisos y servicios en segundo plano.

Casi toda la funcionalidad crítica está agrupada en el módulo com.my.tracker, y parte de él se encuentra en el subpaquete com.my.tracker.obfuscated. Allí los nombres de clases, métodos y variables se reducen a abstracciones como e0, c1, y2, b3, f1 y llamadas de una sola letra a(), b(), c(), lo que prácticamente impide el análisis estático sin una deofuscación previa. Esta técnica suele emplearse ya sea para proteger secretos comerciales o para ocultar lógica cuestionable. En el caso de Max, los indicios del segundo escenario son especialmente claros: el rastreador recopila una telemetría muy detallada, sigue cada acción del usuario y puede enviar al servidor enormes volúmenes de datos personales y del sistema.

El archivo MyTracker.java actúa como fachada: los métodos estáticos públicos initTracker, trackEvent, trackAdEvent, trackPurchaseEvent, startAnytimeTimeSpent y decenas de otros delegan llamadas en la clase ofuscada c1, que a su vez interactúa con la infraestructura del rastreador. La inicialización solo requiere un ID y el contexto de la aplicación; después c1 comienza a almacenar eventos en búfer y a empaquetarlos en un formato interno mediante la clase f1, para luego enviarlos por la red en la primera oportunidad (el método e0.c() comprueba la conexión e inicia la descarga).

Las categorías de datos recopilados impresionan por su alcance. 

  • Eventos de interacción: clics en anuncios, compras en Google Play y AppGallery con transmisión del ID del artículo, precio, moneda y parámetros arbitrarios, invitaciones, registros, inicios de sesión, lanzamientos, progresos por niveles, actividad en miniaplicaciones, eventos de seguimiento personalizados a elección de los desarrolladores y el tiempo exacto pasado en la aplicación o en un escenario concreto. 
  • Información personal: edad, sexo, identificadores de usuario (incluyendo customUserId y sus matrices), direcciones de correo electrónico, números de teléfono, ID de ICQ, ID de OK, ID de VK, VK Connect ID, así como el idioma de la interfaz y una gran cantidad de identificadores especiales MRGS. Cualquiera de estos parámetros se puede leer y escribir; además, mediante setCustomParam el desarrollador puede enviar literalmente cualquier «clave-valor», ampliando el volumen de información recopilada de forma indefinida. 
  • Atribución: el rastreador registra deep links, de dónde llegó el usuario a la aplicación, calcula la fuente de instalación y almacena información sobre instalaciones preinstaladas, incluidas las de socios externos.

Para que esta máquina funcione sin fallos necesita los permisos correspondientes. El manifiesto está organizado como el catálogo de deseos de una aplicación especialmente insaciable. Los permisos INTERNET, ACCESS_NETWORK_STATE y ACCESS_WIFI_STATE son solo la base. A continuación aparecen:

  • ACCESS_FINE_LOCATION y ACCESS_COARSE_LOCATION para geolocalización precisa y aproximada, 

  • CAMERA y RECORD_AUDIO para acceso a la cámara y al micrófono,

  • BLUETOOTH* para control completo de conexiones inalámbricas, 

  • READ_CONTACTS y WRITE_CONTACTS para manejo completo de los contactos, 

  • READ_PHONE_NUMBERS para lectura del número del dispositivo, 

  • todo un conjunto de *_STORAGE y READ_MEDIA_* para acceso a archivos y contenido multimedia, 

  • GET_ACCOUNTS / MANAGE_ACCOUNTS / USE_CREDENTIALS para manipulaciones con cuentas, 

  • POST_NOTIFICATIONS para notificaciones push, 

  • REQUEST_INSTALL_PACKAGES para la instalación de APK externos, 

  • SYSTEM_ALERT_WINDOW para mostrarse por encima de todas las ventanas, 

  • WAKE_LOCK y DISABLE_KEYGUARD para control de energía y del bloqueo, 

  • FOREGROUND_SERVICE y, lo que resulta especialmente preocupante, foregroundServiceType="microphone|camera|location|mediaProjection|mediaPlayback|dataSync". Esta última bandera significa que la aplicación puede, en segundo plano, grabar sonido, vídeo, movimientos e incluso capturar la pantalla, notificando al usuario solo de forma formal sobre la «actividad en segundo plano».

La arquitectura de los componentes está diseñada para anclarse de forma permanente. El BroadcastReceiver BootCompletedReceiver responde al arranque completo del sistema y despierta automáticamente la aplicación. Para tareas continuas se usan los servicios en primer plano SystemForegroundService y CallServiceImpl. El primero obtiene acceso al micrófono, la cámara, el GPS y la sincronización de datos; el segundo además puede capturar la pantalla. El servicio ContactsSyncService se registra como adaptador de sincronización de contactos, lo que permite extraer regularmente la agenda. LinkInterceptorActivity intercepta enlaces HTTP/HTTPS relacionados con dominios propios, lo que no solo facilita los deep links sino que también permite analizar o modificar el tráfico dentro del ecosistema de «Max».

Merece atención por separado la posibilidad de captura de pantalla mediante mediaProjection. Si el servicio está declarado en el manifiesto, el código dentro de CallServiceImpl o clases adyacentes puede iniciar la captura del contenido de la pantalla en cualquier momento oportuno. La combinación con el micrófono crea las condiciones para la grabación silenciosa de llamadas y videoconferencias, y la bandera mediaPlayback sugiere la posibilidad de reproducir un flujo de audio propio sobre otras aplicaciones.

El intento de examinar manualmente las clases ofuscadas e0 y f1 muestra solo la punta del iceberg. e0 forma paquetes parciales, registra estados intermedios (createAndStorePartialPacket: start / writeResult=…), supervisa el búfer y llama al envío por red cuando hay conexión. f1 gestiona la estructura del paquete: añade nuevos elementos, vacía el búfer tras una entrega exitosa y reconstruye paquetes en caso de errores. La lógica de entrega está abstraída, pero aparece MyTrackerConfig.OkHttpClientProvider dentro del código, lo que indica que el transporte está construido sobre OkHttp, que soporta proxies, interceptores personalizados, TrustManagers propios y ajustes de tiempo flexibles. Si los desarrolladores quisieran eludir la verificación de certificados TLS o suplantar el tráfico, dispondrían de los enganches necesarios.

Al mismo tiempo, el manifiesto no muestra un parcheo directo del sistema ni el uso de privilegios root. No hay WRITE_SECURE_SETTINGS, ni MOUNT_UNMOUNT_FILESYSTEMS, ni BIND_DEVICE_ADMIN, ni menciones a binarios su. Pero la necesidad de exploits desaparece cuando el usuario concede voluntariamente un conjunto tan generoso de permisos: la aplicación obtiene acceso total a sensores y datos mediante las API estándar. Y los servicios garantizan la continuidad de la vigilancia: el dispositivo puede estar en reposo, la pantalla apagada, y «Max» seguirá transmitiendo en silencio coordenadas, audio y vídeo a sus servidores.

Por encima de la vigilancia del sistema, la aplicación registra cuidadosamente el propio contenido del mensajero. En las estructuras protobuf ru.ok.tamtam.nano se encontraron campos lastInput, lastInputEditMessageId, lastInputMedia y lastInputReplyMessageId: se trata del historial de las últimas acciones en el campo de entrada, incluidos borradores y referencias a medios. Así, incluso los mensajes no enviados o eliminados antes de publicarse pueden permanecer para siempre en el backend.

Tampoco se puede ignorar la capacidad de instalar APK externos. REQUEST_INSTALL_PACKAGES por sí sola no es peligrosa mientras el usuario no confirme la instalación, pero combinada con SYSTEM_ALERT_WINDOW y notificaciones persistentes puede organizarse un ataque de ingeniería social: mostrar una ventana sobre la aplicación activa, presentar una «actualización obligatoria» y convencer al usuario de pulsar «Instalar». En cuanto la víctima acepte, «Max» ampliará sus privilegios con otro módulo, que potencialmente podría eludir las restricciones de la tienda.

En resumen, puede afirmarse que «Max» no es solo un mensajero, sino una plataforma multicomponente con funciones muy llamativas. El código está ofuscado, la estructura de los paquetes está cuidadosamente protegida y los permisos permiten actuar casi sin limitaciones. Formalmente, el usuario acepta estas condiciones al instalar la aplicación y conceder permisos, pero la relación entre las funciones ofrecidas y los datos descargados resulta claramente desproporcionada.

En la práctica, cualquier usuario de «Max» lleva en el bolsillo un sensor que registra sus desplazamientos, comunicaciones, compras e incluso pensamientos fugaces no destinados a enviarse. Técnicamente esto se realiza con medios legítimos de Android, sin exploits ni root, pero la escala resulta alarmante: basta con ejecutar el mensajero una vez para que se registre en el inicio automático, mantenga constantemente acceso al micrófono, la cámara y el GPS y pueda actualizarse por sí mismo mediante módulos externos.

Alt text