Cómo las imágenes de fondo de pantalla de Android amenazan su privacidad | Autor: Leon Yen | Fingerprint JS | Octubre de 2021
El muy esperado sistema de diseño Material You de Android 12 tiene temas de color basados en fondos de pantalla y funciones de personalización avanzadas compatibles con la extracción de color. Estas mejoras de la interfaz de usuario permiten a los usuarios seleccionar un fondo de pantalla (es decir, una imagen de fondo personal), a partir del cual se genera automáticamente la mejor paleta de colores y se aplica globalmente a la apariencia del dispositivo.
Desafortunadamente, este tipo de personalización puede tener un alto precio porque la privacidad se ve comprometida. En este artículo, demostraremos cómo usar los fondos de pantalla de Android para rastrear a los usuarios y explorar formas de evitar que su dispositivo sea explotado.
La clase WallpaperManager se introdujo en 2009 como parte de la versión 5 de la API de Android 2. Esta clase proporciona métodos para interactuar con el fondo de pantalla, incluido getDrawable () para recuperar el fondo de pantalla actual del sistema como recurso dibujable.
Con el siguiente código, el recurso dibujable se puede representar como una matriz de bytes:
private fun calculateWallpaperBytes(): ByteArray
val imageBitmap = wallpaperManager.drawable.toBitmap()
val stream = ByteArrayOutputStream()
imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)
return stream.toByteArray()
Las matrices de bytes se pueden utilizar para recuperar imágenes originales de fondos de pantalla de Android; es muy probable que estas imágenes contengan información personal o información detallada que es muy importante para el usuario. Todas las aplicaciones de su dispositivo pueden ver y descargar fotos de su familia, mascotas, bandas o películas favoritas y cualquier otro contenido que haya configurado como fondo de pantalla. Además, antes de Android 8.1, no podía evitar que hicieran esto.
Por ahora, un gran porcentaje de dispositivos ejecutan Android 8.1 o anterior (casi el 44,6% según Google Analytics en el momento de escribir este artículo) y aún son vulnerables a esta vulnerabilidad.
A partir de Android 8.1, el método getDrawable () requiere el uso de READ_EXTERNAL_STORAGE, que es un permiso menos seguro pero arriesgado porque permite el acceso a todos los medios (y más datos privilegiados) en el dispositivo. Para compensar la funcionalidad limitada, Android 8.1 también introdujo un método de extracción de color más simple: getWallpaperColors (int which), que devuelve 3 colores principales de la imagen del fondo de pantalla.
Al igual que iOS, Android permite al usuario determinar la pantalla específica para usar la imagen de fondo de pantalla y el parámetro entero «que» establece la imagen de fondo de pantalla exacta utilizada para la extracción de color.Hay dos opciones: valor constante WallpaperManager.FLAG_SYSTEM
o WallpaperManager.FLAG_LOCK
.
Ejemplo de un cuadro de diálogo con opciones para configurar la ubicación del fondo de pantalla
// WallpaperManager.FLAG_LOCK for the the lock screenval colors = WallpaperManager.getInstance(context).getWallpaperColors(WallpaperManager.FLAG_SYSTEM) val primaryColor: Int = colors.primaryColor.toArgb()val secondaryColor: Int = colors.secondaryColor.toArgb()val tertiaryColor: Int = colors.tertiaryColor.toArgb()
El código anterior ilustra cómo usar el objeto de contexto para extraer colores, donde los colores primarios, secundarios y terciarios corresponden a los colores más populares en la imagen (principalmente los más populares). Tenga en cuenta que no se requieren permisos especiales para utilizar este nuevo método.
El siguiente es un ejemplo del uso del nuevo método para extraer colores de imágenes reales:
Ejemplos reales de extracción de color de Android
En algunos casos, estos métodos pueden devolver un valor nulo (por ejemplo, cuando el lanzador personalizado redefine la lógica de administración del papel tapiz sin usar WallpaperManager
clase).Pero si el papel pintado está hecho por WallpaperManager
, El método devolverá un valor no nulo.
Dado que Android es de código abierto, podemos determinar fácilmente cómo funciona realmente este método. Según el código, el color es el resultado del trabajo del cuantificador de K-medias variacional. Cada píxel de la imagen está representado por un color y cada color es un punto tridimensional en el espacio (por ejemplo, el espacio de color RGB). Todos los píxeles forman un conjunto en el espacio, y el algoritmo agrupa el conjunto en K partes y encuentra K puntos, que son equidistantes de otros puntos del conjunto.
Una visualización de cómo funciona el método K-means, por vas3kEste caso especial es la media de 3 en un espacio bidimensional.
En el caso de Android, el color se representa en el espacio de color HSL y la distancia se calcula utilizando la métrica clásica de la distancia euclidiana. El resultado es que las tres sombras de la imagen son equidistantes de cada píxel de la imagen (en el espacio de color).
Este algoritmo de extracción de color es básicamente un mapeo de todos los conjuntos de imágenes posibles al espacio de color RGB. El conjunto es ilimitado y el espacio de color RGB está limitado por la combinación de ²²⁴. En teoría, esto significa que todas las combinaciones RGB son posibles. Cada color está representado por 32 bits, pero solo 24 bits. El canal alfa siempre será igual a 1 (dependiendo de la fuente), y cada componente de los colores R, G y B tiene 256 combinaciones posibles, que es 2⁸.
Dado que cada componente es independiente, podemos multiplicar directamente el número de combinaciones. El resultado es: 2⁸ * 2⁸ * 2⁸ * 2⁸ = 2²⁴ combinaciones para cada color. Una imagen tiene 3 colores y cada imagen tiene combinaciones de 2²⁴ * 2²⁴ * 2²⁴ = 2⁷².
La misma lógica se aplica a la segunda imagen de fondo de pantalla, y se pueden configurar de forma independiente entre sí. A partir de una imagen de fondo de pantalla, tenemos 72 bits y 144 bits utilizando el fondo de pantalla del sistema y el fondo de pantalla de bloqueo, una combinación de 144 bits y 2¹⁴⁴. Cuantas más combinaciones posibles, es más probable que se genere un valor único adecuado para su uso como ID. Por lo tanto, es probable que lo rastreen fácilmente.
2¹⁴⁴ = 22,300,745,198,530,623,141,535,718,272,648,361,505,980,416
¿Qué tan grande es este número? En términos de contexto, el universo consta de aproximadamente 1⁸⁰ átomos. 2¹⁴⁴ es aproximadamente igual a 1⁴³. ¡Entonces el valor cuadrado de la combinación es mayor que el número de átomos en el universo! Es seguro decir que en el futuro previsible, esto superará a todos los dispositivos del planeta.
Como recordará, los desarrolladores pueden usar matrices de bytes para restaurar imágenes de fondo de pantalla anteriores a Android 8.1. Después de la versión 8.1, se pueden extraer 144 bits del color del fondo de pantalla. Ambos se pueden usar como ID, pero usémoslos como entrada para la función hash SHA-256 (para unificación).
Tenemos una ID de 256 bits, que es única en todas las aplicaciones y solo cambia cuando cambia el fondo de pantalla del dispositivo. El código para obtener la identificación es:
val id = hasher.hash( if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O_MR1) extractWallpaperBytes() else extractColorsBytes())
Incluso después de reinstalar la aplicación, la ID sigue siendo la misma y solo cambia cuando se cambia el fondo de pantalla.
Para fines de demostración, creamos una aplicación de código abierto que calcula el ID y verifica su singularidad. Puede descargar la aplicación en Google Play (Android 5.0 y superior, sin permiso); el código fuente se puede encontrar en GitHub.
notas: Este método no es adecuado para lanzadores personalizados que redefinen la lógica de administración del papel tapiz sin usarlo. WallpaperManager
clase.
Las siguientes medidas pueden ayudar a evitar que se rastreen los fondos de pantalla en su dispositivo Android:
- Nunca use imágenes privadas o personales como fondos de pantalla, especialmente en dispositivos con Android 8.1 y versiones anteriores.
- Utilice el fondo de pantalla predeterminado y no lo cambie. Al usar imágenes personalizadas, agrega inadvertidamente entropía y singularidad para distinguir su dispositivo de otros dispositivos.
- Compruebe si su lanzador redefine la lógica de la gestión de fondos de pantalla del dispositivo (puede utilizar nuestra aplicación de demostración para hacer esto).
- No instale aplicaciones sospechosas.
- Asegúrese de actualizar constantemente el sistema operativo de su dispositivo.
- Utilice software anti-malware para asegurarse de que las aplicaciones que instale se ejecuten como se espera.
Como puede ver, la señal generada a partir de la extracción del color del fondo de pantalla se puede usar para crear un identificador único que todas las aplicaciones pueden usar sin permisos adicionales. En otras palabras, extraer colores de los fondos de pantalla del dispositivo es solo una forma en que los desarrolladores de dispositivos móviles pueden describir de manera única los dispositivos Android, y no es la más confiable en este sentido.
Para ver algunos ejemplos de métodos más estables y confiables, consulte nuestro código fuente de la biblioteca de huellas dactilares-android. Google no los ha restringido durante muchos años y es poco probable que lo haga. En el análisis final, esto afectará la efectividad de Android como plataforma publicitaria; para la compañía de tecnología más grande del mundo, este es un compromiso constante entre equilibrar estos intereses y proteger la privacidad del usuario.