Watch-IP

Falsi positivi di spostamento impossibile: VPN, tempistiche e dati di posizione

Lo spostamento impossibile confronta la posizione derivata dall'IP di un accesso con il punto precedente memorizzato per quell'utente e segnala una velocità implicita che sarebbe fisicamente impossibile percorrere nel tempo trascorso. Un risultato high significa che il semplice calcolo distanza/tempo ha superato una soglia — non è, di per sé, la prova di una compromissione dell'account, e diverse situazioni ordinarie possono attivarlo.

Il calcolo alla base del punteggio

POST /v1/risk/check calcola la distanza ortodromica tra la posizione precedente memorizzata di un utente e quella attuale, la divide per il tempo trascorso dall'osservazione precedente e classifica la velocità implicita: sotto i 500 km/h è low, tra 500 e 900 km/h è medium, oltre 900 km/h è high (impossibleTravel: true). Un volo intercontinentale reale può ricadere vicino al confine tra medium e high, motivo per cui le soglie esistono come intervalli anziché come un unico limite netto — ma il calcolo in sé non ha alcun concetto di "volo", "VPN" o "rete condivisa"; vede solo due punti e una durata.

La prima osservazione non viene mai segnalata

Il primissimo controllo di un utente non ha nulla con cui confrontarsi: restituisce sempre risk: "low" con previousLocation null e valori null per distanza/velocità/tempo trascorso, e (a meno che commit: false) diventa la nuova baseline memorizzata. Questo significa che il primissimo accesso da un nuovo dispositivo o da una nuova rete stabilisce fiducia per impostazione predefinita — utile da sapere, poiché anche la prima azione di un aggressore non viene segnalata per lo stesso motivo strutturale.

Situazioni che comunemente attivano un falso positivo

Cambiare nodo di uscita VPN o gateway di rete mobile tra un accesso e l'altro può spostare la posizione risolta di una lunga distanza senza alcuno spostamento reale — la v1 non ha alcuna soppressione consapevole di VPN o datacenter, quindi questo viene letto in modo identico a uno spostamento impossibile autentico. Il normale avvicendamento degli IP degli operatori mobili (la stessa posizione fisica risolta su una città gateway diversa in richieste diverse) e gli intervalli IP condivisi/anycast possono produrre lo stesso effetto. Nessuna di queste situazioni coinvolge un aggressore; sono artefatti di come funziona la posizione derivata dall'IP, trattati più approfonditamente nell'articolo sull'accuratezza.

Cosa non dimostra un punteggio high

risk: "high" è un segnale grezzo proveniente da un calcolo distanza/tempo — non un evento di compromissione dell'account verificato, non una prova su chi abbia avviato l'accesso, e non un'informazione sul fatto che le credenziali dell'utente siano state effettivamente compromesse. Consideralo come uno degli elementi della tua decisione di revisione o di autenticazione rafforzata, combinato con le prove di autenticazione che già possiedi, non come un verdetto autonomo su cui agire da solo.

Un esempio con due osservazioni

La baseline memorizzata di un utente è Toronto, osservata alle 09:00 UTC. Un accesso arriva da un IP risolto su Francoforte alle 09:45 UTC — circa 6.400 km in 45 minuti, una velocità implicita ben oltre i 900 km/h, quindi questo restituisce risk: "high" e impossibleTravel: true. Questo risultato è coerente sia con un account compromesso utilizzato da un altro continente, sia con il traffico dello stesso utente legittimo che improvvisamente si instrada attraverso un nodo di uscita VPN di Francoforte per un motivo non correlato — l'API restituisce la stessa classificazione in entrambi i casi, ed è esattamente per questo che è pensata come uno degli elementi della revisione, non come un blocco automatico.

Cosa questo articolo non afferma

Questo descrive l'implementazione v1 propria di Watch-IP. Non dichiara un rilevamento completo delle compromissioni di account, un'analisi comportamentale o il fingerprinting del dispositivo — sono tecniche diverse che questo endpoint non tenta di applicare. La disponibilità e l'applicazione indipendente per famiglia di piano per questo endpoint non sono state confermate; contattaci prima di affidarti a esso in produzione.

Fonti

Scritto dal team editoriale di Watch-IP, 6 settembre 2026. Rivisto rispetto a apps/api/src/lib/risk.ts e apps/api/src/durable-objects/session-risk.ts.

Pagine correlate