La marca SHEIN no es ajena a la polémica, entre otras cosas por una filtración de datos en 2018 que su entonces empresa matriz Zoetop no supo detectar, y mucho menos detener, y que luego gestionó de forma deshonesta.
Como dijo Letitia James, fiscal general del estado de Nueva York, en una declaración a finales de 2022:
Las pobres medidas de ciberseguridad de SHEIN y [la marca hermana] ROMWE facilitaron a los ciberdelincuentes el robo de los datos personales de los consumidores. […]
Se robaron datos personales y Zoetop intentó encubrirlo. No proteger los datos personales de los consumidores y mentir sobre ello no está de moda. SHEIN y ROMWE deben reforzar sus medidas de ciberseguridad para proteger a los consumidores del fraude y la usurpación de identidad.
En el momento de la sentencia del tribunal de Nueva York, expresamos nuestra sorpresa por la multa aparentemente modesta de 1,9 millones de dólares impuesta, teniendo en cuenta el alcance del negocio:
Francamente, nos sorprende que Zoetop (ahora SHEIN Distribution Corporation en EE.UU.) haya salido tan bien parada, teniendo en cuenta el tamaño, la riqueza y el poder de marca de la empresa, su aparente falta de precauciones, incluso básicas, que podrían haber evitado o reducido el peligro planteado por la violación, y su continua falta de honradez en la gestión de la violación después de que se conociera.
Revelado código espía de la aplicación
Lo que no sabíamos, ni siquiera cuando este caso se debatía en el sistema judicial de Nueva York, era que SHEIN estaba añadiendo un curioso (y dudoso, si no realmente malicioso) código a su aplicación para Android que la convertía en una especie de “herramienta de marketing espía” básica.
La noticia surgió hace unos días, cuando los investigadores de Microsoft publicaron un análisis retrospectivo de la versión 7.9.2 de la aplicación Android de SHEIN, de principios de 2022.
Aunque esa versión de la aplicación se ha actualizado muchas veces desde que Microsoft informó de su dudoso comportamiento, y aunque Google ha añadido ahora algunas mitigaciones en Android (ver más abajo) para ayudarte a detectar aplicaciones que intentan salirse con la suya con este tipo de artimañas de SHEIN, esta historia es un claro recordatorio de que incluso las aplicaciones “examinadas y aprobadas” en Google Play pueden funcionar de formas retorcidas que socavan tu privacidad y seguridad, como en el caso de las aplicaciones fraudulentas “Authenticator” sobre las que escribimos hace dos semanas.
Los investigadores de Microsoft no dijeron qué despertó su interés en esta aplicación en particular.
Por lo que sabemos, puede que simplemente eligieran una muestra representativa de aplicaciones con un alto número de descargas y buscaran automáticamente en su código descompilado, llamadas intrigantes o inesperadas a funciones del sistema para crear una lista corta de objetivos interesantes.
En palabras de los propios investigadores:
Primero realizamos un análisis estático de la aplicación para identificar el código relevante responsable del comportamiento. A continuación, realizamos un análisis dinámico ejecutando la aplicación en un entorno instrumentado para observar el código, incluido cómo leía el portapapeles y enviaba su contenido a un servidor remoto.
La aplicación de SHEIN tiene más de 100 millones de descargas, lo que está bastante por debajo de aplicaciones de gran éxito como Facebook (más de 5.000 millones), Twitter (más de 1.000 millones) y TikTok (más de 1.000 millones), pero a la altura de otras aplicaciones muy conocidas y utilizadas, como Signal (más de 100 millones) y McDonald’s (más de 100 millones).
Profundizando en el código
La aplicación en sí es enorme, con un peso de 93 MBytes en formato APK (un archivo APK, abreviatura de Paquete Android, es esencialmente un archivo ZIP comprimido) y 194 MBytes cuando se desempaqueta y extrae.
Incluye una parte considerable de código de biblioteca en un conjunto de paquetes con un nombre de nivel superior com.zzkko (ZZKKO era el nombre original de SHEIN), incluido un conjunto de rutinas de utilidades en un paquete llamado com.zzkko.base.util.
Esas utilidades base incluyen una función llamada PhoneUtil.getClipboardTxt() que cogerá el portapapeles utilizando herramientas de codificación estándar de Android importadas de android.content.ClipboardManager:
Si buscamos en el código SHEIN/ZZKKO llamadas a esta función de utilidad, veremos que sólo se utiliza en un lugar, un paquete intrigantemente llamado com.zzkko.util.MarketClipboardPhaseLinker:
Como se explica en el análisis de Microsoft, este código, cuando se activa, lee lo que haya en el portapapeles y comprueba si contiene :// y $, como cabría esperar si hubieras copiado y pegado un resultado de búsqueda que incluyera el sitio web de otra persona y un precio en dólares:
Si la búsqueda tiene éxito, entonces el código llama a una función compilada en el paquete con el poco imaginativo (y presumiblemente autogenerado) nombre k(), enviándole como parámetro una copia del texto espiado:
Como puedes ver, aunque no seas programador, esa función sin interés k() empaqueta los datos del portapapeles en una solicitud POST, que es un tipo especial de conexión HTTP que le dice al servidor: “Esto no es una solicitud GET tradicional en la que te pido que me envíes algo, sino una solicitud de carga en la que te estoy enviando datos”.
En este caso, la solicitud POST se carga en la URL https://api-service.shein.com/marketing/tinyurl/phrase, con un contenido HTTP que normalmente sería algo así
POST //marketing/tinyurl/frase Host: api-service.shein.com . . . Content-Type: application/x-www-form-urlencoded phrase=...contenido codificado del parámetro pasado a k()...
Como Microsoft señaló en su informe:
Aunque no tenemos constancia de ninguna intención maliciosa por parte de SHEIN, incluso comportamientos aparentemente benignos en las aplicaciones pueden ser explotados con intención maliciosa. Las amenazas dirigidas a los portapapeles pueden poner cualquier información copiada y pegada en riesgo de ser robada o modificada por atacantes, como contraseñas, detalles financieros, datos personales, direcciones de monederos de criptomonedas y otra información sensible.
Los signos de dólar en tu portapapeles no denotan invariablemente búsquedas de precios, entre otras cosas porque la mayoría de los países del mundo tienen monedas que utilizan símbolos diferentes, por lo que una amplia gama de información personal podría ser desviada de esta manera, pero aunque los datos obtenidos procedieran de una búsqueda inocente y sin importancia que hayas hecho en otro sitio, no serían asunto de nadie más que tuyo.
La codificación de URL se utiliza generalmente cuando quieres transmitir URL como datos, para que no puedan confundirse con URL “vivas” que se supone que se visitan, y para que no contengan caracteres ilegales. Por ejemplo, los espacios no están permitidos en las URL, por lo que se convierten en datos de URL en %20, donde el signo de porcentaje significa “el byte especial sigue como dos caracteres hexadecimales”, y 20 es el código ASCII hexadecimal para el espacio (32 en decimal). Del mismo modo, una secuencia especial como :// se traducirá como %3A%2F%2F, porque dos puntos es ASCII 0x3A (58 en decimal) y una barra oblicua es 0x2F (47 en decimal). El signo del dólar se traduce como %24 (36 en decimal).
¿Qué hacer?
Según Microsoft, la respuesta de Google a este tipo de comportamiento en aplicaciones en las que, por lo demás, se confía (lo que podría considerarse una “traición involuntaria”) fue reforzar el código de gestión del portapapeles de Android.
Presumiblemente, hacer que los permisos de acceso al portapapeles fueran mucho más estrictos y restrictivos habría sido una solución mejor en teoría, al igual que ser más riguroso con la verificación de las aplicaciones de Play Store, pero suponemos que estas respuestas se consideraron demasiado intrusivas.
En términos generales, cuanto más reciente sea la versión de Android que tengas (o a la que puedas actualizarte), más restrictiva será la gestión del portapapeles.
Aparentemente, en Android 10 y posteriores, una aplicación no puede leer el portapapeles en absoluto a menos que se esté ejecutando activamente en primer plano.
Es cierto que esto no ayuda mucho, pero impide que las aplicaciones que has dejado inactivas y quizás hasta olvidadas husmeen en tu copiar y pegar todo el tiempo.
Android 12 y posteriores mostrarán un mensaje de advertencia que dice “La aplicación XYZ ha pegado desde el portapapeles”, pero aparentemente esta advertencia solo aparece la primera vez que ocurre para cualquier aplicación (que puede ser cuando lo esperabas), no en las siguientes capturas del portapapeles (cuando no lo hacías).
Y Android 13 borra automáticamente el portapapeles cada cierto tiempo (no estamos seguros de la frecuencia real) para evitar que los datos que hayas podido olvidar queden por ahí indefinidamente.
Dado que, al parecer, Google no tiene intención de controlar el acceso al portapapeles tan estrictamente como cabría esperar, repetiremos aquí el consejo de Microsoft:
Considera la posibilidad de eliminar aplicaciones con comportamientos inesperados, como las notificaciones de acceso al portapapeles […], e informa del comportamiento al proveedor o al operador de la tienda de aplicaciones.