Falsos Positivos de Viagem Impossível: VPN, Tempo e Dados de Localização
A viagem impossível compara a localização derivada do IP de um início de sessão com o ponto anteriormente armazenado desse utilizador e sinaliza uma velocidade implícita que seria fisicamente impossível de percorrer no tempo decorrido. Um resultado alto significa que o cálculo em bruto de distância sobre tempo ultrapassou um limiar — não é, por si só, prova de tomada de controlo de conta, e várias situações comuns podem desencadear um.
O cálculo por trás da pontuação
POST /v1/risk/check calcula a distância em grande círculo entre a localização anteriormente armazenada de um utilizador e a atual, divide-a pelo tempo decorrido desde essa observação anterior, e classifica a velocidade implícita: abaixo de 500 km/h é low, entre 500 e 900 km/h é medium, acima de 900 km/h é high (impossibleTravel: true). Um voo real de longo curso pode aterrar perto do limite entre medium e high, e é por isso que os limiares existem como intervalos e não como um único ponto de corte — mas o próprio cálculo não tem qualquer noção de "voo", "VPN", ou "rede partilhada"; só vê dois pontos e uma duração.
A primeira observação nunca é sinalizada
A primeira verificação de sempre de um utilizador não tem nada com que comparar: devolve sempre risk: "low" com um previousLocation nulo e valores nulos de distância/velocidade/tempo decorrido, e (a menos que commit: false) torna-se na nova base de referência armazenada. Isto significa que o primeiríssimo início de sessão a partir de um novo dispositivo ou rede estabelece confiança por predefinição — vale a pena saber, uma vez que a primeira ação de um atacante também não é sinalizada, pela mesma razão estrutural.
Situações que normalmente desencadeiam um falso positivo
Mudar de nó de saída de VPN ou de gateway de rede móvel entre inícios de sessão pode deslocar a localização resolvida por uma grande distância sem qualquer viagem real — a v1 não tem supressão consciente de VPN ou centro de dados, pelo que isto se lê de forma idêntica a uma viagem impossível genuína. A rotação normal de IP de operadoras móveis (a mesma localização física a resolver para uma cidade de gateway diferente em pedidos diferentes) e os intervalos de IP partilhados/anycast podem produzir o mesmo efeito. Nenhuma destas situações envolve um atacante; são artefactos da forma como a localização derivada do IP funciona, abordados com mais profundidade no artigo sobre exatidão.
O que uma pontuação alta não prova
risk: "high" é um sinal em bruto proveniente de um cálculo de distância sobre tempo — não um evento de tomada de controlo de conta verificado, não prova sobre quem iniciou o início de sessão, e não informação sobre se as credenciais do utilizador foram realmente comprometidas. Trate-o como uma entrada para a sua própria decisão de revisão ou de autenticação reforçada, combinada com evidências de autenticação que já possua, não como um veredito autónomo a aplicar isoladamente.
Um exemplo com duas observações
A base de referência armazenada de um utilizador é Toronto, observada às 09:00 UTC. Chega um início de sessão a partir de um IP resolvido para Frankfurt às 09:45 UTC — cerca de 6400 km em 45 minutos, uma velocidade implícita muito acima de 900 km/h, pelo que isto devolve risk: "high" e impossibleTravel: true. Este resultado é consistente tanto com uma conta comprometida a ser utilizada a partir de outro continente, como com o tráfego do mesmo utilizador legítimo a ser subitamente encaminhado através de um nó de saída VPN em Frankfurt por um motivo não relacionado — a API devolve a mesma classificação em qualquer dos casos, o que é exatamente a razão pela qual foi concebida como uma entrada para revisão, e não como um bloqueio automático.
O que este artigo não afirma
Isto descreve a implementação v1 do próprio Watch-IP. Não afirma deteção abrangente de tomada de controlo de conta, análise comportamental, ou impressão digital de dispositivo — são técnicas diferentes que este endpoint não tenta realizar. A disponibilidade e a aplicação independente de uma família de planos para este endpoint não foram confirmadas; contacte-nos antes de depender dele em produção.
Fontes
Escrito pela equipa editorial do Watch-IP, 6 de setembro de 2026. Revisto com base em apps/api/src/lib/risk.ts e apps/api/src/durable-objects/session-risk.ts.