Falsificación de localización GPS en Android usando la Mock Location API

En el ámbito de la seguridad ofensiva y el hacking, la manipulación de la localización GPS es una técnica con múltiples aplicaciones: desde el pentesting de apps basadas en geolocalización, hasta la evasión de restricciones geográficas en entornos de prueba. En este artículo profundizamos en cómo funciona la falsificación de la localización GPS en dispositivos Android mediante la Mock Location API, y revisamos un ejemplo funcional disponible en https://github.com/Tomiwa-Ot/GPS-Spoof

¿Qué es la Mock Location API?

Android, desde sus primeras versiones, proporciona una API oficial para desarrolladores que permite inyectar localizaciones simuladas. Esta funcionalidad se creó para pruebas de apps de mapas, navegación o servicios basados en localización (LBS, Location-Based Services). Al activarla, cualquier aplicación con los permisos adecuados puede proporcionar coordenadas GPS falsas al framework del sistema.

El flujo general es:

  1. Activar el modo desarrollador
    En el dispositivo Android, se debe habilitar Opciones de desarrollador y seleccionar una app como Aplicación de ubicación simulada (Select mock location app).

  2. Uso de la API
    Mediante la clase LocationManager o FusedLocationProviderClient, la app establece localizaciones ficticias que sobrescriben la señal GPS real del dispositivo.

Arquitectura general

El mecanismo básico se compone de los siguientes elementos:

  • Permiso de localización (ACCESS_FINE_LOCATION o ACCESS_COARSE_LOCATION) para recibir/inyectar datos de localización.

  • Permiso de ubicación simulada (android.permission.ACCESS_MOCK_LOCATION en dispositivos con API <= 22).
    Nota: A partir de Android 6.0 (API 23), este permiso se gestiona desde el modo desarrollador.

  • Un provider de localización registrado como mock mediante LocationManager.addTestProvider.

Ejemplo práctico: GPS-Spoof

El repositorio GPS-Spoof es un proyecto Android que demuestra cómo establecer coordenadas falsas. El flujo es el siguiente:

1. Configuración del Provider

val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager

locationManager.addTestProvider(
    LocationManager.GPS_PROVIDER,
    false, false, false, false,
    true, true, true, 0, 5
)
locationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true)

2. Inyección de coordenadas

val location = Location(LocationManager.GPS_PROVIDER)
location.latitude = FAKE_LATITUDE
location.longitude = FAKE_LONGITUDE
location.altitude = 0.0
location.accuracy = 5f
location.time = System.currentTimeMillis()

locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, location)

Este fragmento reemplaza la señal GPS con coordenadas arbitrarias. La clave es que el provider debe estar habilitado como test provider, lo que requiere privilegios de mock location.

Demo

Limitaciones y detección

Muchas apps de seguridad, banca o juegos basados en geolocalización (como Pokémon Go) implementan mecanismos para detectar localizaciones falsificadas. Algunas contramedidas comunes incluyen:

  • Verificar la integridad del provider: comprobar que no haya mock providers activos.

  • Validar inconsistencias: por ejemplo, si la red Wi-Fi o la IP pública indican una ubicación distinta.

  • Detectar apps de spoofing conocidas mediante escaneo de paquetes instalados.

Un bypass típico para evadir estas restricciones implica rootear el dispositivo o modificar el framework de Android para inyectar localizaciones directamente a nivel del sistema (por ejemplo, usando módulos Xposed).

Conclusión

Manipular la localización GPS es una técnica clave para auditar apps dependientes de la posición geográfica. La Mock Location API de Android ofrece un punto de entrada sencillo y documentado, aunque cada vez más apps implementan controles anti-spoofing. Para bypass más avanzados, se requiere acceso root y herramientas como Xposed o Magisk.

Comentarios