ما هو تسريب WebRTC وكيف تمنعه؟
تقنية WebRTC تتيح للمتصفح مكالمات الصوت والفيديو ونقل البيانات مباشرة بين جهازين. ولكي تجد طريقاً بينهما تجمع عناوين جهازك، وتستطيع أي صفحة قراءتها بسطور قليلة من JavaScript. فإن خرجت هذه الطلبات خارج البروكسي أو النفق، رأت الصفحة عنوانك الحقيقي، وهذا هو تسريب WebRTC.
لماذا يجمع المتصفح عناوينك
الاتصال المباشر بين جهازين صعب، لأن أغلب الأجهزة تقف خلف ترجمة العناوين (NAT). لحل ذلك يعتمد WebRTC على بروتوكول ICE المعرّف في RFC 8445. يجمع البروتوكول «مرشّحين» (candidates)، أي عناوين ومنافذ قد يصل عبرها الطرف الآخر، ثم يجرّبها حتى ينجح أحدها.
- مرشّح المضيف (host). عنوان على إحدى واجهات الجهاز نفسه، ومنها الواجهات الافتراضية مثل واجهة VPN.
- المرشّح الانعكاسي (server reflexive). العنوان العام والمنفذ اللذان يراهما خادم STUN بعد أن يمر الطلب عبر NAT. يظهر في سطر المرشّح بالاختصار srflx.
- المرشّح المُرحَّل (relayed). عنوان يحجزه خادم ترحيل TURN، وتمر عبره البيانات حين يفشل الاتصال المباشر.
يعرف المتصفح عنوانه العام بطلب Binding يرسله إلى خادم STUN، على المنفذ 3478 عادةً. يعيد الخادم في رده خاصية XOR-MAPPED-ADDRESS، وفيها العنوان والمنفذ كما وصلا إليه، كما يصف RFC 8489.
ما الذي تفعله الصفحة
جمع العناوين لا يحتاج إلى مكالمة حقيقية. تكفي الصفحة أربع خطوات:
- تنشئ كائن RTCPeerConnection وتعطيه عنوان خادم STUN.
- تفتح قناة بيانات فارغة. لا يتطلب ذلك إذن الكاميرا أو الميكروفون، ولا يظهر للمستخدم أي تنبيه.
- تنشئ عرض اتصال (offer) وتضبطه وصفاً محلياً، فيبدأ المتصفح جمع المرشّحين.
- يصل كل مرشّح إلى الصفحة في حدث icecandidate، فترسله إلى خادمها مع بقية بيانات الزيارة.
لا تتصل الصفحة بأحد في النهاية، ولا تحتاج إلى ذلك. ما جمعته من عناوين هو كل ما تريده.
وفي مكالمة حقيقية تصل المرشّحات إلى الطرف الآخر أيضاً، لأنه يحتاجها ليتصل بك مباشرة. فمن تكلّمه عبر المتصفح قد يعرف عنوانك، ما لم يمر الاتصال عبر خادم ترحيل.
لماذا لا يحميك البروكسي من ذلك
إعدادات البروكسي في المتصفح تنقل طلبات HTTP وHTTPS، وهي تعمل فوق TCP. أما طلب STUN فيُرسل عبر UDP ويتبع جدول التوجيه في نظام التشغيل. فيخرج من اتصالك العادي، ويعود المرشّح الانعكاسي بعنوانك العام الحقيقي.
مع VPN للجهاز كله يختلف الأمر. يتبع طلب STUN المسار الافتراضي إلى النفق، فيعود بعنوان الخروج لا بعنوانك. ويبقى الخطر في تقسيم النفق، حين يمر جزء من الحركة خارجه.
يصف RFC 8828 هذه الحالة بأنها أهم مخاوف الخصوصية في WebRTC: قد يكتشف المتصفح العنوان العام للنفق وعنوان مزوّد الإنترنت معاً. ومرشّح المضيف قد يكشف عنوانك داخل الشبكة المحلية. لذلك تستبدل معظم المتصفحات الحديثة العنوان المحلي الخاص باسم عشوائي ينتهي بـ.local، ما لم تحصل الصفحة على إذن الكاميرا أو الميكروفون.
أوضاع التعامل مع العناوين
يعرّف RFC 8828 أربعة أوضاع يختار المتصفح بينها، من الأكثر كشفاً إلى الأكثر تحفظاً:
| الوضع | العناوين التي تُجمع | الأثر |
|---|---|---|
| الأول: تعداد كل العناوين | كل واجهات الجهاز | أفضل مسار للمكالمة وأكثر كشفاً، ويتطلب موافقة المستخدم |
| الثاني: المسار الافتراضي مع عناوينه المحلية | واجهة المسار الافتراضي وعناوينها الخاصة | الوضع المقترح حين لا توجد موافقة |
| الثالث: المسار الافتراضي فقط | ما يكتشفه STUN وTURN عبر المسار الافتراضي | يخفي العناوين الخاصة، وقد تمر البيانات عبر خادم ترحيل |
| الرابع: فرض البروكسي | لا شيء خارج البروكسي حين يكون للمتصفح بروكسي | تمر الوسائط عبر البروكسي، وإن لم يدعم UDP انتقلت إلى TCP بجودة أقل |
في كروم وإيدج تستطيع الإضافات ضبط هذا السلوك عبر الإعداد webRTCIPHandlingPolicy في واجهة الخصوصية للإضافات. ومن قيمه disable_non_proxied_udp، التي تمنع UDP لا يمر بالبروكسي.
كيف تفحص متصفحك بنفسك
افتح أدوات المطوّر بالمفتاح F12 في أي صفحة، ثم الصق هذه الأسطر في لوحة Console:
const pc = new RTCPeerConnection({ iceServers: [{ urls: "stun:stun.l.google.com:19302" }] });
pc.createDataChannel("");
pc.onicecandidate = (e) => { if (e.candidate) console.log(e.candidate.candidate); };
pc.createOffer().then((offer) => pc.setLocalDescription(offer));
- يطبع كل سطر مرشّحاً واحداً. ابحث عن السطر الذي فيه typ srflx.
- العنوان الذي يسبق رقم المنفذ في ذلك السطر هو عنوانك العام كما رآه خادم STUN.
- قارنه بالعنوان الذي تعرضه أداة عنوانك. إن اختلفا وكان الأول عنوان مزوّدك، فالمتصفح يسرّب.
يتبع كل سطر صيغة ثابتة يحدّدها RFC 8839. هذا مثال بعناوين مخصّصة للتوثيق:
candidate:2 1 udp 1694498815 192.0.2.3 45664 typ srflx raddr 0.0.0.0 rport 0
- الحقول الأولى. معرّف المجموعة 2، ثم رقم المكوّن 1، ثم بروتوكول النقل، ثم أولوية المرشّح.
- العنوان والمنفذ. 192.0.2.3 و45664، وهما ما يهمك في الفحص.
- النوع. بعد الكلمة typ يأتي host أو srflx أو prflx أو relay.
- العنوان المرتبط. بعد raddr يأتي العنوان المحلي الذي خرج منه الطلب، وقد يضع المتصفح 0.0.0.0 مكانه ليخفيه.
غياب سطر srflx يعني أن المتصفح يمنع الطلب أو أن UDP محجوب في شبكتك. وسطر typ host بعنوان ينتهي بـ.local يعني أن المتصفح يخفي عنوانك المحلي.
كيف تمنع التسريب
- اجعل الاتصال للجهاز كله. لا تُخرج المتصفح من النفق بتقسيمه، فيمر STUN عبر النفق كبقية الحركة.
- اضبط سياسة WebRTC مع بروكسي المتصفح. إن كان البروكسي في المتصفح وحده، فاستخدم إضافة موثوقة تمنع UDP الذي لا يمر به.
- في فايرفوكس. الإعداد media.peerconnection.enabled بالقيمة false في صفحة about:config يعطّل WebRTC كلها.
- انتبه لإذن الكاميرا والميكروفون. امنحه للمواقع التي تثق بها فقط، لأن الإذن يرفع إخفاء العناوين المحلية.
- افحص بعد كل تحديث. تحديث المتصفح أو الإضافة قد يغيّر الإعداد دون أن تلاحظ.
لكل حل ثمن. منع UDP المباشر يجعل المكالمات تمر عبر خادم ترحيل أو عبر TCP، فيزيد التأخير قليلاً.
WebRTC في syriaproxy
إضافتنا لكروم وإيدج تضبط WebRTC بحيث لا يكشف العنوان الحقيقي، وطريقة تثبيتها في إعداد الإضافة. أما تطبيقات أندرويد وويندوز ولينكس، وWireGuard على آيفون وآيباد وماك، فتنقل حركة الجهاز كله، ومعها طلبات STUN.
أسئلة شائعة
هل يحدث التسريب على الهاتف أيضاً؟
نعم، فمتصفحات الهاتف تدعم WebRTC كذلك. ومعظمها لا يقبل الإضافات، فالحماية هناك اتصال يغطي الجهاز كله.
هل التسريب خلل في المتصفح؟
لا، هو جزء من تصميم التقنية، لأن معرفة العناوين شرط للاتصال المباشر. لذلك تعالجه المتصفحات بأوضاع وإعدادات، لا بإصلاح.
هل الأفضل تعطيل WebRTC تماماً؟
التعطيل يمنع التسريب، لكنه يوقف مكالمات الفيديو ومشاركة الشاشة في المتصفح وبعض أدوات العمل. ضبط السياسة أخف أثراً لمن يحتاج المكالمات.
ماذا يعرف الموقع من العنوان المسرَّب؟
مزوّد الإنترنت والبلد، وأحياناً المدينة، كما تعرض أداة البحث عن عنوان IP. ويكفي اختلافه عن عنوان البروكسي ليعرف الموقع أن الاتصال يمر ببروكسي.
افحص متصفحك الآن بأداة فحص تسريب WebRTC المجانية.