Watch-IP

インポッシブルトラベルの誤検知:VPN・タイミング・位置情報データ

インポッシブルトラベルは、ログイン時のIP由来の位置情報を、そのユーザーについて保存されている直前の地点と比較し、経過時間内では物理的に移動が不可能な想定速度をフラグとして立てます。highという結果は、生の距離÷時間の計算がしきい値を超えたことを意味するにすぎず、それ単独ではアカウント乗っ取りの証明にはならず、いくつかのごく普通の状況でも発生し得ます。

スコアの背後にある計算

POST /v1/risk/checkは、ユーザーの保存済みの直前の位置情報と現在の位置情報との間の大圏距離を計算し、その直前の観測からの経過時間で割ることで、想定される速度を分類します:500km/h未満はlow、500〜900km/hはmedium、900km/hを超えるとhigh(impossibleTravel: true)です。実際の長距離フライトはmedium/highの境界付近に着陸することがあるため、しきい値は単一の基準値ではなく範囲として設定されています—ただし、この計算自体には「フライト」「VPN」「共有ネットワーク」といった概念はなく、2つの地点と所要時間しか見ていません。

初回の観測は決してフラグが立たない

ユーザーの初めてのチェックには比較対象が存在しません:常にrisk: "low"を返し、previousLocationはnull、距離・速度・経過時間の各値もnullとなり、(commit: falseでない限り)新たな保存済みベースラインになります。つまり、新しいデバイスやネットワークからの最初のログインは、デフォルトで信頼を確立することになります—同じ構造上の理由で、攻撃者の最初の行動もフラグが立たないことを知っておく価値があります。

誤検知を招きやすい状況

ログインの間にVPNの出口ノードやモバイルネットワークのゲートウェイが切り替わると、実際には全く移動していなくても、解決される位置情報が大きく移動することがあります—v1にはVPNやデータセンターを考慮した抑制機能がないため、これは本物のインポッシブルトラベルと同じように読み取られます。通常のモバイルキャリアにおけるIPの入れ替わり(同じ物理的な場所が、リクエストごとに異なるゲートウェイの都市に解決されること)や、共有・エニーキャストのIP範囲でも同様の結果になり得ます。これらはいずれも攻撃者の関与を伴わず、IP由来の位置情報の仕組みによるものです—詳しくは精度についての記事で扱っています。

highのスコアが証明しないこと

risk: "high"は、距離÷時間の計算から得られる生のシグナルであり、検証済みのアカウント乗っ取りイベントでも、誰がログインを開始したかについての証拠でも、ユーザーの認証情報が実際に侵害されたかどうかについての情報でもありません。既に持っている認証上の根拠と組み合わせた上で、自社の審査や段階的認証の判断への1つの入力として扱い、それだけを根拠に対応する単独の最終判定として扱わないでください。

2回の観測の例

あるユーザーの保存済みベースラインは、09:00 UTCに観測されたトロントです。09:45 UTCに、フランクフルトに解決されるIPからログインが届きました—45分で約6,400km、900km/hをはるかに超える想定速度となるため、risk: "high"およびimpossibleTravel: trueが返されます。この結果は、別の大陸から侵害されたアカウントが使われている場合と、同じ正当な利用者のトラフィックが無関係な理由で突然フランクフルトのVPN出口を経由するようになった場合の、どちらとも整合します—APIはどちらの場合でも同じ分類を返すため、これはまさに、自動ブロックではなく審査への1つの入力として設計されている理由です。

この記事が主張していないこと

これはWatch-IP自身のv1実装について説明するものです。包括的なアカウント乗っ取り検知、行動分析、デバイスフィンガープリンティングを主張するものではありません—これらはこのエンドポイントが試みていない別の技術です。このエンドポイントの利用可否と、独立したプランファミリーの適用については確認されていません—本番環境で利用する前にお問い合わせください。

情報源

Watch-IP編集チームによる執筆(2026年9月6日)。apps/api/src/lib/risk.tsおよびapps/api/src/durable-objects/session-risk.tsを基にレビュー済み。

関連ページ