Watch-IP

الإيجابيات الكاذبة للتنقل المستحيل: شبكات VPN والتوقيت وبيانات الموقع

يقارن التنقل المستحيل الموقع المُشتق من IP لتسجيل دخول بالنقطة المخزَّنة سابقًا لذلك المستخدم، ويُشير إلى سرعة ضمنية يستحيل فعليًا قطعها في الزمن المنقضي. تعني النتيجة high أن حساب المسافة عبر الزمن الخام قد تجاوز حدًا معيَّنًا — وهذا في حد ذاته ليس دليلًا على الاستيلاء على الحساب، وثمة عدة مواقف عادية يمكن أن تُحفِّزه.

الحساب وراء الدرجة

تحسب POST /v1/risk/check المسافة على الدائرة العظمى بين موقع المستخدم المخزَّن سابقًا والموقع الحالي، وتقسمها على الزمن المنقضي منذ تلك الملاحظة السابقة، وتُصنِّف السرعة الضمنية: أقل من 500 كم/سا تعني low، ومن 500 إلى 900 كم/سا تعني medium، وأعلى من 900 كم/سا تعني high (‏impossibleTravel: true). يمكن لرحلة طيران طويلة حقيقية أن تقع قرب الحد الفاصل بين medium وhigh، وهذا سبب وجود العتبات كنطاقات لا كحد فاصل وحيد — لكن الحساب نفسه لا يملك أي مفهوم لـ "رحلة طيران" أو "VPN" أو "شبكة مشتركة"؛ فهو لا يرى سوى نقطتين ومدة زمنية.

الملاحظة الأولى لا تُوسَم أبدًا

لا يملك أول فحص على الإطلاق لمستخدم ما شيئًا يُقارَن به: فيُعيد دائمًا risk: "low" مع previousLocation فارغة (null) وقيم distance/speed/elapsed فارغة، ويصبح (ما لم تكن commit تساوي false) الأساس المرجعي المخزَّن الجديد. ويعني هذا أن أول تسجيل دخول من جهاز أو شبكة جديدة يُنشئ ثقة افتراضيًا — وهذا جدير بالمعرفة لأن أول إجراء لمهاجم لا يُوسَم هو الآخر، لنفس السبب البنيوي.

مواقف تُحفِّز غالبًا نتيجة إيجابية كاذبة

يمكن لتبديل عقد خروج VPN أو بوابات شبكة الجوال بين عمليات تسجيل الدخول أن يُحرِّك الموقع المُحلَّل مسافة طويلة دون أي تنقل حقيقي على الإطلاق — لا يملك الإصدار v1 آلية كبح واعية بـ VPN أو مراكز البيانات، لذا يُقرأ هذا مطابقًا تمامًا لتنقل مستحيل حقيقي. ويمكن لتبدُّل عناوين IP الاعتيادي لدى مشغِّلي الجوال (نفس الموقع الفعلي يُحلَّل إلى مدينة بوابة مختلفة في طلبات مختلفة) ونطاقات IP المشتركة/anycast أن تُنتج التأثير نفسه. لا يتضمن أيٌّ من هذه الحالات مهاجمًا؛ فهي آثار جانبية لطريقة عمل الموقع المُشتق من IP، مشروحة بتعمق أكبر في مقال الدقة.

ما لا تثبته الدرجة المرتفعة

تُعد risk: "high" إشارة خامًا من حساب المسافة عبر الزمن — لا حدثًا مؤكَّدًا للاستيلاء على الحساب، ولا دليلًا على مَن بدأ تسجيل الدخول، ولا معلومة عمّا إذا كانت بيانات اعتماد المستخدم قد اختُرقت فعليًا. عاملها كأحد مدخلات قرار المراجعة أو المصادقة المعزَّزة الخاص بك، مقترنةً بأدلة المصادقة التي تملكها بالفعل، لا كحكم قائم بذاته تتصرف بناءً عليه وحده.

مثال بملاحظتين

الأساس المرجعي المخزَّن لمستخدم ما هو تورونتو، مُلاحَظ عند الساعة 09:00 بتوقيت UTC. يصل تسجيل دخول من عنوان IP يُحلَّل إلى فرانكفورت عند الساعة 09:45 بتوقيت UTC — أي نحو 6400 كم في 45 دقيقة، وهي سرعة ضمنية أعلى بكثير من 900 كم/سا، لذا تُعيد هذه الحالة risk: "high" وimpossibleTravel: true. تتسق هذه النتيجة مع كون الحساب مخترقًا ويُستخدم من قارة مختلفة، أو مع مرور حركة مرور المستخدم الشرعي نفسه فجأة عبر عقدة خروج VPN في فرانكفورت لسبب لا علاقة له بذلك — تُعيد الواجهة البرمجية التصنيف نفسه في الحالتين، وهذا بالضبط سبب تصميمها كأحد مدخلات المراجعة، لا كحظر تلقائي.

ما لا يدَّعيه هذا المقال

يصف هذا تنفيذ الإصدار v1 الخاص بـ Watch-IP. وهو لا يدَّعي اكتشافًا شاملًا للاستيلاء على الحسابات، أو تحليلًا سلوكيًا، أو بصمة جهاز — فهذه تقنيات مختلفة لا تحاول نقطة النهاية هذه القيام بها. لم يُتحقَّق بعد من توفر هذه النقطة أو من فرض عائلة خطة مستقلة لها؛ تواصل معنا قبل الاعتماد عليها في بيئة الإنتاج.

المصادر

بقلم فريق التحرير في Watch-IP، بتاريخ 6 سبتمبر 2026. رُوجعت مقابل apps/api/src/lib/risk.ts وapps/api/src/durable-objects/session-risk.ts.

صفحات ذات صلة