94 votes

Désactiver / Vérifier l'emplacement fictif (empêcher l'usurpation d'identité par GPS)

Vous cherchez le meilleur moyen de prévenir/détecter l'usurpation d'identité par GPS sur Android. Avez-vous des suggestions sur la façon dont cela est accompli, et ce qui peut être fait pour l'arrêter ? Je suppose que l'utilisateur doit activer la simulation de localisation pour usurper le GPS, si cela est fait, alors il peut usurper le GPS ?

Je suppose que je devrais simplement détecter si les emplacements fictifs sont activés ? D'autres suggestions ?

2 votes

Je pense qu'il s'agit de la fonction Location Spoofing disponible dans la vue DDMS d'Eclipse.

2 votes

J'ai un jeu basé sur la localisation sur lequel je ne veux pas que les gens trichent, donc je veux bloquer l'usurpation d'identité, si je comprends bien, cela peut se produire de deux façons Avoir des emplacements fictifs activés, et construire une image personnalisée qui fait de l'usurpation de bas niveau et ne tient pas compte du paramètre d'usurpation dans l'application des paramètres. En essayant de trouver le fournisseur Settings.System pour MockLocations, ou en regardant s'il est activé (avec un écouteur au milieu de l'application).

140voto

Jambaaz Points 738

J'ai fait quelques recherches et je partage mes résultats ici, cela peut être utile à d'autres.

Tout d'abord, nous pouvons vérifier si l'option MockSetting est activée.

public static boolean isMockSettingsON(Context context) {
    // returns true if mock location enabled, false if not enabled.
    if (Settings.Secure.getString(context.getContentResolver(),
                                Settings.Secure.ALLOW_MOCK_LOCATION).equals("0"))
        return false;
    else
        return true;
}

Deuxièmement, nous pouvons vérifier s'il y a d'autres applications dans l'appareil, qui utilisent android.permission.ACCESS_MOCK_LOCATION (Applications d'usurpation d'adresse)

public static boolean areThereMockPermissionApps(Context context) {
    int count = 0;

    PackageManager pm = context.getPackageManager();
    List<ApplicationInfo> packages =
        pm.getInstalledApplications(PackageManager.GET_META_DATA);

    for (ApplicationInfo applicationInfo : packages) {
        try {
            PackageInfo packageInfo = pm.getPackageInfo(applicationInfo.packageName,
                                                        PackageManager.GET_PERMISSIONS);

            // Get Permissions
            String[] requestedPermissions = packageInfo.requestedPermissions;

            if (requestedPermissions != null) {
                for (int i = 0; i < requestedPermissions.length; i++) {
                    if (requestedPermissions[i]
                        .equals("android.permission.ACCESS_MOCK_LOCATION")
                        && !applicationInfo.packageName.equals(context.getPackageName())) {
                        count++;
                    }
                }
            }
        } catch (NameNotFoundException e) {
            Log.e("Got exception " , e.getMessage());
        }
    }

    if (count > 0)
        return true;
    return false;
}

Si les deux méthodes ci-dessus, la première et la seconde, sont vraies, il y a de fortes chances que la localisation soit usurpée ou fausse.

Désormais, l'usurpation d'identité peut être évitée en utilisant l'API de Location Manager.

Nous pouvons supprimer le fournisseur de test avant de demander les mises à jour de localisation aux deux fournisseurs (réseau et GPS).

LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);

try {
    Log.d(TAG ,"Removing Test providers")
    lm.removeTestProvider(LocationManager.GPS_PROVIDER);
} catch (IllegalArgumentException error) {
    Log.d(TAG,"Got exception in removing test  provider");
}

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener);

J'ai vu que removeTestProvider(~) fonctionne très bien sur Jelly Bean et les versions suivantes. Cette API semblait peu fiable jusqu'à Ice Cream Sandwich.

Mise à jour de Flutter : Utilisez Geolocator et vérifier Position de l'objet isMocked propriété.

0 votes

Observations très intéressantes. Surtout la dernière +1 pour le partage.

2 votes

Remarque concernant la méthode removeTestProvider. Si vous autorisez le gestionnaire de localisation à travailler en arrière-plan, l'utilisateur peut aller dans l'application fantaisie et redémarrer la localisation fantaisie. Votre gestionnaire d'emplacements commencera alors à recevoir des emplacements fictifs jusqu'à ce que vous appeliez à nouveau la méthode removeTestProvider.

4 votes

Votre application doit également comporter android.permission.ACCESS_MOCK_LOCATION l'autorisation de removeTestProvider pour travailler, ce qui, je pense, est le plus grand désavantage.

51voto

Fernando Points 1203

Depuis l'API 18, l'objet Localisation a la méthode [.isFromMockProvider()](http://developer.android.com/reference/android/location/Location.html#isFromMockProvider()) afin que vous puissiez filtrer les faux lieux.

Si vous souhaitez prendre en charge les versions antérieures à 18, il est possible d'utiliser quelque chose comme ceci :

boolean isMock = false;
if (android.os.Build.VERSION.SDK_INT >= 18) {
    isMock = location.isFromMockProvider();
} else {
    isMock = !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");
}

0 votes

Je suis presque sûr que votre deuxième expression est inversée (elle renvoie vrai alors qu'elle devrait renvoyer faux). Je pense que ça devrait être : isMock = !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");

3 votes

Vous êtes les bienvenus. Merci de poster une réponse plus moderne ! C'est vraiment la réponse correcte à ce jour.

1 votes

Comment pouvons-nous le faire sans l'objet "location" pour les SDK supérieurs à 18 ?

35voto

Chrispix Points 4867

Il semble que le seul moyen d'y parvenir soit d'empêcher la mystification de l'emplacement en empêchant les MockLocations. L'inconvénient, c'est que certains utilisateurs utilisent des dispositifs GPS Bluetooth pour obtenir un meilleur signal. Ils ne pourront pas utiliser l'application, car ils doivent utiliser des emplacements fictifs.

Pour ce faire, j'ai fait ce qui suit :

// returns true if mock location enabled, false if not enabled.
if (Settings.Secure.getString(getContentResolver(),
       Settings.Secure.ALLOW_MOCK_LOCATION).equals("0")) 
       return false; 
       else return true;

4 votes

Mais ce n'est pas infaillible. Les utilisateurs d'un appareil non rooté peuvent toujours définir une fausse localisation, avec un temps dans le futur, puis désactiver les fausses localisations, et la fausse localisation est toujours active. Pire encore, ils peuvent appeler l'emplacement fictif avec le même nom de fournisseur que Network/Gps et il en est apparemment tiré

3 votes

En outre, Faux GPS ne nécessite pas le paramètre de localisation fictive sur les appareils enracinés.

0 votes

On peut toujours vérifier que l'application fake.gps n'est pas installée :)

27voto

KlaasNotFound Points 731

Je suis tombé sur ce fil de discussion quelques années plus tard. En 2016, la plupart des appareils Android auront un niveau d'API >= 18 et devront donc s'appuyer sur Localisation.isFromMockProvider() comme l'a souligné Fernando .

J'ai longuement expérimenté les emplacements fictifs sur différents appareils Android et distros. Malheureusement, .isFromMockProvider() n'est pas fiable à 100%. De temps en temps, un emplacement factice ne sera pas étiqueté comme factice . Cela semble être dû à une logique de fusion interne erronée dans l'API de localisation de Google.

J'ai écrit un article de blog détaillé à ce sujet si vous souhaitez en savoir plus. En résumé, si vous vous abonnez aux mises à jour de l'emplacement à partir de l'API d'emplacement, puis que vous allumez une fausse application GPS et que vous imprimez le résultat de chaque déplacement de l Emplacement.toString() à la console, vous verrez quelque chose comme ceci :

enter image description here

Remarquez comment, dans le flux des mises à jour de localisation, un emplacement a les mêmes coordonnées que les autres, mais n'est pas signalé comme un simulacre et a une précision de localisation beaucoup plus faible.

Pour remédier à ce problème, j'ai écrit une classe utilitaire qui sera supprimer de manière fiable les emplacements Mock sur toutes les versions modernes d'Android (niveau 15 de l'API et plus) :

LocationAssistant - Des mises à jour de localisation sans souci sur Android

En gros, il se "méfie" des emplacements non simulés qui se trouvent à moins d'un kilomètre du dernier emplacement simulé connu et les identifie également comme simulés. Il procède ainsi jusqu'à ce qu'un nombre significatif d'emplacements non fictifs soient arrivés. Le site LocationAssistant peut non seulement rejeter les faux emplacements, mais aussi vous libérer de la plupart des tracas liés à la mise en place et à l'abonnement aux mises à jour des emplacements.

Pour recevoir uniquement les mises à jour des emplacements réels (c'est-à-dire supprimer les simulacres), utilisez-le comme suit :

public class MyActivity extends Activity implements LocationAssistant.Listener {

    private LocationAssistant assistant;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        // You can specify a different accuracy and interval here.
        // The last parameter (allowMockLocations) must be 'false' to suppress mock locations.  
        assistant = new LocationAssistant(this, this, LocationAssistant.Accuracy.HIGH, 5000, false);
    }

    @Override
    protected void onResume() {
        super.onResume();
        assistant.start();
    }

    @Override
    protected void onPause() {
        assistant.stop();
        super.onPause();
    }

    @Override
    public void onNewLocationAvailable(Location location) {
        // No mock locations arriving here
    }

    ...
}

onNewLocationAvailable() ne sera désormais invoqué qu'avec des informations de localisation réelles. Il existe d'autres méthodes d'écoute que vous devez mettre en œuvre, mais dans le contexte de votre question (comment empêcher l'usurpation d'identité par GPS), c'est à peu près tout.

Bien sûr, avec un système d'exploitation enraciné, vous pouvez toujours trouver des moyens de falsifier les informations de localisation qui sont impossibles à détecter par les applications normales.

0 votes

Vous devez résumer brièvement l'article de blog lié (où isFromMockProvider échoue-t-il).

0 votes

@CodeConfident - merci pour la remarque ! Je ne suis pas sûr de ce que je dois ajouter. Le deuxième paragraphe de ma réponse es le résumé de l'article de blog. .isFromMockProvider échoue de manière sporadique et imprévisible. Dans cet article, je décris plus en détail les étapes que j'ai suivies pour découvrir ce problème et y remédier.

0 votes

J'ai été obligé de passer par votre article pour comprendre, ce qui me semble aller à l'encontre de l'intention de l'OS. Ma meilleure suggestion serait : (1) d'insérer votre photo qui montre l'emplacement douteux (non signalé comme un simulacre) et (2) de noter rapidement votre logique pour les éliminer (ignorer dans un rayon de 1 km d'un simulacre).

7voto

Stephen Schrauger Points 171

Si vous connaissez l'emplacement général des tours de téléphonie cellulaire, vous pouvez vérifier si la tour de téléphonie cellulaire actuelle correspond à l'emplacement donné (avec une marge d'erreur importante, comme 10 miles ou plus).

Par exemple, si votre application ne débloque des fonctionnalités que si l'utilisateur se trouve à un endroit précis (votre magasin, par exemple), vous pouvez vérifier le gps ainsi que les tours de téléphonie mobile. Actuellement, aucune application d'usurpation de gps n'usurpe également les tours de téléphonie cellulaire, ce qui vous permettrait de voir si quelqu'un à l'autre bout du pays essaie simplement d'usurper son accès à vos fonctions spéciales (je pense à l'application Disney Mobile Magic, par exemple).

C'est la façon dont l'application Llama gère la localisation par défaut, puisque la vérification de l'identité des tours de téléphonie mobile consomme beaucoup moins de batterie que le GPS. Ce n'est pas utile pour des lieux très précis, mais si le domicile et le travail sont distants de plusieurs kilomètres, il est possible de faire la distinction entre les deux lieux généraux très facilement.

Bien sûr, il faudrait pour cela que l'utilisateur dispose d'un signal cellulaire. Et il faudrait connaître l'identité de toutes les antennes cellulaires de la région, quel que soit le fournisseur de réseau, sinon le risque de faux négatif serait grand.

1 votes

Merci, c'est une assez bonne idée. Je vais peut-être devoir y réfléchir. Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X