Watch-IP

Faux positifs de déplacement impossible : VPN, minutage et données de localisation

Le déplacement impossible compare la localisation dérivée de l'IP d'une connexion avec le dernier point enregistré pour cet utilisateur, et signale une vitesse implicite qu'il serait physiquement impossible de parcourir dans le temps écoulé. Un résultat élevé signifie que le calcul brut de distance sur temps a franchi un seuil — ce n'est pas, en soi, une preuve de prise de contrôle de compte, et plusieurs situations tout à fait ordinaires peuvent le déclencher.

Le calcul derrière le score

POST /v1/risk/check calcule la distance orthodromique entre la précédente localisation enregistrée d'un utilisateur et la localisation actuelle, la divise par le temps écoulé depuis cette précédente observation, et classe la vitesse implicite : en dessous de 500 km/h c'est low, entre 500 et 900 km/h c'est medium, au-dessus de 900 km/h c'est high (impossibleTravel: true). Un vol long-courrier réel peut se retrouver proche de la frontière medium/high, ce qui explique pourquoi les seuils existent sous forme de plages plutôt que d'un point de coupure unique — mais le calcul lui-même n'a aucune notion de « vol », de « VPN » ou de « réseau partagé » ; il ne voit que deux points et une durée.

La première observation n'est jamais signalée

Le tout premier contrôle d'un utilisateur n'a rien avec quoi se comparer : il renvoie toujours risk: "low" avec un previousLocation à null et des valeurs distance/speed/elapsed à null, et (sauf commit: false) devient la nouvelle référence enregistrée. Cela signifie que la toute première connexion depuis un nouvel appareil ou réseau établit une confiance par défaut — un point à connaître, car la première action d'un attaquant n'est, elle non plus, pas signalée, pour la même raison structurelle.

Situations qui déclenchent couramment un faux positif

Changer de nœud de sortie VPN ou de passerelle d'opérateur mobile entre deux connexions peut déplacer la localisation résolue sur une longue distance sans aucun déplacement réel — la v1 n'a aucune suppression consciente des VPN ou des centres de données, donc cela se lit exactement comme un véritable déplacement impossible. Le renouvellement ordinaire des IP d'opérateurs mobiles (le même emplacement physique résolvant vers une ville de passerelle différente selon les requêtes) et les plages IP partagées/anycast peuvent produire le même effet. Aucune de ces situations n'implique un attaquant ; ce sont des artefacts du fonctionnement de la localisation dérivée de l'IP, traités plus en détail dans l'article sur la précision.

Ce qu'un score élevé ne prouve pas

risk: "high" est un signal brut issu d'un calcul de distance sur temps — ni un événement de prise de contrôle de compte vérifié, ni une preuve de qui a initié la connexion, ni une information sur la compromission réelle des identifiants de l'utilisateur. Traitez-le comme un élément parmi d'autres pour votre propre décision de revue ou d'authentification renforcée, combiné aux preuves d'authentification dont vous disposez déjà, et non comme un verdict autonome à appliquer seul.

Un exemple à deux observations

La référence enregistrée d'un utilisateur est Toronto, observée à 09:00 UTC. Une connexion arrive depuis une IP résolvant vers Francfort à 09:45 UTC — environ 6 400 km en 45 minutes, une vitesse implicite très supérieure à 900 km/h, ce qui renvoie donc risk: "high" et impossibleTravel: true. Ce résultat est compatible aussi bien avec un compte compromis utilisé depuis un autre continent qu'avec le trafic de ce même utilisateur légitime passant soudainement par une sortie VPN à Francfort pour une raison sans rapport — l'API renvoie la même classification dans les deux cas, ce qui explique précisément pourquoi elle est conçue comme un élément de revue, pas comme un blocage automatique.

Ce que cet article n'affirme pas

Ceci décrit l'implémentation v1 propre à Watch-IP. Elle ne prétend pas offrir une détection complète de prise de contrôle de compte, une analyse comportementale, ou une empreinte d'appareil — ce sont des techniques différentes que ce point de terminaison ne tente pas. La disponibilité et l'application indépendante d'une famille de forfaits pour ce point de terminaison n'ont pas été confirmées ; contactez-nous avant de vous y fier en production.

Sources

Rédigé par l'équipe éditoriale de Watch-IP, le 6 septembre 2026. Relu par rapport à apps/api/src/lib/risk.ts et apps/api/src/durable-objects/session-risk.ts.

Pages associées